diff --git a/.azure-pipelines/matrix.yml b/.azure-pipelines/matrix.yml deleted file mode 100644 index 4269e7bebe..0000000000 --- a/.azure-pipelines/matrix.yml +++ /dev/null @@ -1,91 +0,0 @@ -parameters: - os : ['ubuntu-latest'] - py_vers: ['3.8'] - test: ['tests/em', - 'tests/base tests/flow tests/seis tests/utils tests/meta', - 'tests/docs -s -v', - 'tests/examples/test_examples_1.py', - 'tests/examples/test_examples_2.py', - 'tests/examples/test_examples_3.py', - 'tests/examples/test_tutorials_1.py tests/examples/test_tutorials_2.py', - 'tests/examples/test_tutorials_3.py', - 'tests/pf', - 'tests/dask', # This must be ran on it's own to avoid modifying the code from any other tests. - ] - -jobs: - - ${{ each os in parameters.os }}: - - ${{ each py_vers in parameters.py_vers }}: - - ${{ each test in parameters.test }}: - - job: - displayName: ${{ os }}_${{ py_vers }}_${{ test }} - pool: - vmImage: ${{ os }} - timeoutInMinutes: 120 - steps: - - # Checkout simpeg repo, including tags. - # We need to sync tags and disable shallow depth in order to get the - # SimPEG version while building the docs. - - checkout: self - fetchDepth: 0 - fetchTags: true - displayName: Checkout repository (including tags) - - - script: | - wget -O Mambaforge.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" - bash Mambaforge.sh -b -p "${HOME}/conda" - displayName: Install mamba - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - source "${HOME}/conda/etc/profile.d/mamba.sh" - cp environment_test.yml environment_test_with_pyversion.yml - echo " - python="${{ py_vers }} >> environment_test_with_pyversion.yml - mamba env create -f environment_test_with_pyversion.yml - rm environment_test_with_pyversion.yml - conda activate simpeg-test - pip install pytest-azurepipelines - echo "\nList installed packages" - conda list - displayName: Create Anaconda testing environment - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - pip install -e . - displayName: Build package - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - python -c "import simpeg; print(simpeg.__version__)" - displayName: Check SimPEG version - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - export KMP_WARNINGS=0 - pytest ${{ test }} -v --cov-config=.coveragerc --cov=simpeg --cov-report=xml --cov-report=html -W ignore::DeprecationWarning - displayName: 'Testing ${{ test }}' - - - task: PublishPipelineArtifact@1 - inputs: - targetPath: $(Build.SourcesDirectory)/docs/_build/html - artifactName: html_docs - displayName: 'Publish documentation artifact' - condition: eq('${{ test }}', 'tests/docs -s -v') - - - script: | - curl -Os https://uploader.codecov.io/latest/linux/codecov - chmod +x codecov - ./codecov --sha $(system.pullRequest.sourceCommitId) - displayName: 'Upload PR coverage to codecov.io' - condition: and(eq(${{ py_vers }}, '3.8'), startsWith(variables['build.sourceBranch'], 'refs/pull/')) - - - script: | - curl -Os https://uploader.codecov.io/latest/linux/codecov - chmod +x codecov - ./codecov - displayName: 'Upload coverage to codecov.io' - condition: and(eq(${{ py_vers }}, '3.8'), not(startsWith(variables['build.sourceBranch'], 'refs/pull/'))) diff --git a/.ci/azure/codecov.yml b/.ci/azure/codecov.yml new file mode 100644 index 0000000000..47ee05929b --- /dev/null +++ b/.ci/azure/codecov.yml @@ -0,0 +1,36 @@ +jobs: + - job: + pool: + vmImage: "ubuntu-latest" + displayName: Upload to Codecov + steps: + # Checkout simpeg repo. Codecov needs the repo in the file system for + # uploading coverage reports. + - checkout: self + displayName: "Checkout repository" + + - task: DownloadPipelineArtifact@2 + inputs: + patterns: "coverage-*/coverage-*.xml" + displayName: "Download coverage artifacts" + + - bash: ls -la $(Pipeline.Workspace)/coverage-*/coverage-*.xml + displayName: "List downloaded coverage artifacts" + + - bash: | + cp $(Pipeline.Workspace)/coverage-*/coverage-*.xml . + ls -la + displayName: "Copy coverage files" + + - bash: | + curl -Os https://uploader.codecov.io/latest/linux/codecov + chmod +x codecov + displayName: "Install codecov cli" + + - bash: | + cc_file_args=() + for report in coverage-*.xml; do + cc_file_args+=( " --file " "$report" ) + done + ./codecov --verbose upload-process "$cc_file_args" + displayName: "Upload coverage to codecov.io" diff --git a/.ci/azure/deploy-dev-docs.sh b/.ci/azure/deploy-dev-docs.sh new file mode 100755 index 0000000000..8aa097618c --- /dev/null +++ b/.ci/azure/deploy-dev-docs.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# Push built docs to dev branch in simpeg-docs repository + +set -ex #echo on and exit if any line fails + +# --------------------------- +# Push new docs to dev branch +# --------------------------- +# Capture hash of last commit in simpeg +commit=$(git rev-parse --short HEAD) + +# Clone the repo where we store the documentation (dev branch) +git clone -q --branch dev --depth 1 "https://${GH_TOKEN}@github.com/simpeg/simpeg-docs.git" +cd simpeg-docs + +# Remove all files (but .git folder) +find . -not -path "./.git/*" -not -path "./.git" -delete + +# Copy the built docs to the root of the repo +cp -r "$BUILD_SOURCESDIRECTORY"/docs/_build/html/. -t . + +# Add new files +git add . + +# List files in working directory and show git status +ls -la +git status + +# Commit the new docs. Amend to avoid having a very large history. +message="Azure CI deploy dev from ${commit}" +echo -e "\nAmending last commit:" +git commit --amend --reset-author -m "$message" + +# Make the push quiet just in case there is anything that could +# leak sensitive information. +echo -e "\nPushing changes to simpeg/simpeg-docs (dev branch)." +git push -fq origin dev 2>&1 >/dev/null +echo -e "\nFinished uploading doc files." + +# ---------------- +# Update submodule +# ---------------- +# Need to fetch the gh-pages branch first (because we clone with shallow depth) +git fetch --depth 1 origin gh-pages:gh-pages + +# Switch to the gh-pages branch +git switch gh-pages + +# Update the dev submodule +git submodule update --init --recursive --remote dev + +# Add updated submodule +git add dev + +# List files in working directory and show git status +ls -la +git status + +# Commit changes +message="Azure CI update dev submodule from ${commit}" +echo -e "\nMaking a new commit:" +git commit -m "$message" + +# Make the push quiet just in case there is anything that could +# leak sensitive information. +echo -e "\nPushing changes to simpeg/simpeg-docs (gh-pages branch)." +git push -q origin gh-pages 2>&1 >/dev/null +echo -e "\nFinished updating submodule dev." diff --git a/.ci/azure/deploy-release-docs.sh b/.ci/azure/deploy-release-docs.sh new file mode 100755 index 0000000000..2f1650af1c --- /dev/null +++ b/.ci/azure/deploy-release-docs.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +# Push built docs to gh-pages branch in simpeg-docs repository + +set -ex #echo on and exit if any line fails + +# Capture simpeg version +version=$(git tag --points-at HEAD) +if [[ -z $version ]]; then +echo "Version could not be obtained from tag. Exiting." +exit 1 +fi + +# Capture hash of last commit in simpeg +commit=$(git rev-parse --short HEAD) + +# Clone the repo where we store the documentation +git clone -q --branch gh-pages --depth 1 "https://${GH_TOKEN}@github.com/simpeg/simpeg-docs.git" +cd simpeg-docs + +# Move the built docs to a new dev folder +cp -r "$BUILD_SOURCESDIRECTORY/docs/_build/html" "$version" +cp "$BUILD_SOURCESDIRECTORY/docs/README.md" . + +# Add .nojekyll if missing +touch .nojekyll + +# Update latest symlink +rm -f latest +ln -s "$version" latest + +# Add new docs and relevant files +git add "$version" README.md .nojekyll latest + +# List files in working directory and show git status +ls -la +git status + +# Commit the new docs. +message="Azure CI deploy ${version} from ${commit}" +echo -e "\nMaking a new commit:" +git commit -m "$message" + +# Make the push quiet just in case there is anything that could +# leak sensitive information. +echo -e "\nPushing changes to simpeg/simpeg-docs." +git push -fq origin gh-pages 2>&1 >/dev/null +echo -e "\nFinished uploading generated files." diff --git a/.ci/azure/docs.yml b/.ci/azure/docs.yml new file mode 100644 index 0000000000..d2b976d8b5 --- /dev/null +++ b/.ci/azure/docs.yml @@ -0,0 +1,112 @@ +jobs: + # Build docs only on scheduled jobs or on a relase + - job: BuildDocs + condition: or(eq(variables['Build.Reason'], 'Schedule'), startsWith(variables['build.sourceBranch'], 'refs/tags/')) + pool: + vmImage: ubuntu-latest + variables: + python.version: "3.10" + timeoutInMinutes: 240 + steps: + # Checkout simpeg repo. + # Sync tags and disable shallow depth to get the SimPEG version. + - checkout: self + fetchDepth: 0 + fetchTags: true + displayName: Checkout repository (including tags) + + - bash: echo "##vso[task.prependpath]$CONDA/bin" + displayName: Add conda to PATH + + - bash: .ci/azure/setup_env.sh + displayName: Setup SimPEG environment + + - bash: | + source activate simpeg-test + make -C docs html + displayName: Building documentation + + - task: PublishPipelineArtifact@1 + inputs: + targetPath: $(Build.SourcesDirectory)/docs/_build/html + artifactName: built-docs + displayName: "Upload docs as artifact" + + - job: DeployRelease + dependsOn: BuildDocs + condition: startsWith(variables['build.sourceBranch'], 'refs/tags/') + pool: + vmImage: ubuntu-latest + timeoutInMinutes: 240 + steps: + # Checkout simpeg repo. + # Sync tags and disable shallow depth to get the SimPEG version. + - checkout: self + fetchDepth: 0 + fetchTags: true + displayName: Checkout repository (including tags) + + - bash: | + git config --global user.name ${GH_NAME} + git config --global user.email ${GH_EMAIL} + git config --list | grep user. + displayName: "Configure git" + env: + GH_NAME: $(gh.name) + GH_EMAIL: $(gh.email) + + - bash: | + mkdir -p docs/_build/html + displayName: "Create directory for built docs" + + - task: DownloadPipelineArtifact@2 + inputs: + artifact: built-docs + targetPath: docs/_build/html + displayName: "Download docs artifact" + + # Upload release build of the docs to gh-pages branch in simpeg/simpeg-docs + - bash: .ci/azure/deploy-release-docs.sh + displayName: Push documentation to simpeg-docs + env: + GH_TOKEN: $(gh.token) + + - job: DeployDev + dependsOn: BuildDocs + condition: eq(variables['Build.Reason'], 'Schedule') # run only scheduled triggers + pool: + vmImage: ubuntu-latest + timeoutInMinutes: 240 + steps: + # Checkout simpeg repo. + # Sync tags and disable shallow depth to get the SimPEG version. + - checkout: self + fetchDepth: 0 + fetchTags: true + displayName: Checkout repository (including tags) + + - bash: | + git config --global user.name ${GH_NAME} + git config --global user.email ${GH_EMAIL} + git config --list | grep user. + displayName: "Configure git" + env: + GH_NAME: $(gh.name) + GH_EMAIL: $(gh.email) + + - bash: | + mkdir -p docs/_build/html + displayName: "Create directory for built docs" + + - task: DownloadPipelineArtifact@2 + inputs: + artifact: built-docs + targetPath: docs/_build/html + displayName: "Download docs artifact" + + # Upload dev build of the docs to a dev branch in simpeg/simpeg-docs + # and update submodule in the gh-pages branch + - bash: .ci/azure/deploy-dev-docs.sh + displayName: Push documentation to simpeg-docs (dev branch) + env: + GH_TOKEN: $(gh.token) diff --git a/.ci/azure/pypi.yml b/.ci/azure/pypi.yml new file mode 100644 index 0000000000..c6eaa93dad --- /dev/null +++ b/.ci/azure/pypi.yml @@ -0,0 +1,83 @@ +jobs: + - job: Build + pool: + vmImage: ubuntu-latest + steps: + # Checkout simpeg repo. + # Sync tags and disable shallow depth to get the SimPEG version. + - checkout: self + fetchDepth: 0 + fetchTags: true + displayName: "Checkout repository (including tags)" + + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.10" + displayName: "Setup Python" + + - bash: | + pip install build twine + displayName: "Install build dependencies" + + - bash: | + # Change setuptools-scm local_scheme to "no-local-version" so the + # local part of the version isn't included, making the version string + # compatible with Test PyPI. Only do this when building for TestPyPI. + sed --in-place 's/node-and-date/no-local-version/g' pyproject.toml + condition: not(startsWith(variables['build.sourceBranch'], 'refs/tags/')) + displayName: "Configure local_scheme (except on release)" + + - bash: | + python -m build --sdist . + displayName: "Create source distribution for simpeg" + + - bash: | + twine check dist/* + displayName: "Check the source distribution" + + - task: PublishPipelineArtifact@1 + inputs: + targetPath: $(Build.SourcesDirectory)/dist + artifactName: pypi-dist + displayName: "Upload dist as artifact" + + - job: Deploy + dependsOn: Build + condition: or(startsWith(variables['build.sourceBranch'], 'refs/tags/'), eq(variables['Build.Reason'], 'Schedule')) + pool: + vmImage: ubuntu-latest + steps: + - checkout: none + + - task: DownloadPipelineArtifact@2 + inputs: + artifact: pypi-dist + targetPath: dist + displayName: "Download dist artifact" + + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.10" + displayName: "Setup Python" + + - bash: | + pip install twine + displayName: "Install twine" + + # Push to TestPyPI (only on push to main) + - bash: | + twine upload --repository testpypi dist/* + displayName: "Upload to TestPyPI" + condition: eq(variables['Build.Reason'], 'Schedule') + env: + TWINE_USERNAME: $(twine.username) + TWINE_PASSWORD: $(test.twine.password) + + # Push to PyPI (only on release) + - bash: | + twine upload --skip-existing dist/* + displayName: "Upload to PyPI" + condition: startsWith(variables['build.sourceBranch'], 'refs/tags/') + env: + TWINE_USERNAME: $(twine.username) + TWINE_PASSWORD: $(twine.password) diff --git a/.ci/azure/run_tests_with_coverage.sh b/.ci/azure/run_tests_with_coverage.sh new file mode 100755 index 0000000000..a975c1daef --- /dev/null +++ b/.ci/azure/run_tests_with_coverage.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -x #echo on + +source activate simpeg-test +pytest $TEST_TARGET --cov --cov-config=pyproject.toml -v -W ignore::DeprecationWarning +pytest_retval=$? +coverage xml +exit $pytest_retval \ No newline at end of file diff --git a/.ci/azure/setup_env.sh b/.ci/azure/setup_env.sh new file mode 100755 index 0000000000..8d873a601d --- /dev/null +++ b/.ci/azure/setup_env.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -ex #echo on and exit if any line fails + +# TF_BUILD is set to True on azure pipelines. +is_azure=$(${TF_BUILD:-false} | tr '[:upper:]' '[:lower:]') + +if ${is_azure} +then + conda update --yes -n base conda +fi + +cp .ci/environment_test.yml environment_test_with_pyversion.yml +echo " - python="$PYTHON_VERSION >> environment_test_with_pyversion.yml + +conda env create --file environment_test_with_pyversion.yml +rm environment_test_with_pyversion.yml + + +if ${is_azure} +then + source activate simpeg-test + pip install pytest-azurepipelines +else + conda activate simpeg-test +fi + +pip install --no-deps --editable . + +echo "Conda Environment:" +conda list + +echo "Installed SimPEG version:" +python -c "import simpeg; print(simpeg.__version__)" \ No newline at end of file diff --git a/.ci/azure/style.yml b/.ci/azure/style.yml new file mode 100644 index 0000000000..59e6334475 --- /dev/null +++ b/.ci/azure/style.yml @@ -0,0 +1,41 @@ +jobs: + - job: + displayName: Run style checks with Black + pool: + vmImage: ubuntu-latest + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.11" + - bash: .ci/install_style.sh + displayName: "Install dependencies to run the checks" + - script: make black + displayName: "Run black" + + - job: + displayName: Run (permissive) style checks with flake8 + pool: + vmImage: ubuntu-latest + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.11" + - bash: .ci/install_style.sh + displayName: "Install dependencies to run the checks" + - script: make flake + displayName: "Run flake8" + + - job: + displayName: Run style checks with flake8 (allowed to fail) + pool: + vmImage: ubuntu-latest + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.11" + - bash: .ci/install_style.sh + displayName: "Install dependencies to run the checks" + - script: make flake-all + displayName: "Run flake8" + env: + FLAKE8_OPTS: "--exit-zero" diff --git a/.ci/azure/test.yml b/.ci/azure/test.yml new file mode 100644 index 0000000000..fe6bfebe2b --- /dev/null +++ b/.ci/azure/test.yml @@ -0,0 +1,68 @@ +parameters: + os : ['ubuntu-latest'] + py_vers: ['3.10'] + test: ['tests/em', + 'tests/base tests/flow tests/seis tests/utils', + 'tests/meta', + 'tests/docs -s -v', + 'tests/examples/test_examples_1.py', + 'tests/examples/test_examples_2.py', + 'tests/examples/test_examples_3.py', + 'tests/examples/test_tutorials_1.py tests/examples/test_tutorials_2.py', + 'tests/examples/test_tutorials_3.py', + 'tests/pf', + 'tests/dask', # This code must be tested on its own to avoid modifying the implementation for any other tests. + ] + +jobs: + - ${{ each os in parameters.os }}: + - ${{ each py_vers in parameters.py_vers }}: + - ${{ each test in parameters.test }}: + - job: + displayName: ${{ os }}_${{ py_vers }}_${{ test }} + pool: + vmImage: ${{ os }} + timeoutInMinutes: 120 + variables: + python.version: ${{ py_vers }} + test.target: ${{ test }} + steps: + + # Checkout simpeg repo, including tags. + # We need to sync tags and disable shallow depth in order to get the + # SimPEG version while building the docs. + - checkout: self + fetchDepth: 0 + fetchTags: true + displayName: Checkout repository (including tags) + + - bash: echo "##vso[task.prependpath]$CONDA/bin" + displayName: Add conda to PATH + + - bash: .ci/azure/setup_env.sh + displayName: Setup SimPEG environment + + - bash: .ci/azure/run_tests_with_coverage.sh + displayName: 'Testing ${{ test }}' + + - task: PublishPipelineArtifact@1 + inputs: + targetPath: $(Build.SourcesDirectory)/docs/_build/html + artifactName: html_docs + displayName: 'Publish documentation artifact' + condition: and(eq('${{ test }}', 'tests/docs -s -v'), succeededOrFailed()) + + - bash: | + job="${{ os }}_${{ py_vers }}_${{ test }}" + jobhash=$(echo $job | sha256sum | cut -f 1 -d " " | cut -c 1-7) + cp coverage.xml "coverage-$jobhash.xml" + echo "##vso[task.setvariable variable=jobhash]$jobhash" + condition: succeededOrFailed() + displayName: 'Rename coverage report' + + - task: PublishPipelineArtifact@1 + inputs: + targetPath: $(Build.SourcesDirectory)/coverage-$(jobhash).xml + artifactName: coverage-$(jobhash) + condition: succeededOrFailed() + displayName: 'Publish coverage artifact' diff --git a/.ci/environment_test.yml b/.ci/environment_test.yml new file mode 100644 index 0000000000..e1ca51a0a4 --- /dev/null +++ b/.ci/environment_test.yml @@ -0,0 +1,46 @@ +name: simpeg-test +channels: + - conda-forge +dependencies: + - numpy>=1.22 + - scipy>=1.8 + - pymatsolver>=0.3 + - matplotlib-base + - discretize>=0.11 + - geoana>=0.7 + - libdlf + +# optional dependencies + - dask + - zarr + - fsspec>=0.3.3 + - choclo>=0.3.0 + - scooby + - plotly + - scikit-learn>=1.2 + - pandas + +# documentation building + - sphinx + - sphinx-gallery>=0.1.13 + - sphinxcontrib-apidoc + - pydata-sphinx-theme + - nbsphinx + - numpydoc + - pillow + - empymod>=2.0.0 + - sympy + - memory_profiler + - python-kaleido + - h5py + +# testing + - pytest + - pytest-cov + +# Testing environment doesn't need style checkers + +# PyPI uploading + - wheel + - twine + - build diff --git a/.ci/install_style.sh b/.ci/install_style.sh new file mode 100755 index 0000000000..b26211ad95 --- /dev/null +++ b/.ci/install_style.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -ex #echo on and exit if any line fails + +# get directory of this script +script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +style_script=$script_dir/parse_style_requirements.py + +# parse the style requirements +requirements=$(python $style_script) + +pip install $requirements + diff --git a/.ci/parse_style_requirements.py b/.ci/parse_style_requirements.py new file mode 100644 index 0000000000..8183280b78 --- /dev/null +++ b/.ci/parse_style_requirements.py @@ -0,0 +1,12 @@ +import tomllib +import pathlib + +root_dir = pathlib.Path(__file__).parent.parent.resolve() +pyproject_file = root_dir / "pyproject.toml" + +with open(pyproject_file, "rb") as f: + pyproject = tomllib.load(f) + +style_requirements = pyproject["project"]["optional-dependencies"]["style"] +for req in style_requirements: + print(req) diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index a79c8987f3..0000000000 --- a/.coveragerc +++ /dev/null @@ -1,4 +0,0 @@ -[run] -source = simpeg -omit = - */setup.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 14d1e5f416..0000000000 --- a/.flake8 +++ /dev/null @@ -1,125 +0,0 @@ -# ----------------------------- -# Configuration file for flake8 -# ----------------------------- - -# Configure flake8 -# ---------------- -[flake8] -extend-ignore = - # Default ignores by flake (added here for when ignore gets overwritten) - E121,E123,E126,E226,E24,E704,W503,W504, - # Too many leading '#' for block comment - E266, - # Line too long (82 > 79 characters) - E501, - # Do not use variables named 'I', 'O', or 'l' - E741, - # Line break before binary operator (conflicts with black) - W503, - # Ignore spaces before a colon (Black handles it) - E203, -exclude = - .git, - __pycache__, - .ipynb_checkpoints, - setup.py, - docs/conf.py, - docs/_build/, -per-file-ignores = - # disable unused-imports errors on __init__.py - __init__.py: F401 -exclude-from-doctest = - # Don't check style in docstring of test functions - tests -# Define flake rules that will be ignored for now. Every time a new warning is -# solved througout the entire project, it should be removed to this list. -ignore = - # assertRaises(Exception): should be considered evil - B017, - # Missing docstring in public module - D100, - # Missing docstring in public class - D101, - # Missing docstring in public method - D102, - # Missing docstring in public function - D103, - # Missing docstring in public package - D104, - # Missing docstring in magic method - D105, - # Missing docstring in __init__ - D107, - # One-line docstring should fit on one line with quotes - D200, - # No blank lines allowed before function docstring - D201, - # No blank lines allowed after function docstring - D202, - # 1 blank line required between summary line and description - D205, - # Docstring is over-indented - D208, - # Multi-line docstring closing quotes should be on a separate line - D209, - # No whitespaces allowed surrounding docstring text - D210, - # No blank lines allowed before class docstring - D211, - # Use """triple double quotes""" - D300, - # First line should end with a period - D400, - # First line should be in imperative mood; try rephrasing - D401, - # First line should not be the function's "signature" - D402, - # First word of the first line should be properly capitalized - D403, - # No blank lines allowed between a section header and its content - D412, - # Section has no content - D414, - # Docstring is empty - D419, - # module level import not at top of file - E402, - # undefined name %r - F821, - # Block quote ends without a blank line; unexpected unindent. - RST201, - # Definition list ends without a blank line; unexpected unindent. - RST203, - # Field list ends without a blank line; unexpected unindent. - RST206, - # Inline strong start-string without end-string. - RST210, - # Title underline too short. - RST212, - # Inline emphasis start-string without end-string. - RST213, - # Inline interpreted text or phrase reference start-string without end-string. - RST215, - # Inline substitution_reference start-string without end-string. - RST219, - # Unexpected indentation. - RST301, - # Unknown directive type "*". - RST303, - # Unknown interpreted text role "*". - RST304, - # Error in "*" directive: - RST307, - # Previously unseen severe error, not yet assigned a unique code. - RST499, - - -# Configure flake8-rst-docstrings -# ------------------------------- -# Add some roles used in our docstrings -rst-roles = - class, - func, - mod, - meth, - ref, diff --git a/.git_archival.txt b/.git_archival.txt new file mode 100644 index 0000000000..b1a286bbb6 --- /dev/null +++ b/.git_archival.txt @@ -0,0 +1,4 @@ +node: $Format:%H$ +node-date: $Format:%cI$ +describe-name: $Format:%(describe:tags=true,match=*[0-9]*)$ +ref-names: $Format:%D$ \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..82bf71c1c5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +.git_archival.txt export-subst \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/post-install.yml b/.github/ISSUE_TEMPLATE/post-install.yml index 10b970aebf..5a86f2f0b1 100644 --- a/.github/ISSUE_TEMPLATE/post-install.yml +++ b/.github/ISSUE_TEMPLATE/post-install.yml @@ -9,7 +9,8 @@ body: label: "Steps to reproduce:" description: > Please describe the installation method (e.g. building from source, - Anaconda, pip), your OS and SimPEG, NumPy, Scipy, and Python version information. + Miniforge, Anaconda, pip), your OS and SimPEG, NumPy, Scipy, and Python + version information. placeholder: | If running in a conda environment you could paste the output of `conda list` here. validations: diff --git a/.github/ISSUE_TEMPLATE/release-checklist.md b/.github/ISSUE_TEMPLATE/release-checklist.md index 543bdb1fdd..33a3c64690 100644 --- a/.github/ISSUE_TEMPLATE/release-checklist.md +++ b/.github/ISSUE_TEMPLATE/release-checklist.md @@ -6,8 +6,6 @@ labels: "maintenance" assignees: "" --- - - **Target date:** YYYY/MM/DD ## Generate release notes @@ -28,9 +26,7 @@ assignees: "" grep -Eo "@[[:alnum:]-]+" notes.rst | sort -u | sed -E 's/^/* /' ``` Paste the list into the file under a new `Contributors` category. -- [ ] Check if every contributor that participated in the release is in the - list. Generate a list of authors and co-authors from the git log with (update - the `last_release`): +- [ ] Check if every contributor that participated in the release is in the list. Generate a list of authors and co-authors from the git log with (update the `last_release`): ```bash export last_release="v0.20.0" git shortlog HEAD...$last_release -sne > contributors @@ -41,14 +37,11 @@ assignees: "" ```bash sed -Ei 's/@([[:alnum:]-]+)/`@\1 `__/' notes.rst ``` -- [ ] Copy the content of `notes.rst` to a new file - `docs/content/release/-notes.rst`. -- [ ] Edit the release notes file, following the template below and the - previous release notes. +- [ ] Copy the content of `notes.rst` to a new file `docs/content/release/-notes.rst`. +- [ ] Edit the release notes file, following the template below and the previous release notes. - [ ] Add the new release notes to the list in `docs/content/release/index.rst`. - [ ] **Open a PR** with the new release notes. -- [ ] Manually view the built documentation by downloading the Azure `html_doc` - artifact and check for formatting and errors. +- [ ] Manually view the built documentation by downloading the Azure `html_doc` artifact and check for formatting and errors.
@@ -114,13 +107,12 @@ Pull Requests Edit the `docs/_static/versions.json` file and: -- [ ] Add an entry for the new version. -- [ ] Move the line with `"name":` to the new entry (so the new version is set - as the _latest_ one). -- [ ] Update the version number in the `"name":` line. -- [ ] Run `cat docs/_static/versions.json | python -m json.tool > /dev/null` to - check if the syntax of the JSON file is correct. If no errors are prompted, - then your file is OK. +- [ ] Add an entry for the new version (below dev, above the current _latest_). +- [ ] Make sure to set the new the version number in every field in the new entry. +- [ ] Mark the new version as the `latest`, and remove `latest` from the previous one. +- [ ] Set the new version as the `preferred` one. +- [ ] Remove the `preferred` line from the older version. +- [ ] Run `cat docs/_static/versions.json | python -m json.tool > /dev/null` to check if the syntax of the JSON file is correct. If no errors are prompted, then your file is OK. - [ ] Double-check the changes. - [ ] Commit the changes to the same branch. @@ -130,39 +122,30 @@ Edit the `docs/_static/versions.json` file and: ## Make the new release -- [ ] Draft a new GitHub Release +- [ ] Draft a new GitHub Release. - [ ] Create a new tag for it (the version number with a leading `v`). -- [ ] Target the release on `main` or on a particular commit from `main` +- [ ] Target the release on `main` or on a particular commit from `main`. - [ ] Generate release notes automatically. -- [ ] Publish the release +- [ ] Publish the release. ## Extra tasks -After publishing the release, Azure will automatically push the new version to -PyPI, and build and deploy the docs. You can check the progress of these tasks -in: https://dev.azure.com/simpeg/simpeg/_build +After publishing the release, Azure will automatically push the new version to PyPI, and build and deploy the docs. You can check the progress of these tasks in: https://dev.azure.com/simpeg/simpeg/_build . After they finish: -- [ ] Check the new version is available in PyPI: https://pypi.org/project/SimPEG/ +- [ ] Check the new version is available in PyPI: https://pypi.org/project/SimPEG/ . - [ ] Check the new documentation is online: https://docs.simpeg.xyz -For the new version to be available in conda-forge, we need to update the -[conda-forge/simpeg-feedstock](https://github.com/conda-forge/simpeg-feedstock) -repository. Within the same day of the release a new PR will be automatically -open in that repository. So: +For the new version to be available in conda-forge, we need to update the [conda-forge/simpeg-feedstock](https://github.com/conda-forge/simpeg-feedstock) repository. Within the same day of the release a new PR will be automatically open in that repository. So: - [ ] Follow the steps provided in the checklist in that PR and merge it. - [ ] Make sure the new version is available through conda-forge: https://anaconda.org/conda-forge/simpeg -Lastly, we would need to update the SimPEG version used in -[`simpeg/user-tutorials`](https://github.com/simpeg/user-tutorials) and rerun -its notebooks: +Lastly, we would need to update the SimPEG version used in [`simpeg/user-tutorials`](https://github.com/simpeg/user-tutorials) and rerun its notebooks: -- [ ] Open issue in - [`simpeg/user-tutorials`](https://github.com/simpeg/user-tutorials) for - rerunning the notebooks using the new released version of SimPEG +- [ ] Open issue in [`simpeg/user-tutorials`](https://github.com/simpeg/user-tutorials) for rerunning the notebooks using the new released version of SimPEG. Finally: -- [ ] Close this issue +- [ ] Close this issue. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c6b74e7c19..cd17e1eb9a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -18,10 +18,10 @@ Feel free to remove lines from this template that do not apply to you pull reque #### PR Checklist * [ ] If this is a work in progress PR, set as a Draft PR -* [ ] Linted my code according to the [style guides](https://docs.simpeg.xyz/content/getting_started/contributing/code-style.html). -* [ ] Added [tests](https://docs.simpeg.xyz/content/getting_started/practices.html#testing) to verify changes to the code. +* [ ] Linted my code according to the [style guides](https://docs.simpeg.xyz/latest/content/getting_started/contributing/code-style.html). +* [ ] Added [tests](https://docs.simpeg.xyz/latest/content/getting_started/contributing/testing.html) to verify changes to the code. * [ ] Added necessary documentation to any new functions/classes following the - expect [style](https://docs.simpeg.xyz/content/getting_started/practices.html#documentation). + expect [style](https://docs.simpeg.xyz/latest/content/getting_started/contributing/documentation.html). * [ ] Marked as ready for review (if this is was a draft PR), and converted to a Pull Request * [ ] Tagged ``@simpeg/simpeg-developers`` when ready for review. diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0151372c8d..3052116a35 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,13 +1,54 @@ name : Reviewdog PR Annotations -on: [pull_request_target] + +# ========= +# IMPORTANT +# ========= +# +# TL;DR: +# THIS ACTION SHOULD NOT RUN ANY CODE FROM THE PR BRANCH. +# +# This action is triggered after new events in Pull Requests (as the +# `pull_request` trigger does), but this ones provides the workflow writing +# permissions to the repo. +# The second checkout step in each job checks out code from the PR branch. +# Code from any PR branch should be treated as malicious! +# Therefore, these action **SHOULD NOT RUN ANY CODE** from the PR branch since +# the workflow has writting permisions. +# Doing so introduces a high severity vulnerability that could be exploited to +# gain access to secrets and/or introduce malicious code. +# +# For this particular workflow we need the writting permission in order for +# reviewdog to publish comments in the PR. +# zizmor will complain about the `pull_request_target` trigger, so we will +# ignore it. +# +# Worth noting that the runner will execute the steps specified in the version +# of this workflow file that lives in the **target branch** (usually `main`), +# not the one in the Pull Request branch. This means that even if a contributor +# opens a PR with a change to this file, the change won't be executed. This is +# intended to prevent third-party contributors from running custom code with high +# privileges on the repo. +# +# References: +# * https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/ +# * PR that added this action: https://github.com/simpeg/simpeg/pull/1424 +# * PR that added this warning: https://github.com/simpeg/simpeg/pull/1592 +# +on: [pull_request_target] # zizmor: ignore[dangerous-triggers] jobs: flake8: runs-on: ubuntu-latest name: Flake8 check + permissions: + contents: read + pull-requests: write + steps: - name: Checkout target repository source uses: actions/checkout@v4 + with: + persist-credentials: false - name: Setup Python env uses: actions/setup-python@v5 @@ -15,13 +56,16 @@ jobs: python-version: '3.11' - name: Install dependencies to run the flake8 checks - run: pip install -r requirements_style.txt + run: .ci/install_style.sh + # Checkout PR branch. + # TREAT THIS CODE AS MALICIOUS, DON'T RUN CODE FROM THIS BRANCH. - name: checkout pull request source uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} path: pr_source + persist-credentials: false - name: flake8 review uses: reviewdog/action-flake8@v3 @@ -33,9 +77,15 @@ jobs: black: name: Black check runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: - name: Checkout target repository source uses: actions/checkout@v4 + with: + persist-credentials: false - name: Setup Python env uses: actions/setup-python@v5 @@ -43,16 +93,19 @@ jobs: python-version: '3.11' - name: Install dependencies to run the black checks - run: pip install -r requirements_style.txt + run: .ci/install_style.sh + # Checkout PR branch. + # TREAT THIS CODE AS MALICIOUS, DON'T RUN CODE FROM THIS BRANCH. - name: checkout pull request source uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} path: 'pr_source' + persist-credentials: false - uses: reviewdog/action-black@v3 with: workdir: 'pr_source' github_token: ${{ secrets.GITHUB_TOKEN }} - reporter: github-pr-review \ No newline at end of file + reporter: github-pr-review diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml new file mode 100644 index 0000000000..ca489ee9e1 --- /dev/null +++ b/.github/workflows/zizmor.yml @@ -0,0 +1,38 @@ +# Lint GitHub Actions for common security issues using zizmor. +# Docs: https://woodruffw.github.io/zizmor + +name: Lint GitHub Actions + +on: + pull_request: + push: + branches: + - main + +permissions: {} + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install zizmor + run: python -m pip install zizmor + + - name: List installed packages + run: python -m pip freeze + + - name: Lint GitHub Actions + run: make check-actions + env: + # Set GH_TOKEN to allow zizmor to check online vulnerabilities + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 5609580098..53545d898d 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ pip-log.txt # Unit test / coverage reports .coverage +coverage_html_report/* .tox nosetests.xml diff --git a/.mailmap b/.mailmap index 26757e1035..7bdb3acc4f 100644 --- a/.mailmap +++ b/.mailmap @@ -23,25 +23,81 @@ Seogi Kang Seogi Kang Dom Fournier +Dom Fournier domfournier Gudni Karl Rosenkjaer Gudni Karl Rosenkjaer Gudni Karl Rosenkjaer -Thibaut Astic -Thibaut Astic + +Thibaut Astic +Thibaut Astic +Thibaut Astic +Thibaut Astic +Thibaut Astic <97514898+thibaut-kobold@users.noreply.github.com> +Thibaut Astic Devin Cowan Dave Marchant Michael Mitchell +Michael Mitchell Lars Ruthotto Dieter Werthmüller Dieter Werthmüller +Dieter Werthmüller Eldad Haber Brendan Smithyman + +Xiaolong Wei <56940558+xiaolongw1223@users.noreply.github.com> + +Ying Hu <64567062+YingHuuu@users.noreply.github.com> + +Richard Scott <72196131+RichardScottOZ@users.noreply.github.com> + +Nick Williams <86257151+nwilliams-kobold@users.noreply.github.com> + +Fernando Perez + +Adam Kosík + +Andrea Balza Morales + +Craig Miller + +Colton Kohnke +Colton Kohnke + +Franklin Koch + +Jacob Edman + +Joseph Capriotti +Joseph Capriotti + +John Kuttai + +John Weiss +John Weiss <49649694+johnweis0480@users.noreply.github.com> + +Kalen Martens + +Luz Angelica Caudillo Mata + +Neil Godber +Neil Godber + +Santiago Soler + +Sarah Devriese + +Zheng-Kai Ye + +Zhuo Liu <20036557+Zhuoliulz@users.noreply.github.com> + +Mike Wathen \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f8427df743..4000c604a1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,13 +5,16 @@ fail_fast: false repos: - repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.3.0 + rev: 25.1.0 hooks: - id: black + language_version: python3.12 + - repo: https://github.com/pycqa/flake8 - rev: 7.1.1 + rev: 7.1.2 hooks: - id: flake8 + language_version: python3.12 additional_dependencies: - flake8-bugbear==23.12.2 - flake8-builtins==2.2.0 @@ -19,7 +22,7 @@ repos: - flake8-rst-docstrings==0.3.0 - flake8-docstrings==1.7.0 - repo: https://github.com/MiraGeoscience/pre-commit-hooks - rev: v1.0.1 + rev: v1.1.0 hooks: - id: prepare-commit-msg - - id: check-commit-msg + - id: check-commit-msg \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 7c04fa62b2..b61f50d054 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,10 +1,9 @@ prune .github -prune .azure-pipelines +prune .ci prune docs prune examples prune tutorials prune tests exclude .coveragerc .flake8 .gitignore MANIFEST.in .pre-commit-config.yaml exclude azure-pipelines.yml .mailmap -exclude environment_test.yml -exclude requirements.txt requirements_dev.txt requirements_dask.txt requirements_style.txt \ No newline at end of file +exclude .git_archival.txt .gitattributes Makefile environment.yml \ No newline at end of file diff --git a/Makefile b/Makefile index 20c18b456c..2ede57730f 100644 --- a/Makefile +++ b/Makefile @@ -1,32 +1,18 @@ STYLE_CHECK_FILES = simpeg examples tutorials tests +GITHUB_ACTIONS=.github/workflows -.PHONY: help build coverage lint graphs tests docs check black flake +.PHONY: help docs clean check black flake flake-all check-actions help: @echo "Commands:" @echo "" - @echo " check run code style and quality checks (black and flake8)" - @echo " black checks code style with black" - @echo " flake checks code style with flake8" - @echo " flake-all checks code style with flake8 (full set of rules)" + @echo " check run code style and quality checks (black and flake8)" + @echo " black checks code style with black" + @echo " flake checks code style with flake8" + @echo " flake-all checks code style with flake8 (full set of rules)" + @echo " check-actions lint GitHub Actions workflows (with zizmor)" @echo "" -build: - python setup.py build_ext --inplace - -coverage: - nosetests --logging-level=INFO --with-coverage --cover-package=simpeg --cover-html - open cover/index.html - -lint: - pylint --output-format=html simpeg> pylint.html - -graphs: - pyreverse -my -A -o pdf -p simpeg simpeg/**.py simpeg/**/**.py - -tests: - nosetests --logging-level=INFO - docs: cd docs;make html @@ -47,3 +33,6 @@ flake: flake-all: flake8 --version flake8 ${FLAKE8_OPTS} --ignore "" ${STYLE_CHECK_FILES} + +check-actions: + zizmor ${GITHUB_ACTIONS} diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7866c36069..93a3ad717c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,396 +1,63 @@ +# ============================================= +# Configure Azure Pipelines for automated tasks +# ============================================= + +# Define triggers for runs in CI +# ------------------------------ trigger: branches: include: - - 'main' + - "main" exclude: - - '*no-ci*' + - "*no-ci*" tags: include: - - '*' - -schedules: -- cron: "0 8 * * *" # trigger cron job every day at 08:00 AM GMT - displayName: "Scheduled nightly job" - branches: - include: [ "main" ] - always: false # don't run if no changes have been applied since last sucessful run - batch: false # dont' run if last pipeline is still in-progress + - "*" pr: branches: include: - - '*' + - "*" exclude: - - '*no-ci*' - + - "*no-ci*" +schedules: + - cron: "0 8 * * *" # trigger cron job every day at 08:00 AM GMT + displayName: "Scheduled nightly job" + branches: + include: ["main"] + always: false # don't run if no changes have been applied since last sucessful run + batch: false # dont' run if last pipeline is still in-progress + +# Run stages +# ---------- stages: - -- stage: StyleChecks - displayName: "Style Checks" - jobs: - - job: - displayName: Run style checks with Black - pool: - vmImage: ubuntu-latest - variables: - python.version: '3.8' - steps: - - script: | - pip install -r requirements_style.txt - displayName: "Install dependencies to run the checks" - - script: make black - displayName: "Run black" - - - job: - displayName: Run (permissive) style checks with flake8 - pool: - vmImage: ubuntu-latest - variables: - python.version: '3.8' - steps: - - script: | - pip install -r requirements_style.txt - displayName: "Install dependencies to run the checks" - - script: make flake - displayName: "Run flake8" - - - job: - displayName: Run style checks with flake8 (allowed to fail) - pool: - vmImage: ubuntu-latest - variables: - python.version: '3.8' - steps: - - script: | - pip install -r requirements_style.txt - displayName: "Install dependencies to run the checks" - - script: FLAKE8_OPTS="--exit-zero" make flake-all - displayName: "Run flake8" - -- stage: Testing - dependsOn: StyleChecks - jobs: - - template: ./.azure-pipelines/matrix.yml - -- stage: Deploy - dependsOn: Testing - condition: startsWith(variables['build.sourceBranch'], 'refs/tags/') - jobs: - - job: - displayName: Deploy Docs and source - pool: - vmImage: ubuntu-latest - variables: - python.version: '3.8' - timeoutInMinutes: 240 - steps: - - # Checkout simpeg repo, including tags. - # We need to sync tags and disable shallow depth in order to get the - # SimPEG version while building the docs. - - checkout: self - fetchDepth: 0 - fetchTags: true - displayName: Checkout repository (including tags) - - - script: | - git config --global user.name ${GH_NAME} - git config --global user.email ${GH_EMAIL} - git config --list | grep user. - displayName: 'Configure git' - env: - GH_NAME: $(gh.name) - GH_EMAIL: $(gh.email) - - - script: | - wget -O Mambaforge.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" - bash Mambaforge.sh -b -p "${HOME}/conda" - displayName: Install mamba - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - source "${HOME}/conda/etc/profile.d/mamba.sh" - cp environment_test.yml environment_test_with_pyversion.yml - echo " - python="$(python.version) >> environment_test_with_pyversion.yml - mamba env create -f environment_test_with_pyversion.yml - rm environment_test_with_pyversion.yml - conda activate simpeg-test - pip install pytest-azurepipelines - echo "\nList installed packages" - conda list - displayName: Create Anaconda testing environment - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - pip install -e . - displayName: Build package - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - python -c "import simpeg; print(simpeg.__version__)" - displayName: Check SimPEG version - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - python setup.py sdist - twine upload --skip-existing dist/* - displayName: Deploy source - env: - TWINE_USERNAME: $(twine.username) - TWINE_PASSWORD: $(twine.password) - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - export KMP_WARNINGS=0 - cd docs - make html - cd .. - displayName: Building documentation - - # upload documentation to simpeg-docs gh-pages on tags - - script: | - git clone --depth 1 https://${GH_TOKEN}@github.com/simpeg/simpeg-docs.git - cd simpeg-docs - git gc --prune=now - git remote prune origin - rm -rf * - cp -r $BUILD_SOURCESDIRECTORY/docs/_build/html/* . - cp $BUILD_SOURCESDIRECTORY/docs/README.md . - touch .nojekyll - echo "docs.simpeg.xyz" >> CNAME - git add . - git commit -am "Azure CI commit ref $(Build.SourceVersion)" - git push - displayName: Push documentation to simpeg-docs - env: - GH_TOKEN: $(gh.token) - -- stage: Deploy_dev_docs_experimental - dependsOn: Testing - condition: eq(variables['Build.Reason'], 'Schedule') # run only scheduled triggers - jobs: - - job: - displayName: Deploy dev docs to simpeg-doctest (experimental) - pool: - vmImage: ubuntu-latest - variables: - python.version: '3.8' - timeoutInMinutes: 240 - steps: - - # Checkout simpeg repo, including tags. - # We need to sync tags and disable shallow depth in order to get the - # SimPEG version while building the docs. - - checkout: self - fetchDepth: 0 - fetchTags: true - displayName: Checkout repository (including tags) - - - bash: | - git config --global user.name ${GH_NAME} - git config --global user.email ${GH_EMAIL} - git config --list | grep user. - displayName: 'Configure git' - env: - GH_NAME: $(gh.name) - GH_EMAIL: $(gh.email) - - - bash: | - wget -O Mambaforge.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" - bash Mambaforge.sh -b -p "${HOME}/conda" - displayName: Install mamba - - - bash: | - source "${HOME}/conda/etc/profile.d/conda.sh" - source "${HOME}/conda/etc/profile.d/mamba.sh" - cp environment_test.yml environment_test_with_pyversion.yml - echo " - python="$(python.version) >> environment_test_with_pyversion.yml - mamba env create -f environment_test_with_pyversion.yml - rm environment_test_with_pyversion.yml - conda activate simpeg-test - pip install pytest-azurepipelines - echo "\nList installed packages" - conda list - displayName: Create Anaconda testing environment - - - bash: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - pip install -e . - displayName: Build package - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - python -c "import simpeg; print(simpeg.__version__)" - displayName: Check SimPEG version - - - bash: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - export KMP_WARNINGS=0 - make -C docs html - displayName: Building documentation - - # Upload dev build of the docs to a dev branch in simpeg/simpeg-doctest - # and update submodule in the gh-pages branch - - bash: | - # Push new docs - # ------------- - # Capture hash of last commit in simpeg - commit=$(git rev-parse --short HEAD) - # Clone the repo where we store the documentation (dev branch) - git clone -q --branch dev --depth 1 https://${GH_TOKEN}@github.com/simpeg/simpeg-doctest.git - cd simpeg-doctest - # Remove all files - shopt -s dotglob # configure bash to include dotfiles in * globs - export GLOBIGNORE=".git" # ignore .git directory in glob - git rm -rf * # remove all files - # Copy the built docs to the root of the repo - cp -r $BUILD_SOURCESDIRECTORY/docs/_build/html/* -t . - # Commit the new docs. Amend to avoid having a very large history. - git add . - message="Azure CI deploy dev from ${commit}" - echo -e "\nAmending last commit:" - git commit --amend --reset-author -m "$message" - # Make the push quiet just in case there is anything that could - # leak sensitive information. - echo -e "\nPushing changes to simpeg/simpeg-doctest (dev branch)." - git push -fq origin dev 2>&1 >/dev/null - echo -e "\nFinished uploading doc files." - - # Update submodule - # ---------------- - # Need to fetch the gh-pages branch first (because we clone with - # shallow depth) - git fetch --depth 1 origin gh-pages:gh-pages - # Switch to the gh-pages branch - git switch gh-pages - # Update the dev submodule - git submodule update --init --recursive --remote dev - # Commit changes - git add dev - message="Azure CI update dev submodule from ${commit}" - echo -e "\nMaking a new commit:" - git commit -m "$message" - # Make the push quiet just in case there is anything that could - # leak sensitive information. - echo -e "\nPushing changes to simpeg/simpeg-doctest (gh-pages branch)." - git push -q origin gh-pages 2>&1 >/dev/null - echo -e "\nFinished updating submodule dev." - - # Unset dotglob - shopt -u dotglob - export GLOBIGNORE="" - displayName: Push documentation to simpeg-doctest (dev branch) - env: - GH_TOKEN: $(gh.token) - -- stage: Deploy_release_docs_experimental - dependsOn: Testing - condition: startsWith(variables['build.sourceBranch'], 'refs/tags/') - jobs: - - job: - displayName: Deploy release docs to simpeg-doctest (experimental) - pool: - vmImage: ubuntu-latest - variables: - python.version: '3.8' - timeoutInMinutes: 240 - steps: - - # Checkout simpeg repo, including tags. - # We need to sync tags and disable shallow depth in order to get the - # SimPEG version while building the docs. - - checkout: self - fetchDepth: 0 - fetchTags: true - displayName: Checkout repository (including tags) - - - bash: | - git config --global user.name ${GH_NAME} - git config --global user.email ${GH_EMAIL} - git config --list | grep user. - displayName: 'Configure git' - env: - GH_NAME: $(gh.name) - GH_EMAIL: $(gh.email) - - - bash: | - wget -O Mambaforge.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh" - bash Mambaforge.sh -b -p "${HOME}/conda" - displayName: Install mamba - - - bash: | - source "${HOME}/conda/etc/profile.d/conda.sh" - source "${HOME}/conda/etc/profile.d/mamba.sh" - cp environment_test.yml environment_test_with_pyversion.yml - echo " - python="$(python.version) >> environment_test_with_pyversion.yml - mamba env create -f environment_test_with_pyversion.yml - rm environment_test_with_pyversion.yml - conda activate simpeg-test - pip install pytest-azurepipelines - echo "\nList installed packages" - conda list - displayName: Create Anaconda testing environment - - - bash: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - pip install -e . - displayName: Build package - - - script: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - python -c "import simpeg; print(simpeg.__version__)" - displayName: Check SimPEG version - - - bash: | - source "${HOME}/conda/etc/profile.d/conda.sh" - conda activate simpeg-test - export KMP_WARNINGS=0 - make -C docs html - displayName: Building documentation - - # Upload release build of the docs to gh-pages branch in simpeg/simpeg-doctest - - bash: | - # Capture version - # TODO: we should be able to get the version from the - # build.sourceBranch variable - version=$(git tag --points-at HEAD) - if [ -n "$version" ]; then - echo "Version could not be obtained from tag. Exiting." - exit 1 - fi - # Capture hash of last commit in simpeg - commit=$(git rev-parse --short HEAD) - # Clone the repo where we store the documentation - git clone -q --branch gh-pages --depth 1 https://${GH_TOKEN}@github.com/simpeg/simpeg-doctest.git - cd simpeg-doctest - # Move the built docs to a new dev folder - cp -r $BUILD_SOURCESDIRECTORY/docs/_build/html "$version" - cp $BUILD_SOURCESDIRECTORY/docs/README.md . - # Add .nojekyll if missing - touch .nojekyll - # Update latest symlink - rm -f latest - ln -s "$version" latest - # Commit the new docs. - git add "$version" README.md .nojekyll latest - message="Azure CI deploy ${version} from ${commit}" - echo -e "\nMaking a new commit:" - git commit -m "$message" - # Make the push quiet just in case there is anything that could - # leak sensitive information. - echo -e "\nPushing changes to simpeg/simpeg-doctest." - git push -fq origin gh-pages 2>&1 >/dev/null - echo -e "\nFinished uploading generated files." - displayName: Push documentation to simpeg-doctest - env: - GH_TOKEN: $(gh.token) \ No newline at end of file + - stage: StyleChecks + displayName: "Style Checks" + jobs: + - template: .ci/azure/style.yml + + - stage: Testing + dependsOn: StyleChecks + jobs: + - template: .ci/azure/test.yml + + - stage: Codecov + dependsOn: Testing + condition: succeededOrFailed() + jobs: + - template: .ci/azure/codecov.yml + + - stage: Docs + dependsOn: + - StyleChecks + - Testing + jobs: + - template: .ci/azure/docs.yml + + - stage: PyPI + dependsOn: + - StyleChecks + - Testing + jobs: + - template: .ci/azure/pypi.yml diff --git a/docs/_static/versions.json b/docs/_static/versions.json index 265c9718fa..665a00a498 100644 --- a/docs/_static/versions.json +++ b/docs/_static/versions.json @@ -1,31 +1,52 @@ [ { "version": "dev", - "url": "https://doctest.simpeg.xyz/dev/" + "url": "https://docs.simpeg.xyz/dev/" }, { - "name": "v0.21.1 (latest)", - "version": "v0.21.1", - "url": "https://doctest.simpeg.xyz/v0.21.1/" + "name": "v0.23.0 (latest)", + "version": "0.23.0", + "url": "https://docs.simpeg.xyz/v0.23.0/", + "preferred": true }, { - "version": "v0.21.0", - "url": "https://doctest.simpeg.xyz/v0.21.0/" + "name": "v0.22.2", + "version": "0.22.2", + "url": "https://docs.simpeg.xyz/v0.22.2/" }, { - "version": "v0.20.0", - "url": "https://doctest.simpeg.xyz/v0.20.0/" + "name": "v0.22.1", + "version": "0.22.1", + "url": "https://docs.simpeg.xyz/v0.22.1/" }, { - "version": "v0.19.0", - "url": "https://doctest.simpeg.xyz/v0.19.0/" + "name": "v0.22.0", + "version": "0.22.0", + "url": "https://docs.simpeg.xyz/v0.22.0/" }, { - "version": "v0.18.1", - "url": "https://doctest.simpeg.xyz/v0.18.1/" + "name": "v0.21.1", + "version": "0.21.1", + "url": "https://docs.simpeg.xyz/v0.21.1/" }, { - "version": "v0.18.0", - "url": "https://doctest.simpeg.xyz/v0.18.0/" + "version": "0.21.0", + "url": "https://docs.simpeg.xyz/v0.21.0/" + }, + { + "version": "0.20.0", + "url": "https://docs.simpeg.xyz/v0.20.0/" + }, + { + "version": "0.19.0", + "url": "https://docs.simpeg.xyz/v0.19.0/" + }, + { + "version": "0.18.1", + "url": "https://docs.simpeg.xyz/v0.18.1/" + }, + { + "version": "0.18.0", + "url": "https://docs.simpeg.xyz/v0.18.0/" } ] diff --git a/docs/conf.py b/docs/conf.py index 38bdeef6b2..5b7c5c9175 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -250,7 +250,7 @@ def linkcode_resolve(domain, info): if simpeg_version.is_devrelease: switcher_version = "dev" else: - switcher_version = f"v{simpeg_version.public}" + switcher_version = simpeg_version.public # Use Pydata Sphinx theme html_theme = "pydata_sphinx_theme" @@ -293,8 +293,9 @@ def linkcode_resolve(domain, info): # Configure version switcher "switcher": { "version_match": switcher_version, - "json_url": "https://doctest.simpeg.xyz/latest/_static/versions.json", + "json_url": "https://docs.simpeg.xyz/latest/_static/versions.json", }, + "show_version_warning_banner": True, } html_logo = "images/simpeg-logo.png" @@ -467,14 +468,8 @@ def linkcode_resolve(domain, info): # Scaping images to generate on website from plotly.io._sg_scraper import plotly_sg_scraper -import pyvista -# Make sure off screen is set to true when building locally -pyvista.OFF_SCREEN = True -# necessary when building the sphinx gallery -pyvista.BUILDING_GALLERY = True - -image_scrapers = ("matplotlib", plotly_sg_scraper, pyvista.Scraper()) +image_scrapers = ("matplotlib", plotly_sg_scraper) # Sphinx Gallery sphinx_gallery_conf = { @@ -505,6 +500,8 @@ def linkcode_resolve(domain, info): autodoc_member_order = "bysource" +# Don't show type hints in signatures +autodoc_typehints = "none" # def supress_nonlocal_image_warn(): # import sphinx.environment diff --git a/docs/content/getting_started/contributing/code-style.rst b/docs/content/getting_started/contributing/code-style.rst index 75f235d107..3202d48ac2 100644 --- a/docs/content/getting_started/contributing/code-style.rst +++ b/docs/content/getting_started/contributing/code-style.rst @@ -20,7 +20,7 @@ Run ``black`` on SimPEG directories that contain Python source files: .. code:: - black simpeg examples tutorials tests + black . Run ``flake8`` on the whole project with: diff --git a/docs/content/getting_started/contributing/documentation.rst b/docs/content/getting_started/contributing/documentation.rst index 8ef695961a..0d5f8e3962 100644 --- a/docs/content/getting_started/contributing/documentation.rst +++ b/docs/content/getting_started/contributing/documentation.rst @@ -70,18 +70,44 @@ For example: Building the documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you would like to see the documentation changes. -In the repo's root directory, enter the following in your terminal. +You can build the documentation pages locally to see how the new changes will +look. First, make sure that you have :ref:`created and activated an environment +` with simpeg installed in it. Then, navigate to the +``docs`` folder: -.. code:: +.. code:: bash - make all + cd docs + +And run the following to build the docs: + +.. code:: bash + + make html + +.. note:: + + This command will build all documentation pages, including all the examples + and tutorials. Running the examples might take considerable amount of time. + + If you want to build the docs, but avoid running the examples, you can + alternatively run: + + .. code:: bash + + make html-noplot Serving the documentation locally ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Once the documentation is built. You can view it directly using the following command. This will automatically serve the docs and you can see them in your browser. +Once the documentation is built, you can view it using the following +command (make sure you are in the ``docs`` directory): -.. code:: +.. code:: bash make serve + +It will automatically serve the docs and you can see them in your browser. + +Alternatively, you can open your file manager and open the ``index.html`` file +in the ``docs/_build/html`` folder. diff --git a/docs/content/getting_started/contributing/setting-up-environment.rst b/docs/content/getting_started/contributing/setting-up-environment.rst index d775983dff..c5dd3a95ce 100644 --- a/docs/content/getting_started/contributing/setting-up-environment.rst +++ b/docs/content/getting_started/contributing/setting-up-environment.rst @@ -7,18 +7,17 @@ Install Python -------------- First you will need to install Python. You can find instructions in -:ref:`installing_python`. We highly encourage to install Anaconda_ or -Miniforge_. +:ref:`installing_python`. We highly encourage to install Miniforge_ (or +Anaconda_). Create environment ------------------ To get started developing SimPEG we recommend setting up an environment using -the ``conda`` package manager that mimics the testing -environment used for continuous integration testing. Most of the packages that -we use are available through the ``conda-forge`` project. This will ensure you -have all of the necessary packages to both develop SimPEG and run tests -locally. We provide an ``environment_test.yml`` in the base level directory. +the ``conda`` package manager that includes all odthe packages necessary to +both develop SimPEG and run tests locally. Most of the packages that +we use are available through the ``conda-forge`` project. +We provide an ``environment.yml`` in the base level directory. To create the environment and install all packages needed to run and write code for SimPEG, navigate to the directory where you :ref:`cloned SimPEG's @@ -26,7 +25,7 @@ repository ` and run: .. code:: - conda env create -f environment_test.yml + conda env create -f environment.yml .. note:: @@ -48,7 +47,7 @@ Once the environment is successfully created, you can *activate* it with .. code:: - conda activate simpeg-test + conda activate simpeg-dev Install SimPEG in developer mode @@ -56,7 +55,7 @@ Install SimPEG in developer mode There are many options to install SimPEG into this local environment, we recommend using `pip`. After ensuring that all necessary packages from -`environment_test.yml` are installed, the most robust command you can use, +`environment.yml` are installed, the most robust command you can use, executed from the base level directory would be: .. code:: @@ -72,7 +71,7 @@ This practice also allows you to uninstall SimPEG if so desired: .. code:: - pip uninstall SimPEG + pip uninstall simpeg .. note:: @@ -85,7 +84,7 @@ This practice also allows you to uninstall SimPEG if so desired: Check your installation ----------------------- -You should be able to open a terminal within SimPEG/tutorials and run an +You should be able to open a terminal within simpeg/tutorials and run an example, i.e. .. code:: @@ -153,7 +152,7 @@ Update your environment Every once in a while, the minimum versions of the packages in the ``environment.yml`` file get updated. After this happens, it's better to update -the ``simpeg-test`` environment we have created. This way we ensure that we are +the ``simpeg-dev`` environment we have created. This way we ensure that we are checking the style and testing our code using those updated versions. To update our environment we need to navigate to the directory where you @@ -161,4 +160,4 @@ To update our environment we need to navigate to the directory where you .. code:: - conda env update -f environment_test.yml + conda env update -f environment.yml diff --git a/docs/content/getting_started/installing.rst b/docs/content/getting_started/installing.rst index 06724787e7..a3bc1cac3b 100644 --- a/docs/content/getting_started/installing.rst +++ b/docs/content/getting_started/installing.rst @@ -6,31 +6,39 @@ Getting Started with SimPEG .. _installing_python: -Prerequisite: Installing Python -=============================== +Installing Python +================= SimPEG is written in Python_! -We highly recommend installing it using Anaconda_ (or the alternative Miniforge_). -It installs `Python `_, -`Jupyter `_ and other core -Python libraries for scientific computing. -If you and Python_ are not yet acquainted, we highly -recommend checking out `Software Carpentry `_. +This means we need Python_ in order to run SimPEG. +We highly recommend installing a Python distribution like Miniforge_ that will +install the Python interpreter along with the conda_ package manager. .. note:: - As of version 0.11.0, we will no longer ensure compatibility with Python 2.7. Please use - the latest version of Python 3 with SimPEG. For more information on the transition of the - Python ecosystem to Python 3, please see the `Python 3 Statement `_. + Miniforge_ is a community-driven alternative to Anaconda_, a well-known + Python distribution. + + We recommend Miniforge_ over Anaconda_ because it's more lightweight and + because it makes use of the conda-forge_ community-led channel to download + packages. Downloading packages from Anaconda_ (usually refered as the + ``default`` channel) requires us to adhere to their `Terms of Service + `_. + Make sure to read them and their `FAQs + `_ if you decide to + still use Anaconda_. -.. image:: https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Python-logo-notext.svg/220px-Python-logo-notext.svg.png - :align: right - :width: 100 - :target: https://www.python.org/ +.. seealso:: + + If you are starting with Python_ and want to learn more and feel more + comfortable with the language, we recommend checking out + `Software Carpentry `_'s lessons. .. _Python: https://www.python.org/ .. _Anaconda: https://www.anaconda.com/products/individual .. _Miniforge: https://github.com/conda-forge/miniforge +.. _conda: https://docs.conda.io/en/latest +.. _conda-forge: https://conda-forge.org/ .. _installing_simpeg: @@ -41,15 +49,17 @@ Installing SimPEG Conda Forge ----------- -SimPEG is available through `conda-forge` and you can install is using the -`conda package manager `_ that comes with the Anaconda_ -or Miniforge_ distributions: +SimPEG is available through conda-forge_ and you can install is using the +`conda package manager `_ that comes with Miniforge_ (or +Anaconda_): + +.. code:: bash -.. code:: + conda install --channel conda-forge simpeg - conda install SimPEG --channel conda-forge +.. note:: -Installing through `conda` is our recommended method of installation. + Installing through ``conda`` is our recommended method of installation. .. note:: @@ -72,32 +82,36 @@ PyPi SimPEG is on `pypi `_! First, make sure your version of pip is up-to-date -.. code:: +.. code:: bash pip install --upgrade pip Then you can install SimPEG -.. code:: +.. code:: bash - pip install SimPEG + pip install simpeg To update SimPEG, you can run -.. code:: +.. code:: bash - pip install --upgrade SimPEG + pip install --upgrade simpeg Installing from Source ---------------------- -First (you need git):: +First (you need git): + +.. code:: bash git clone https://github.com/simpeg/simpeg -Second (from the root of the SimPEG repository):: +Second (from the root of the SimPEG repository): + +.. code:: bash pip install . @@ -110,9 +124,11 @@ Success? If you have been successful at downloading and installing SimPEG, you should be able to download and run any of the :ref:`examples and tutorials `. -If not, you can reach out to other people developing and using SimPEG on the -`google forum `_ or on -`Mattermost `_. +If not, you can reach out to other people developing and using SimPEG on our +Mattermost_ channel or in our `Discourse forum`_. + +.. _Discourse forum: https://simpeg.discourse.group/ +.. _Mattermost: https://mattermost.softwareunderground.org/simpeg Useful Links ============ diff --git a/docs/content/release/0.22.0-notes.rst b/docs/content/release/0.22.0-notes.rst new file mode 100644 index 0000000000..ac843655ac --- /dev/null +++ b/docs/content/release/0.22.0-notes.rst @@ -0,0 +1,213 @@ +.. _0.22.0_notes: + +============================ +SimPEG 0.22.0 Release Notes +============================ + +June 26th, 2024 + +.. contents:: Highlights + :depth: 3 + +Updates +======= + +``SimPEG`` has been renamed to ``simpeg`` +----------------------------------------- + +SimPEG v0.22.0 comes with a major change that everyone will experience! We are +excited to announce that we renamed the package from ``SimPEG`` to ``simpeg``, +making it compliant to `PEP8 `__. + +Since this version and moving forward we'll import ``simpeg`` as: + +.. code:: python + + import simpeg + +or any of its submodules as: + +.. code:: python + + from simpeg.potential_fields import magnetics + +Although we encourage users to update their code after they update their +installed SimPEG version, we still support the old ``SimPEG``. +We'll just receive a warning about the deprecation of ``SimPEG`` with +upper-cases if we try to import it: + +.. code:: python + + import SimPEG + +.. code:: + + FutureWarning: Importing `SimPEG` is deprecated. please import from `simpeg`. + +New features +------------ + +We have a faster and more memory efficient implementation of the magnetic +simulation +:class:`~simpeg.potential_fields.magnetics.Simulation3DIntegral`, built using +`Choclo `__ and `Numba `__. +In order to use it, you will need to `install Choclo +`__ in addition to +``simpeg``. This new implementation is able to forward model TMI and all +magnetic field components with susceptibility (scalar) or effective +susceptibility (vector) models. + +Documentation +------------- + +Since v0.22.0, we serve the documentation pages for `latest +`__ and older versions of SimPEG, along with +the pages for the `development version `__ (the +latest version in the ``main`` branch of our GitHub repository). +The docs now include a version switcher in the top bar that will allow users to +navigate between the pages for each different version. + +Several improvements have been made to the documentation pages. + +In the `Getting Started +`__ guide we +stopped recommending ``mamba`` as the best package manager for installing +SimPEG after ``conda`` started using ``libmamba`` under the hood, achieving the +same performance as ``mamba``. We also included instructions so our +contributors can easily update their local environment, which is specially +useful after we update the minimum version of the development dependencies +(such as autoformatters and linters). + +The documentation for Frequency-Domain (FDEM) and Time-Domain (TDEM) EM fields +and 3D simulations got greatly extended, with more details on the parameters +for each method, along with more mathematical background for their +implementations. + +Lastly, we fixed typos, the contour colors for one of the gravity examples, and +the broken links to the source code for each class, function and method. +These links now point to their corresponding version in the GitHub repository. + +Bugfixes +-------- + +This release comes with a few bug fixes. We solved an issue with the distance +calculation in the +:func:`~simpeg.electromagnetics.static.utils.convert_survey_3d_to_2d_lines` +utility function that converts 3D DC-IP survey locations to 2D lines. We fixed +a bug on how the arguments passed to the directives that estimate the beta +parameter where being passed to the parent classes. We updated the code in +:class:`~simpeg.utils.pgi_utils.GaussianMixtureWithPrior` to make it compatible +with the latest versions of `scikit-learn `__. And +we now make sure that the queues are joined when the +:class:`~simpeg.meta.MetaSimulation` is joined. + +Breaking changes +---------------- + +The :mod:`~simpeg.electromagnetics.static.spontaneous_potential` has been +renamed to :mod:`~simpeg.electromagnetics.static.self_potential` to accurately +reflect the nature of the process, as the term being used in the literature. + +General improvements +-------------------- + +We improved the interface of the +:class:`~simpeg.potential_fields.magnetics.UniformBackgroundField` class, and +for the DC :class:`~simpeg.electromagnetics.static.resistivity.sources.Dipole` +source class. + +We moved away from the deprecated Numpy's global random seeds and replace them +for the new `random number generator object +`__ +in the entire SimPEG's code base and in most of its tests. This greatly helps +the experience of ensuring reproducible runs of our inversions and tests. + +Lastly, the inversion logs now also include the SimPEG version that is being +used. + +Maintenance +----------- + +We updated the configuration files to build and install SimPEG, moving away +from the old ``setup.py`` into the new ``pyproject.toml``. +We fixed another important flake8 warning across the code base: F821, which +highlights undefined varibles in the code. +And cleaned up the scripts for running automated tasks in Azure Pipelines (like +checking style, testing, deploying docs and code). + +Contributors +============ + +This is a combination of contributors and reviewers who've made contributions +towards this release (in no particular order). + +- `@dccowan `__ +- `@jcapriot `__ +- `@jedman `__ +- `@kehrl-kobold `__ +- `@lheagy `__ +- `@santisoler `__ +- `@williamjsdavis `__ + +We would like to highlight the contributions made by new contributors: + +- `@kehrl-kobold `__ made their first contribution in + https://github.com/simpeg/simpeg/pull/1390 +- `@williamjsdavis `__ made their first contribution in + https://github.com/simpeg/simpeg/pull/1486 + + +Pull Requests +============= + +- Remove the parameters argument from docstring by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1417 +- Use reviewdog to annotate PR’s with black and flake8 errors. by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1424 +- Safely run reviewdog on ``pull_request_target`` events by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1427 +- Add new Issue template for making a release by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1410 +- Replace use of ``refine_tree_xyz`` in DCIP tutorials by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1381 +- Fix rst syntax in release notes for v0.21.0 by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1434 +- Move to a PEP8 compliant package name. by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1430 +- Update copyright year in **init**.py by `@lheagy `__ in https://github.com/simpeg/simpeg/pull/1436 +- Replace SimPEG for simpeg across docstrings by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1438 +- Lowercase simpeg for generating coverage on Azure by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1443 +- Rename spontaneous potential to self potential by `@lheagy `__ in https://github.com/simpeg/simpeg/pull/1422 +- Fix distance calculation in ``convert_survey_3d_to_2d_lines`` by `@kehrl-kobold `__ in https://github.com/simpeg/simpeg/pull/1390 +- Replace SimPEG for simpeg in API reference by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1446 +- Replace SimPEG for simpeg in getting started pages by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1447 +- Check inputs for converting 3d surveys to 2d lines by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1392 +- Always use Pydata Sphinx theme for building docs by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1445 +- Simplify interface of UniformBackgroundField by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1421 +- Ensure the queue’s are joined when the meta simulation is joined. by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1464 +- Add maintenance issue template by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1468 +- Add instructions to update the environment by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1462 +- Stop recommending mamba for installing simpeg by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1463 +- Fix bug on arguments of beta estimator directives by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1460 +- Improve interface for DC Dipole source by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1393 +- Use Numpy random number generator in codebase by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1394 +- Extend docstrings for FDEM and TDEM fields and 3D simulations by `@dccowan `__ in https://github.com/simpeg/simpeg/pull/1414 +- Magnetic simulation with Choclo as engine by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1321 +- Fix typos in EM docstrings by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1473 +- Fix call to private method in GaussianMixtureWithPrior by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1476 +- Add version switcher to Sphinx docs by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1428 +- Use random seed on synthetic data in mag tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1457 +- Fix links to source code in documentation pages by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1444 +- Fix script for new deployment of docs by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1478 +- Print SimPEG version in the inversion log by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1477 +- Use Numpy rng in FDEM tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1449 +- Add ``random_seed`` argument to objective fun’s derivative tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1448 +- Add ``random_seed`` to the ``test`` method of maps by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1465 +- Use Numpy rng in TDEM tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1452 +- Use random seed in missed objective function tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1483 +- Fix contour colors in gravity plot in User Guide by `@williamjsdavis `__ in https://github.com/simpeg/simpeg/pull/1486 +- Hide type hints from signatures in documentation pages by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1471 +- Reorganize the maps submodule by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1480 +- Pyproject.toml by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1482 +- Use Numpy rng in static EM tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1451 +- Split Azure Pipelines configuration into multiple files by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1481 +- Ignore ``survey_type`` argument in DC and SIP surveys by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1458 +- Update deployment of docs to simpeg-docs by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1490 +- Fix F821 flake error: undefined variable by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1487 +- Use Numpy rng in viscous remanent mag tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1453 +- Use Numpy rng in NSEM tests by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1450 +- Unwrap lines in release checklist by `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1498 +- Improve instructions to update versions.json by `@santisoler ` in https://github.com/simpeg/simpeg/pull/1500 diff --git a/docs/content/release/0.22.1-notes.rst b/docs/content/release/0.22.1-notes.rst new file mode 100644 index 0000000000..c06d4ee577 --- /dev/null +++ b/docs/content/release/0.22.1-notes.rst @@ -0,0 +1,35 @@ +.. _0.22.1_notes: + +=========================== +SimPEG 0.22.1 Release Notes +=========================== + +July 5th, 2024 + +.. contents:: Highlights + :depth: 2 + +Updates +======= + +This patch release includes and improvement in one of the import lines, fixing +an bug that was making importing frequency domain modules in :mod:`simpeg` to +fail when working with :mod:`matplotlib` ``>=3.9.0``. + +It also enables the version warning banner in PyData Sphinx theme, allowing +users to quickly notice if the docs they are reading are not the latest ones. + +Contributors +============ + +- `@santisoler `__ + +Pull Requests +============= + +- Configure version warning banner in Sphinx by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1501 +- Improve imports in natural source utils by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1503 +- Deploy to TestPyPI only on nightly builds by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1509 diff --git a/docs/content/release/0.22.2-notes.rst b/docs/content/release/0.22.2-notes.rst new file mode 100644 index 0000000000..9f635ae8b4 --- /dev/null +++ b/docs/content/release/0.22.2-notes.rst @@ -0,0 +1,41 @@ +.. _0.22.2_notes: + +=========================== +SimPEG 0.22.2 Release Notes +=========================== + +September 11th, 2024 + +.. contents:: Highlights + :depth: 2 + +Updates +======= + +This patch release includes a few fixes: SciPy solvers can now be used +with newer versions of SciPy (``>=1.14``), we fixed a bug in one of the methods +of the Gaussian Mixture Models used in PGI, we included a fix on one of the +internal validation functions, and we also applied some minor improvements to +the documentation pages. + +Contributors +============ + +- `@prisae `__ +- `@santisoler `__ + +Pull Requests +============= + +- Minor fixes to disclaimer in ``pgi_utils.py`` by `@prisae `__ in + https://github.com/simpeg/simpeg/pull/1512 +- Fix misuse of the ``requires`` decorator in ``code_utils.py`` by + `@prisae `__ in https://github.com/simpeg/simpeg/pull/1513 +- Use lowercase simpeg in a few missing docstrings by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1519 +- Pass ``rtol`` to SciPy solvers for SciPy>=1.12 by `@prisae `__ in + https://github.com/simpeg/simpeg/pull/1517 +- Fix ``validate_ndarray_with_shape`` by `@prisae `__ in + https://github.com/simpeg/simpeg/pull/1523 +- Fix bug in GMM’s ``_check_weights`` by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1526 diff --git a/docs/content/release/0.23.0-notes.rst b/docs/content/release/0.23.0-notes.rst new file mode 100644 index 0000000000..a7141dc50f --- /dev/null +++ b/docs/content/release/0.23.0-notes.rst @@ -0,0 +1,210 @@ +.. _0.23.0_notes: + +=========================== +SimPEG 0.23.0 Release Notes +=========================== + +November 3rd, 2024 + +.. contents:: Highlights + :depth: 3 + +Updates +======= + +New features +------------ + +Full support for Numpy 2.0 +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With this release SimPEG is fully compatible with Numpy 2.0. + +Augmented receivers for airborne NSEM +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We added new types of receivers intended to be used for airborne natural-source +EM simulations: + +- :class:`~simpeg.electromagnetics.natural_source.receivers.Impedance` +- :class:`~simpeg.electromagnetics.natural_source.receivers.Admittance` +- :class:`~simpeg.electromagnetics.natural_source.receivers.ApparentConductivity` +- :class:`~simpeg.electromagnetics.natural_source.receivers.Tipper` + +They extend the type of airborne NSEM surveys that can be simulated in SimPEG. + +See https://github.com/simpeg/simpeg/pull/1454 for more details. + +Automatic selection of Solver +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This release includes a new +:func:`~simpeg.utils.solver_utils.get_default_solver` function that +automatically selects a solver based on what you have installed on +your system. +For example, it'll select ``Pardiso`` as the solver if you are running an Intel +CPU and have `pydiso` installed in your system. Alternatively, it can choose +``Mumps`` if you are using Apple silicon and the `python-mumps` package is installed. +If no fast solver is available, it'll choose SciPy's ``SparseLU`` solver. + +.. note:: + For those installing through `conda-forge`, ``conda install simpeg`` will now also grab + better solvers for your system as well, consistent with `simpeg`'s solver priority. + +Moreover, simulations will also use this function to get the default solver if no +solver is being provided by the user, making it easier to run efficient +finite volume simulations out of the box. +See https://github.com/simpeg/simpeg/pull/1511 for more information. + +Support for magnetic gradiometry in Choclo-based magnetic simulations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Now the magnetic simulations with ``engine="choclo"`` support forward modelling +the magnetic gradiometry components and TMI derivatives. This fully extends the +support of the Numba-based simulations to every field that can also be +computed using ``engine="geoana"``. + +See https://github.com/simpeg/simpeg/pull/1543 and +https://github.com/simpeg/simpeg/pull/1553 for more information. + +Numba-based implementation of gravity and equivalent sources +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This release includes new implementations of the gravity and magnetic +equivalent sources using `Choclo `__'s kernels and +forward modelling functions and `Numba `__ to +just-in-time compilations and parallelization, making them faster and more +memory efficient. + +See https://github.com/simpeg/simpeg/pull/1552 and +https://github.com/simpeg/simpeg/pull/1527. + +New ``UpdateIRLS`` directive +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We have renamed the :class:`simpeg.directives.UpdateIRLS` directive for +applying the Iterative Re-weighted Least-Squares during sparse norm inversions, +that includes better argument names and an improved implementation. +See https://github.com/simpeg/simpeg/pull/1349 for more details. + +Standardize arguments for active cells and random seeds +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We have standardize the name of the arguments for active cells in meshes through +all functions and methods in SimPEG. We have deprecated the old +names like ``indAct``, ``ind_active`` and ``indActive`` in favor of +``active_cells``. + +The arguments for passing random seeds have also been standardized to +``random_seed``. These arguments generalize a way to specify random states, +allowing to take seeds as integers or instances of +:class:`numpy.random.Generator`. + + +Upgraded dependencies +--------------------- + +In SimPEG v0.23.0 we dropped support for Python versions <= 3.9. Python 3.8 met +its end-of-life this year (October 2024). Python 3.10 is the minimum required +version for Numpy 2.1.0. To keep up with the latest updates in the scientific +Python ecosystem, we decided to set Python 3.10 as the minimum required version +for SimPEG as well. + +Moreover, we have increased the minimum required versions of ``discretize``, +``geoana`` and ``pymatsolver`` in order to support Numpy 2.0. +Lastly, now ``pandas``, ``scikit-learn`` and ``empymod`` are optional +dependencies (instead of required ones). + + +Documentation +------------- + +This release includes a few fixes to the documentation pages, like improvements +to some magnetic examples, and fixes to docstrings and math of a few classes. + + +Bugfixes +-------- + +We have fixed some issues of Dask-based simulations that were running into +race-conditions after one of the latest Dask updates. See +https://github.com/simpeg/simpeg/pull/1469 for more information. + + +Contributors +============ + +* `@domfournier `__ +* `@jcapriot `__ +* `@prisae `__ +* `@santisoler `__ +* `@thibaut-kobold `__ + +Pull Requests +============= + +- Make ``pandas`` & ``scikit-learn`` optional dependencies by `@prisae `__ in + https://github.com/simpeg/simpeg/pull/1514 +- Dask races by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1469 +- Irls refactor by `@domfournier `__ in + https://github.com/simpeg/simpeg/pull/1349 +- Minimum python version update by `@jcapriot `__ in + https://github.com/simpeg/simpeg/pull/1522 +- Replace ``ind_active`` for ``active_cells`` in pf simulations by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1520 +- Move push to codecov to its own stage by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1493 +- Minor fix in deprecation notice in docstrings by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1535 +- Replace ``indActive`` and ``actInd`` for ``active_cells`` in maps by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1534 +- Update tests and examples to use the new ``UpdateIRLS`` by + `@domfournier `__ in https://github.com/simpeg/simpeg/pull/1472 +- Replace ``indActive`` in VRM simulations for ``active_cells`` by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1536 +- Test assigned values when passing deprecated args by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1544 +- Use random seed when using ``make_synthetic_data`` in tests by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1545 +- Minor improvements to ``UpdateIRLS`` class by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1529 +- Replace ``seed`` for ``random_seed`` in directives by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1538 +- Minor fixes to magnetic examples by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1547 +- Support magnetic gradiometry using Choclo as engine by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1543 +- Update usage of ``random_seed`` in one example by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1549 +- Replace ``seed`` for ``random_seed`` in ``model_builder`` by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1548 +- Replace old args for ``active_cells`` in EM static functions by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1550 +- Implement gravity equivalent sources with Choclo as engine by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1527 +- Implement tmi derivatives with Choclo in magnetic simulation by + `@santisoler `__ in https://github.com/simpeg/simpeg/pull/1553 +- Implement magnetic eq sources with Choclo by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1552 +- Update links in PR template by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1554 +- Default solver by `@jcapriot `__ in + https://github.com/simpeg/simpeg/pull/1511 +- Fixes for most recent geoana 0.7 by `@jcapriot `__ in + https://github.com/simpeg/simpeg/pull/1557 +- Numpy2.0 and discretize 0.11.0 updates by `@jcapriot `__ in + https://github.com/simpeg/simpeg/pull/1558 +- Add missing seeds by `@jcapriot `__ in + https://github.com/simpeg/simpeg/pull/1560 +- Make use of meshes’ ``cell_bounds`` property by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1559 +- Fix docstring of ``SmoothnessFullGradient`` by `@santisoler `__ in + https://github.com/simpeg/simpeg/pull/1562 +- Fix math in docstring of eigenvalue_by_power_iteration by `@santisoler `__ + in https://github.com/simpeg/simpeg/pull/1564 +- Only warn about default solver when set in simulations by `@santisoler `__ + in https://github.com/simpeg/simpeg/pull/1565 +- Augmented receivers for airborne NSEM by `@dccowan `__ in https://github.com/simpeg/simpeg/pull/1454 +- Try uploading all the coverage files at once. by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1569 +- Re-implement distance weighting and add a strategy comparison by `@thibaut-kobold `__ in https://github.com/simpeg/simpeg/pull/1310 +- Remove empymod dependency by `@jcapriot `__ in https://github.com/simpeg/simpeg/pull/1571 diff --git a/docs/content/release/index.rst b/docs/content/release/index.rst index 49daf1cfc9..bb9bef3492 100644 --- a/docs/content/release/index.rst +++ b/docs/content/release/index.rst @@ -5,6 +5,10 @@ Release Notes .. toctree:: :maxdepth: 2 + 0.23.0 <0.23.0-notes> + 0.22.2 <0.22.2-notes> + 0.22.1 <0.22.1-notes> + 0.22.0 <0.22.0-notes> 0.21.1 <0.21.1-notes> 0.21.0 <0.21.0-notes> 0.20.0 <0.20.0-notes> diff --git a/environment_test.yml b/environment.yml similarity index 50% rename from environment_test.yml rename to environment.yml index 84940f92d6..26fd37631c 100644 --- a/environment_test.yml +++ b/environment.yml @@ -1,49 +1,66 @@ -name: simpeg-test +name: simpeg-dev channels: - conda-forge dependencies: - - numpy>=1.20 +# dependencies + - python=3.11 + - numpy>=1.22 - scipy>=1.8 - - scikit-learn>=1.2 - - pymatsolver>=0.2 - - matplotlib - - discretize>=0.10 - - geoana>=0.5.0 - - empymod>=2.0.0 - - setuptools_scm - - pandas + - pymatsolver>=0.3 + - matplotlib-base + - discretize>=0.11 + - geoana>=0.7 + - libdlf + +# solver +# uncomment the next line if you are on an intel platform +# - pydiso # if on intel pc +# uncomment this line if you want to install mumps solvers +# - python-mumps + +# optional dependencies - dask - zarr - - fsspec - - jupyter - - h5py + - fsspec>=0.3.3 + - choclo>=0.3.0 + - scooby + - plotly + - scikit-learn>=1.2 + - pandas + +# documentation building - sphinx - sphinx-gallery>=0.1.13 - sphinxcontrib-apidoc - pydata-sphinx-theme + - empymod>=2.0.0 - nbsphinx - numpydoc - pillow - - pylint - sympy - - wheel - - pytest - - pytest-cov - - toolz - - twine - memory_profiler - - plotly - - pyvista - - pip - python-kaleido - # Optional dependencies - - choclo - # Linters and code style + - h5py + +# testing + - pytest + - pytest-cov + +# style checking - pre-commit - black==24.3.0 - flake8==7.0.0 + - flake8-pyproject==1.2.3 - flake8-bugbear==23.12.2 - flake8-builtins==2.2.0 - flake8-mutable==1.2.0 - flake8-rst-docstrings==0.3.0 - flake8-docstrings==1.7.0 + +# recommended + - jupyter + - pyvista + + - pip + - pip: + - zizmor # lint GitHub Actions workflows diff --git a/examples/01-maps/plot_mesh2mesh.py b/examples/01-maps/plot_mesh2mesh.py index b5621e5ae2..1e76d511ac 100644 --- a/examples/01-maps/plot_mesh2mesh.py +++ b/examples/01-maps/plot_mesh2mesh.py @@ -15,7 +15,7 @@ def run(plotIt=True): h1 = utils.unpack_widths([(6, 7, -1.5), (6, 10), (6, 7, 1.5)]) h1 = h1 / h1.sum() M2 = discretize.TensorMesh([h1, h1]) - V = utils.model_builder.create_random_model(M.vnC, seed=79, its=50) + V = utils.model_builder.create_random_model(M.vnC, random_seed=79, its=50) v = utils.mkvc(V) modh = maps.Mesh2Mesh([M, M2]) modH = maps.Mesh2Mesh([M2, M]) diff --git a/examples/01-maps/plot_sumMap.py b/examples/01-maps/plot_sumMap.py index 7cbc4f89c5..fd479a9f6d 100644 --- a/examples/01-maps/plot_sumMap.py +++ b/examples/01-maps/plot_sumMap.py @@ -96,7 +96,7 @@ def run(plotIt=True): mesh, survey=survey, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="forward_only", ) @@ -117,7 +117,7 @@ def run(plotIt=True): # Create the forward model operator prob = magnetics.Simulation3DIntegral( - mesh, survey=survey, chiMap=sumMap, ind_active=actv, store_sensitivities="ram" + mesh, survey=survey, chiMap=sumMap, active_cells=actv, store_sensitivities="ram" ) # Make sensitivity weighting @@ -175,7 +175,8 @@ def run(plotIt=True): # Here is where the norms are applied # Use pick a threshold parameter empirically based on the distribution of # model parameters - IRLS = directives.Update_IRLS(f_min_change=1e-3, minGNiter=1) + IRLS = directives.UpdateIRLS(f_min_change=1e-3) + update_Jacobi = directives.UpdatePreconditioner() inv = inversion.BaseInversion(invProb, directiveList=[IRLS, betaest, update_Jacobi]) diff --git a/examples/02-gravity/plot_inv_grav_tiled.py b/examples/02-gravity/plot_inv_grav_tiled.py index f5676a5938..e4ba8823a8 100644 --- a/examples/02-gravity/plot_inv_grav_tiled.py +++ b/examples/02-gravity/plot_inv_grav_tiled.py @@ -138,7 +138,7 @@ # Create the forward simulation for the global dataset simulation = gravity.simulation.Simulation3DIntegral( - survey=survey, mesh=mesh, rhoMap=idenMap, ind_active=activeCells + survey=survey, mesh=mesh, rhoMap=idenMap, active_cells=activeCells ) # Compute linear forward operator and compute some data @@ -166,7 +166,7 @@ survey=local_survey, mesh=local_meshes[ii], rhoMap=tile_map, - ind_active=local_actives, + active_cells=local_actives, sensitivity_path=os.path.join("Inversion", f"Tile{ii}.zarr"), ) @@ -236,11 +236,11 @@ # Here is where the norms are applied # Use a threshold parameter empirically based on the distribution of # model parameters -update_IRLS = directives.Update_IRLS( +update_IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=0, - coolEpsFact=1.5, - beta_tol=1e-2, + irls_cooling_factor=1.5, + misfit_tolerance=1e-2, ) saveDict = directives.SaveOutputEveryIteration(save_txt=False) update_Jacobi = directives.UpdatePreconditioner() diff --git a/examples/03-magnetics/plot_inv_mag_MVI_Sparse_TreeMesh.py b/examples/03-magnetics/plot_inv_mag_MVI_Sparse_TreeMesh.py index c9e1ab7b4d..9987eceb44 100644 --- a/examples/03-magnetics/plot_inv_mag_MVI_Sparse_TreeMesh.py +++ b/examples/03-magnetics/plot_inv_mag_MVI_Sparse_TreeMesh.py @@ -1,8 +1,8 @@ """ -Magnetic inversion on a TreeMesh -================================ +Magnetic inversion on a TreeMesh with remanence +=============================================== -In this example, we demonstrate the use of a Magnetic Vector Inverison +In this example, we demonstrate the use of a Magnetic Vector Inversion on 3D TreeMesh for the inversion of magnetics affected by remanence. The mesh is auto-generated based on the position of the observation locations and topography. @@ -11,8 +11,7 @@ Cartesian coordinate system, and second for a compact model using the Spherical formulation. -The inverse problem uses the :class:'simpeg.regularization.Sparse' -that +The inverse problem uses the :class:`simpeg.regularization.Sparse`. """ @@ -30,7 +29,7 @@ from simpeg import utils from simpeg.utils import mkvc -from discretize.utils import active_from_xyz, mesh_builder_xyz, refine_tree_xyz +from discretize.utils import active_from_xyz, mesh_builder_xyz from simpeg.potential_fields import magnetics import scipy as sp import numpy as np @@ -112,9 +111,7 @@ mesh = mesh_builder_xyz( xyzLoc, h, padding_distance=padDist, depth_core=100, mesh_type="tree" ) -mesh = refine_tree_xyz( - mesh, topo, method="surface", octree_levels=[4, 4], finalize=True -) +mesh.refine_surface(topo, padding_cells_by_level=[4, 4], finalize=True) # Define an active cells from topo @@ -156,7 +153,7 @@ # Create the simulation simulation = magnetics.simulation.Simulation3DIntegral( - survey=survey, mesh=mesh, chiMap=idenMap, ind_active=actv, model_type="vector" + survey=survey, mesh=mesh, chiMap=idenMap, active_cells=actv, model_type="vector" ) # Compute some data and add some random noise @@ -260,7 +257,9 @@ # Here is where the norms are applied # Use a threshold parameter empirically based on the distribution of # model parameters -IRLS = directives.Update_IRLS(f_min_change=1e-3, max_irls_iterations=2, beta_tol=5e-1) +IRLS = directives.UpdateIRLS( + f_min_change=1e-3, max_irls_iterations=2, misfit_tolerance=5e-1 +) # Pre-conditioner update_Jacobi = directives.UpdatePreconditioner() @@ -344,16 +343,14 @@ invProb = inverse_problem.BaseInvProblem(dmis, reg, opt, beta=beta) # Here is where the norms are applied -irls = directives.Update_IRLS( +irls = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=20, - minGNiter=1, - beta_tol=0.5, - coolingRate=1, - coolEps_q=True, - sphericalDomain=True, + misfit_tolerance=0.5, +) +scale_spherical = directives.SphericalUnitsWeights( + amplitude=wires.amp, angles=[reg_t, reg_p] ) - # Special directive specific to the mag amplitude problem. The sensitivity # weights are updated between each iteration. spherical_projection = directives.ProjectSphericalBounds() @@ -362,7 +359,13 @@ inv = inversion.BaseInversion( invProb, - directiveList=[spherical_projection, irls, sensitivity_weights, update_Jacobi], + directiveList=[ + scale_spherical, + spherical_projection, + irls, + sensitivity_weights, + update_Jacobi, + ], ) mrec_MVI_S = inv.run(m_start) diff --git a/examples/03-magnetics/plot_inv_mag_MVI_VectorAmplitude.py b/examples/03-magnetics/plot_inv_mag_MVI_VectorAmplitude.py index edd69836d2..993acee2e8 100644 --- a/examples/03-magnetics/plot_inv_mag_MVI_VectorAmplitude.py +++ b/examples/03-magnetics/plot_inv_mag_MVI_VectorAmplitude.py @@ -2,11 +2,11 @@ Magnetic inversion on a TreeMesh ================================ -In this example, we demonstrate the use of a Magnetic Vector Inverison +In this example, we demonstrate the use of a Magnetic Vector Inversion on 3D TreeMesh for the inversion of magnetic data. -The inverse problem uses the :class:'simpeg.regularization.VectorAmplitude' -regularization borrowed from ... +The inverse problem uses the :class:`simpeg.regularization.VectorAmplitude` +regularization. """ @@ -123,7 +123,7 @@ # Create the simulation simulation = magnetics.simulation.Simulation3DIntegral( - survey=survey, mesh=mesh, chiMap=idenMap, ind_active=actv, model_type="vector" + survey=survey, mesh=mesh, chiMap=idenMap, active_cells=actv, model_type="vector" ) # Compute some data and add some random noise @@ -183,7 +183,9 @@ sensitivity_weights = directives.UpdateSensitivityWeights() # Here is where the norms are applied -IRLS = directives.Update_IRLS(f_min_change=1e-3, max_irls_iterations=10, beta_tol=5e-1) +IRLS = directives.UpdateIRLS( + f_min_change=1e-3, max_irls_iterations=10, misfit_tolerance=5e-1 +) # Pre-conditioner update_Jacobi = directives.UpdatePreconditioner() diff --git a/examples/03-magnetics/plot_inv_mag_nonLinear_Amplitude.py b/examples/03-magnetics/plot_inv_mag_nonLinear_Amplitude.py index d114a30609..b205152c1d 100644 --- a/examples/03-magnetics/plot_inv_mag_nonLinear_Amplitude.py +++ b/examples/03-magnetics/plot_inv_mag_nonLinear_Amplitude.py @@ -152,7 +152,7 @@ survey=survey, mesh=mesh, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="forward_only", ) simulation.M = M_xyz @@ -225,7 +225,11 @@ # Create static map simulation = magnetics.simulation.Simulation3DIntegral( - mesh=mesh, survey=survey, chiMap=idenMap, ind_active=surf, store_sensitivities="ram" + mesh=mesh, + survey=survey, + chiMap=idenMap, + active_cells=surf, + store_sensitivities="ram", ) wr = simulation.getJtJdiag(mstart) ** 0.5 @@ -253,9 +257,10 @@ # Target misfit to stop the inversion, # try to fit as much as possible of the signal, we don't want to lose anything -IRLS = directives.Update_IRLS( - f_min_change=1e-3, minGNiter=1, beta_tol=1e-1, max_irls_iterations=5 +IRLS = directives.UpdateIRLS( + f_min_change=1e-3, misfit_tolerance=1e-1, max_irls_iterations=5 ) + update_Jacobi = directives.UpdatePreconditioner() # Put all the parts together inv = inversion.BaseInversion(invProb, directiveList=[betaest, IRLS, update_Jacobi]) @@ -281,7 +286,11 @@ surveyAmp = magnetics.survey.Survey(srcField) simulation = magnetics.simulation.Simulation3DIntegral( - mesh=mesh, survey=surveyAmp, chiMap=idenMap, ind_active=surf, is_amplitude_data=True + mesh=mesh, + survey=surveyAmp, + chiMap=idenMap, + active_cells=surf, + is_amplitude_data=True, ) bAmp = simulation.fields(mrec) @@ -339,7 +348,11 @@ # Create the forward model operator simulation = magnetics.simulation.Simulation3DIntegral( - survey=surveyAmp, mesh=mesh, chiMap=idenMap, ind_active=actv, is_amplitude_data=True + survey=surveyAmp, + mesh=mesh, + chiMap=idenMap, + active_cells=actv, + is_amplitude_data=True, ) data_obj = data.Data(survey, dobs=bAmp, noise_floor=wd) @@ -363,13 +376,7 @@ betaest = directives.BetaEstimate_ByEig(beta0_ratio=1) # Specify the sparse norms -IRLS = directives.Update_IRLS( - max_irls_iterations=10, - f_min_change=1e-3, - minGNiter=1, - coolingRate=1, - beta_search=False, -) +IRLS = directives.UpdateIRLS(max_irls_iterations=10, f_min_change=1e-3) # Special directive specific to the mag amplitude problem. The sensitivity # weights are updated between each iteration. @@ -378,7 +385,8 @@ # Put all together inv = inversion.BaseInversion( - invProb, directiveList=[update_SensWeight, betaest, IRLS, update_Jacobi] + invProb, + directiveList=[update_SensWeight, betaest, IRLS, update_Jacobi], ) # Invert diff --git a/examples/04-dcip/dcr3d/topo_xyz.txt b/examples/04-dcip/dcr3d/topo_xyz.txt deleted file mode 100644 index 7c149205d2..0000000000 --- a/examples/04-dcip/dcr3d/topo_xyz.txt +++ /dev/null @@ -1,19881 +0,0 @@ --2.1000e+03 -2.0000e+03 6.9049e+00 --2.1000e+03 -1.9714e+03 6.8784e+00 --2.1000e+03 -1.9429e+03 6.8516e+00 --2.1000e+03 -1.9143e+03 6.8245e+00 --2.1000e+03 -1.8857e+03 6.7972e+00 --2.1000e+03 -1.8571e+03 6.7697e+00 --2.1000e+03 -1.8286e+03 6.7419e+00 --2.1000e+03 -1.8000e+03 6.7139e+00 --2.1000e+03 -1.7714e+03 6.6857e+00 --2.1000e+03 -1.7429e+03 6.6573e+00 --2.1000e+03 -1.7143e+03 6.6286e+00 --2.1000e+03 -1.6857e+03 6.5998e+00 --2.1000e+03 -1.6571e+03 6.5707e+00 --2.1000e+03 -1.6286e+03 6.5415e+00 --2.1000e+03 -1.6000e+03 6.5121e+00 --2.1000e+03 -1.5714e+03 6.4825e+00 --2.1000e+03 -1.5429e+03 6.4528e+00 --2.1000e+03 -1.5143e+03 6.4230e+00 --2.1000e+03 -1.4857e+03 6.3930e+00 --2.1000e+03 -1.4571e+03 6.3629e+00 --2.1000e+03 -1.4286e+03 6.3327e+00 --2.1000e+03 -1.4000e+03 6.3024e+00 --2.1000e+03 -1.3714e+03 6.2720e+00 --2.1000e+03 -1.3429e+03 6.2416e+00 --2.1000e+03 -1.3143e+03 6.2112e+00 --2.1000e+03 -1.2857e+03 6.1808e+00 --2.1000e+03 -1.2571e+03 6.1503e+00 --2.1000e+03 -1.2286e+03 6.1199e+00 --2.1000e+03 -1.2000e+03 6.0896e+00 --2.1000e+03 -1.1714e+03 6.0593e+00 --2.1000e+03 -1.1429e+03 6.0291e+00 --2.1000e+03 -1.1143e+03 5.9990e+00 --2.1000e+03 -1.0857e+03 5.9691e+00 --2.1000e+03 -1.0571e+03 5.9394e+00 --2.1000e+03 -1.0286e+03 5.9099e+00 --2.1000e+03 -1.0000e+03 5.8806e+00 --2.1000e+03 -9.7143e+02 5.8516e+00 --2.1000e+03 -9.4286e+02 5.8229e+00 --2.1000e+03 -9.1429e+02 5.7945e+00 --2.1000e+03 -8.8571e+02 5.7665e+00 --2.1000e+03 -8.5714e+02 5.7389e+00 --2.1000e+03 -8.2857e+02 5.7117e+00 --2.1000e+03 -8.0000e+02 5.6849e+00 --2.1000e+03 -7.7143e+02 5.6587e+00 --2.1000e+03 -7.4286e+02 5.6330e+00 --2.1000e+03 -7.1429e+02 5.6079e+00 --2.1000e+03 -6.8571e+02 5.5834e+00 --2.1000e+03 -6.5714e+02 5.5596e+00 --2.1000e+03 -6.2857e+02 5.5364e+00 --2.1000e+03 -6.0000e+02 5.5140e+00 --2.1000e+03 -5.7143e+02 5.4923e+00 --2.1000e+03 -5.4286e+02 5.4714e+00 --2.1000e+03 -5.1429e+02 5.4513e+00 --2.1000e+03 -4.8571e+02 5.4321e+00 --2.1000e+03 -4.5714e+02 5.4137e+00 --2.1000e+03 -4.2857e+02 5.3963e+00 --2.1000e+03 -4.0000e+02 5.3799e+00 --2.1000e+03 -3.7143e+02 5.3645e+00 --2.1000e+03 -3.4286e+02 5.3500e+00 --2.1000e+03 -3.1429e+02 5.3366e+00 --2.1000e+03 -2.8571e+02 5.3243e+00 --2.1000e+03 -2.5714e+02 5.3131e+00 --2.1000e+03 -2.2857e+02 5.3030e+00 --2.1000e+03 -2.0000e+02 5.2941e+00 --2.1000e+03 -1.7143e+02 5.2863e+00 --2.1000e+03 -1.4286e+02 5.2796e+00 --2.1000e+03 -1.1429e+02 5.2742e+00 --2.1000e+03 -8.5714e+01 5.2700e+00 --2.1000e+03 -5.7143e+01 5.2669e+00 --2.1000e+03 -2.8571e+01 5.2651e+00 --2.1000e+03 0.0000e+00 5.2645e+00 --2.1000e+03 2.8571e+01 5.2651e+00 --2.1000e+03 5.7143e+01 5.2669e+00 --2.1000e+03 8.5714e+01 5.2700e+00 --2.1000e+03 1.1429e+02 5.2742e+00 --2.1000e+03 1.4286e+02 5.2796e+00 --2.1000e+03 1.7143e+02 5.2863e+00 --2.1000e+03 2.0000e+02 5.2941e+00 --2.1000e+03 2.2857e+02 5.3030e+00 --2.1000e+03 2.5714e+02 5.3131e+00 --2.1000e+03 2.8571e+02 5.3243e+00 --2.1000e+03 3.1429e+02 5.3366e+00 --2.1000e+03 3.4286e+02 5.3500e+00 --2.1000e+03 3.7143e+02 5.3645e+00 --2.1000e+03 4.0000e+02 5.3799e+00 --2.1000e+03 4.2857e+02 5.3963e+00 --2.1000e+03 4.5714e+02 5.4137e+00 --2.1000e+03 4.8571e+02 5.4321e+00 --2.1000e+03 5.1429e+02 5.4513e+00 --2.1000e+03 5.4286e+02 5.4714e+00 --2.1000e+03 5.7143e+02 5.4923e+00 --2.1000e+03 6.0000e+02 5.5140e+00 --2.1000e+03 6.2857e+02 5.5364e+00 --2.1000e+03 6.5714e+02 5.5596e+00 --2.1000e+03 6.8571e+02 5.5834e+00 --2.1000e+03 7.1429e+02 5.6079e+00 --2.1000e+03 7.4286e+02 5.6330e+00 --2.1000e+03 7.7143e+02 5.6587e+00 --2.1000e+03 8.0000e+02 5.6849e+00 --2.1000e+03 8.2857e+02 5.7117e+00 --2.1000e+03 8.5714e+02 5.7389e+00 --2.1000e+03 8.8571e+02 5.7665e+00 --2.1000e+03 9.1429e+02 5.7945e+00 --2.1000e+03 9.4286e+02 5.8229e+00 --2.1000e+03 9.7143e+02 5.8516e+00 --2.1000e+03 1.0000e+03 5.8806e+00 --2.1000e+03 1.0286e+03 5.9099e+00 --2.1000e+03 1.0571e+03 5.9394e+00 --2.1000e+03 1.0857e+03 5.9691e+00 --2.1000e+03 1.1143e+03 5.9990e+00 --2.1000e+03 1.1429e+03 6.0291e+00 --2.1000e+03 1.1714e+03 6.0593e+00 --2.1000e+03 1.2000e+03 6.0896e+00 --2.1000e+03 1.2286e+03 6.1199e+00 --2.1000e+03 1.2571e+03 6.1503e+00 --2.1000e+03 1.2857e+03 6.1808e+00 --2.1000e+03 1.3143e+03 6.2112e+00 --2.1000e+03 1.3429e+03 6.2416e+00 --2.1000e+03 1.3714e+03 6.2720e+00 --2.1000e+03 1.4000e+03 6.3024e+00 --2.1000e+03 1.4286e+03 6.3327e+00 --2.1000e+03 1.4571e+03 6.3629e+00 --2.1000e+03 1.4857e+03 6.3930e+00 --2.1000e+03 1.5143e+03 6.4230e+00 --2.1000e+03 1.5429e+03 6.4528e+00 --2.1000e+03 1.5714e+03 6.4825e+00 --2.1000e+03 1.6000e+03 6.5121e+00 --2.1000e+03 1.6286e+03 6.5415e+00 --2.1000e+03 1.6571e+03 6.5707e+00 --2.1000e+03 1.6857e+03 6.5998e+00 --2.1000e+03 1.7143e+03 6.6286e+00 --2.1000e+03 1.7429e+03 6.6573e+00 --2.1000e+03 1.7714e+03 6.6857e+00 --2.1000e+03 1.8000e+03 6.7139e+00 --2.1000e+03 1.8286e+03 6.7419e+00 --2.1000e+03 1.8571e+03 6.7697e+00 --2.1000e+03 1.8857e+03 6.7972e+00 --2.1000e+03 1.9143e+03 6.8245e+00 --2.1000e+03 1.9429e+03 6.8516e+00 --2.1000e+03 1.9714e+03 6.8784e+00 --2.1000e+03 2.0000e+03 6.9049e+00 --2.0700e+03 -2.0000e+03 6.8756e+00 --2.0700e+03 -1.9714e+03 6.8483e+00 --2.0700e+03 -1.9429e+03 6.8208e+00 --2.0700e+03 -1.9143e+03 6.7930e+00 --2.0700e+03 -1.8857e+03 6.7649e+00 --2.0700e+03 -1.8571e+03 6.7366e+00 --2.0700e+03 -1.8286e+03 6.7080e+00 --2.0700e+03 -1.8000e+03 6.6792e+00 --2.0700e+03 -1.7714e+03 6.6502e+00 --2.0700e+03 -1.7429e+03 6.6209e+00 --2.0700e+03 -1.7143e+03 6.5913e+00 --2.0700e+03 -1.6857e+03 6.5616e+00 --2.0700e+03 -1.6571e+03 6.5316e+00 --2.0700e+03 -1.6286e+03 6.5015e+00 --2.0700e+03 -1.6000e+03 6.4711e+00 --2.0700e+03 -1.5714e+03 6.4406e+00 --2.0700e+03 -1.5429e+03 6.4098e+00 --2.0700e+03 -1.5143e+03 6.3790e+00 --2.0700e+03 -1.4857e+03 6.3479e+00 --2.0700e+03 -1.4571e+03 6.3168e+00 --2.0700e+03 -1.4286e+03 6.2855e+00 --2.0700e+03 -1.4000e+03 6.2541e+00 --2.0700e+03 -1.3714e+03 6.2227e+00 --2.0700e+03 -1.3429e+03 6.1911e+00 --2.0700e+03 -1.3143e+03 6.1595e+00 --2.0700e+03 -1.2857e+03 6.1279e+00 --2.0700e+03 -1.2571e+03 6.0963e+00 --2.0700e+03 -1.2286e+03 6.0647e+00 --2.0700e+03 -1.2000e+03 6.0331e+00 --2.0700e+03 -1.1714e+03 6.0016e+00 --2.0700e+03 -1.1429e+03 5.9702e+00 --2.0700e+03 -1.1143e+03 5.9389e+00 --2.0700e+03 -1.0857e+03 5.9077e+00 --2.0700e+03 -1.0571e+03 5.8768e+00 --2.0700e+03 -1.0286e+03 5.8460e+00 --2.0700e+03 -1.0000e+03 5.8154e+00 --2.0700e+03 -9.7143e+02 5.7851e+00 --2.0700e+03 -9.4286e+02 5.7551e+00 --2.0700e+03 -9.1429e+02 5.7254e+00 --2.0700e+03 -8.8571e+02 5.6961e+00 --2.0700e+03 -8.5714e+02 5.6672e+00 --2.0700e+03 -8.2857e+02 5.6388e+00 --2.0700e+03 -8.0000e+02 5.6108e+00 --2.0700e+03 -7.7143e+02 5.5833e+00 --2.0700e+03 -7.4286e+02 5.5564e+00 --2.0700e+03 -7.1429e+02 5.5300e+00 --2.0700e+03 -6.8571e+02 5.5043e+00 --2.0700e+03 -6.5714e+02 5.4793e+00 --2.0700e+03 -6.2857e+02 5.4550e+00 --2.0700e+03 -6.0000e+02 5.4314e+00 --2.0700e+03 -5.7143e+02 5.4086e+00 --2.0700e+03 -5.4286e+02 5.3866e+00 --2.0700e+03 -5.1429e+02 5.3655e+00 --2.0700e+03 -4.8571e+02 5.3452e+00 --2.0700e+03 -4.5714e+02 5.3260e+00 --2.0700e+03 -4.2857e+02 5.3076e+00 --2.0700e+03 -4.0000e+02 5.2903e+00 --2.0700e+03 -3.7143e+02 5.2740e+00 --2.0700e+03 -3.4286e+02 5.2588e+00 --2.0700e+03 -3.1429e+02 5.2447e+00 --2.0700e+03 -2.8571e+02 5.2317e+00 --2.0700e+03 -2.5714e+02 5.2199e+00 --2.0700e+03 -2.2857e+02 5.2093e+00 --2.0700e+03 -2.0000e+02 5.1998e+00 --2.0700e+03 -1.7143e+02 5.1916e+00 --2.0700e+03 -1.4286e+02 5.1846e+00 --2.0700e+03 -1.1429e+02 5.1788e+00 --2.0700e+03 -8.5714e+01 5.1744e+00 --2.0700e+03 -5.7143e+01 5.1712e+00 --2.0700e+03 -2.8571e+01 5.1692e+00 --2.0700e+03 0.0000e+00 5.1686e+00 --2.0700e+03 2.8571e+01 5.1692e+00 --2.0700e+03 5.7143e+01 5.1712e+00 --2.0700e+03 8.5714e+01 5.1744e+00 --2.0700e+03 1.1429e+02 5.1788e+00 --2.0700e+03 1.4286e+02 5.1846e+00 --2.0700e+03 1.7143e+02 5.1916e+00 --2.0700e+03 2.0000e+02 5.1998e+00 --2.0700e+03 2.2857e+02 5.2093e+00 --2.0700e+03 2.5714e+02 5.2199e+00 --2.0700e+03 2.8571e+02 5.2317e+00 --2.0700e+03 3.1429e+02 5.2447e+00 --2.0700e+03 3.4286e+02 5.2588e+00 --2.0700e+03 3.7143e+02 5.2740e+00 --2.0700e+03 4.0000e+02 5.2903e+00 --2.0700e+03 4.2857e+02 5.3076e+00 --2.0700e+03 4.5714e+02 5.3260e+00 --2.0700e+03 4.8571e+02 5.3452e+00 --2.0700e+03 5.1429e+02 5.3655e+00 --2.0700e+03 5.4286e+02 5.3866e+00 --2.0700e+03 5.7143e+02 5.4086e+00 --2.0700e+03 6.0000e+02 5.4314e+00 --2.0700e+03 6.2857e+02 5.4550e+00 --2.0700e+03 6.5714e+02 5.4793e+00 --2.0700e+03 6.8571e+02 5.5043e+00 --2.0700e+03 7.1429e+02 5.5300e+00 --2.0700e+03 7.4286e+02 5.5564e+00 --2.0700e+03 7.7143e+02 5.5833e+00 --2.0700e+03 8.0000e+02 5.6108e+00 --2.0700e+03 8.2857e+02 5.6388e+00 --2.0700e+03 8.5714e+02 5.6672e+00 --2.0700e+03 8.8571e+02 5.6961e+00 --2.0700e+03 9.1429e+02 5.7254e+00 --2.0700e+03 9.4286e+02 5.7551e+00 --2.0700e+03 9.7143e+02 5.7851e+00 --2.0700e+03 1.0000e+03 5.8154e+00 --2.0700e+03 1.0286e+03 5.8460e+00 --2.0700e+03 1.0571e+03 5.8768e+00 --2.0700e+03 1.0857e+03 5.9077e+00 --2.0700e+03 1.1143e+03 5.9389e+00 --2.0700e+03 1.1429e+03 5.9702e+00 --2.0700e+03 1.1714e+03 6.0016e+00 --2.0700e+03 1.2000e+03 6.0331e+00 --2.0700e+03 1.2286e+03 6.0647e+00 --2.0700e+03 1.2571e+03 6.0963e+00 --2.0700e+03 1.2857e+03 6.1279e+00 --2.0700e+03 1.3143e+03 6.1595e+00 --2.0700e+03 1.3429e+03 6.1911e+00 --2.0700e+03 1.3714e+03 6.2227e+00 --2.0700e+03 1.4000e+03 6.2541e+00 --2.0700e+03 1.4286e+03 6.2855e+00 --2.0700e+03 1.4571e+03 6.3168e+00 --2.0700e+03 1.4857e+03 6.3479e+00 --2.0700e+03 1.5143e+03 6.3790e+00 --2.0700e+03 1.5429e+03 6.4098e+00 --2.0700e+03 1.5714e+03 6.4406e+00 --2.0700e+03 1.6000e+03 6.4711e+00 --2.0700e+03 1.6286e+03 6.5015e+00 --2.0700e+03 1.6571e+03 6.5316e+00 --2.0700e+03 1.6857e+03 6.5616e+00 --2.0700e+03 1.7143e+03 6.5913e+00 --2.0700e+03 1.7429e+03 6.6209e+00 --2.0700e+03 1.7714e+03 6.6502e+00 --2.0700e+03 1.8000e+03 6.6792e+00 --2.0700e+03 1.8286e+03 6.7080e+00 --2.0700e+03 1.8571e+03 6.7366e+00 --2.0700e+03 1.8857e+03 6.7649e+00 --2.0700e+03 1.9143e+03 6.7930e+00 --2.0700e+03 1.9429e+03 6.8208e+00 --2.0700e+03 1.9714e+03 6.8483e+00 --2.0700e+03 2.0000e+03 6.8756e+00 --2.0400e+03 -2.0000e+03 6.8459e+00 --2.0400e+03 -1.9714e+03 6.8179e+00 --2.0400e+03 -1.9429e+03 6.7897e+00 --2.0400e+03 -1.9143e+03 6.7611e+00 --2.0400e+03 -1.8857e+03 6.7322e+00 --2.0400e+03 -1.8571e+03 6.7031e+00 --2.0400e+03 -1.8286e+03 6.6737e+00 --2.0400e+03 -1.8000e+03 6.6440e+00 --2.0400e+03 -1.7714e+03 6.6141e+00 --2.0400e+03 -1.7429e+03 6.5839e+00 --2.0400e+03 -1.7143e+03 6.5535e+00 --2.0400e+03 -1.6857e+03 6.5228e+00 --2.0400e+03 -1.6571e+03 6.4919e+00 --2.0400e+03 -1.6286e+03 6.4607e+00 --2.0400e+03 -1.6000e+03 6.4294e+00 --2.0400e+03 -1.5714e+03 6.3978e+00 --2.0400e+03 -1.5429e+03 6.3660e+00 --2.0400e+03 -1.5143e+03 6.3341e+00 --2.0400e+03 -1.4857e+03 6.3020e+00 --2.0400e+03 -1.4571e+03 6.2697e+00 --2.0400e+03 -1.4286e+03 6.2373e+00 --2.0400e+03 -1.4000e+03 6.2048e+00 --2.0400e+03 -1.3714e+03 6.1722e+00 --2.0400e+03 -1.3429e+03 6.1395e+00 --2.0400e+03 -1.3143e+03 6.1067e+00 --2.0400e+03 -1.2857e+03 6.0738e+00 --2.0400e+03 -1.2571e+03 6.0410e+00 --2.0400e+03 -1.2286e+03 6.0081e+00 --2.0400e+03 -1.2000e+03 5.9753e+00 --2.0400e+03 -1.1714e+03 5.9425e+00 --2.0400e+03 -1.1429e+03 5.9098e+00 --2.0400e+03 -1.1143e+03 5.8772e+00 --2.0400e+03 -1.0857e+03 5.8447e+00 --2.0400e+03 -1.0571e+03 5.8123e+00 --2.0400e+03 -1.0286e+03 5.7802e+00 --2.0400e+03 -1.0000e+03 5.7483e+00 --2.0400e+03 -9.7143e+02 5.7166e+00 --2.0400e+03 -9.4286e+02 5.6853e+00 --2.0400e+03 -9.1429e+02 5.6543e+00 --2.0400e+03 -8.8571e+02 5.6236e+00 --2.0400e+03 -8.5714e+02 5.5933e+00 --2.0400e+03 -8.2857e+02 5.5635e+00 --2.0400e+03 -8.0000e+02 5.5342e+00 --2.0400e+03 -7.7143e+02 5.5054e+00 --2.0400e+03 -7.4286e+02 5.4771e+00 --2.0400e+03 -7.1429e+02 5.4495e+00 --2.0400e+03 -6.8571e+02 5.4225e+00 --2.0400e+03 -6.5714e+02 5.3962e+00 --2.0400e+03 -6.2857e+02 5.3706e+00 --2.0400e+03 -6.0000e+02 5.3458e+00 --2.0400e+03 -5.7143e+02 5.3218e+00 --2.0400e+03 -5.4286e+02 5.2987e+00 --2.0400e+03 -5.1429e+02 5.2764e+00 --2.0400e+03 -4.8571e+02 5.2551e+00 --2.0400e+03 -4.5714e+02 5.2348e+00 --2.0400e+03 -4.2857e+02 5.2155e+00 --2.0400e+03 -4.0000e+02 5.1973e+00 --2.0400e+03 -3.7143e+02 5.1801e+00 --2.0400e+03 -3.4286e+02 5.1640e+00 --2.0400e+03 -3.1429e+02 5.1492e+00 --2.0400e+03 -2.8571e+02 5.1355e+00 --2.0400e+03 -2.5714e+02 5.1230e+00 --2.0400e+03 -2.2857e+02 5.1117e+00 --2.0400e+03 -2.0000e+02 5.1017e+00 --2.0400e+03 -1.7143e+02 5.0930e+00 --2.0400e+03 -1.4286e+02 5.0857e+00 --2.0400e+03 -1.1429e+02 5.0796e+00 --2.0400e+03 -8.5714e+01 5.0748e+00 --2.0400e+03 -5.7143e+01 5.0715e+00 --2.0400e+03 -2.8571e+01 5.0694e+00 --2.0400e+03 0.0000e+00 5.0687e+00 --2.0400e+03 2.8571e+01 5.0694e+00 --2.0400e+03 5.7143e+01 5.0715e+00 --2.0400e+03 8.5714e+01 5.0748e+00 --2.0400e+03 1.1429e+02 5.0796e+00 --2.0400e+03 1.4286e+02 5.0857e+00 --2.0400e+03 1.7143e+02 5.0930e+00 --2.0400e+03 2.0000e+02 5.1017e+00 --2.0400e+03 2.2857e+02 5.1117e+00 --2.0400e+03 2.5714e+02 5.1230e+00 --2.0400e+03 2.8571e+02 5.1355e+00 --2.0400e+03 3.1429e+02 5.1492e+00 --2.0400e+03 3.4286e+02 5.1640e+00 --2.0400e+03 3.7143e+02 5.1801e+00 --2.0400e+03 4.0000e+02 5.1973e+00 --2.0400e+03 4.2857e+02 5.2155e+00 --2.0400e+03 4.5714e+02 5.2348e+00 --2.0400e+03 4.8571e+02 5.2551e+00 --2.0400e+03 5.1429e+02 5.2764e+00 --2.0400e+03 5.4286e+02 5.2987e+00 --2.0400e+03 5.7143e+02 5.3218e+00 --2.0400e+03 6.0000e+02 5.3458e+00 --2.0400e+03 6.2857e+02 5.3706e+00 --2.0400e+03 6.5714e+02 5.3962e+00 --2.0400e+03 6.8571e+02 5.4225e+00 --2.0400e+03 7.1429e+02 5.4495e+00 --2.0400e+03 7.4286e+02 5.4771e+00 --2.0400e+03 7.7143e+02 5.5054e+00 --2.0400e+03 8.0000e+02 5.5342e+00 --2.0400e+03 8.2857e+02 5.5635e+00 --2.0400e+03 8.5714e+02 5.5933e+00 --2.0400e+03 8.8571e+02 5.6236e+00 --2.0400e+03 9.1429e+02 5.6543e+00 --2.0400e+03 9.4286e+02 5.6853e+00 --2.0400e+03 9.7143e+02 5.7166e+00 --2.0400e+03 1.0000e+03 5.7483e+00 --2.0400e+03 1.0286e+03 5.7802e+00 --2.0400e+03 1.0571e+03 5.8123e+00 --2.0400e+03 1.0857e+03 5.8447e+00 --2.0400e+03 1.1143e+03 5.8772e+00 --2.0400e+03 1.1429e+03 5.9098e+00 --2.0400e+03 1.1714e+03 5.9425e+00 --2.0400e+03 1.2000e+03 5.9753e+00 --2.0400e+03 1.2286e+03 6.0081e+00 --2.0400e+03 1.2571e+03 6.0410e+00 --2.0400e+03 1.2857e+03 6.0738e+00 --2.0400e+03 1.3143e+03 6.1067e+00 --2.0400e+03 1.3429e+03 6.1395e+00 --2.0400e+03 1.3714e+03 6.1722e+00 --2.0400e+03 1.4000e+03 6.2048e+00 --2.0400e+03 1.4286e+03 6.2373e+00 --2.0400e+03 1.4571e+03 6.2697e+00 --2.0400e+03 1.4857e+03 6.3020e+00 --2.0400e+03 1.5143e+03 6.3341e+00 --2.0400e+03 1.5429e+03 6.3660e+00 --2.0400e+03 1.5714e+03 6.3978e+00 --2.0400e+03 1.6000e+03 6.4294e+00 --2.0400e+03 1.6286e+03 6.4607e+00 --2.0400e+03 1.6571e+03 6.4919e+00 --2.0400e+03 1.6857e+03 6.5228e+00 --2.0400e+03 1.7143e+03 6.5535e+00 --2.0400e+03 1.7429e+03 6.5839e+00 --2.0400e+03 1.7714e+03 6.6141e+00 --2.0400e+03 1.8000e+03 6.6440e+00 --2.0400e+03 1.8286e+03 6.6737e+00 --2.0400e+03 1.8571e+03 6.7031e+00 --2.0400e+03 1.8857e+03 6.7322e+00 --2.0400e+03 1.9143e+03 6.7611e+00 --2.0400e+03 1.9429e+03 6.7897e+00 --2.0400e+03 1.9714e+03 6.8179e+00 --2.0400e+03 2.0000e+03 6.8459e+00 --2.0100e+03 -2.0000e+03 6.8159e+00 --2.0100e+03 -1.9714e+03 6.7872e+00 --2.0100e+03 -1.9429e+03 6.7581e+00 --2.0100e+03 -1.9143e+03 6.7287e+00 --2.0100e+03 -1.8857e+03 6.6991e+00 --2.0100e+03 -1.8571e+03 6.6691e+00 --2.0100e+03 -1.8286e+03 6.6388e+00 --2.0100e+03 -1.8000e+03 6.6083e+00 --2.0100e+03 -1.7714e+03 6.5775e+00 --2.0100e+03 -1.7429e+03 6.5463e+00 --2.0100e+03 -1.7143e+03 6.5150e+00 --2.0100e+03 -1.6857e+03 6.4833e+00 --2.0100e+03 -1.6571e+03 6.4514e+00 --2.0100e+03 -1.6286e+03 6.4193e+00 --2.0100e+03 -1.6000e+03 6.3869e+00 --2.0100e+03 -1.5714e+03 6.3542e+00 --2.0100e+03 -1.5429e+03 6.3214e+00 --2.0100e+03 -1.5143e+03 6.2884e+00 --2.0100e+03 -1.4857e+03 6.2551e+00 --2.0100e+03 -1.4571e+03 6.2217e+00 --2.0100e+03 -1.4286e+03 6.1881e+00 --2.0100e+03 -1.4000e+03 6.1544e+00 --2.0100e+03 -1.3714e+03 6.1206e+00 --2.0100e+03 -1.3429e+03 6.0866e+00 --2.0100e+03 -1.3143e+03 6.0526e+00 --2.0100e+03 -1.2857e+03 6.0185e+00 --2.0100e+03 -1.2571e+03 5.9843e+00 --2.0100e+03 -1.2286e+03 5.9501e+00 --2.0100e+03 -1.2000e+03 5.9160e+00 --2.0100e+03 -1.1714e+03 5.8818e+00 --2.0100e+03 -1.1429e+03 5.8477e+00 --2.0100e+03 -1.1143e+03 5.8137e+00 --2.0100e+03 -1.0857e+03 5.7798e+00 --2.0100e+03 -1.0571e+03 5.7461e+00 --2.0100e+03 -1.0286e+03 5.7125e+00 --2.0100e+03 -1.0000e+03 5.6792e+00 --2.0100e+03 -9.7143e+02 5.6461e+00 --2.0100e+03 -9.4286e+02 5.6133e+00 --2.0100e+03 -9.1429e+02 5.5808e+00 --2.0100e+03 -8.8571e+02 5.5487e+00 --2.0100e+03 -8.5714e+02 5.5170e+00 --2.0100e+03 -8.2857e+02 5.4858e+00 --2.0100e+03 -8.0000e+02 5.4550e+00 --2.0100e+03 -7.7143e+02 5.4248e+00 --2.0100e+03 -7.4286e+02 5.3951e+00 --2.0100e+03 -7.1429e+02 5.3661e+00 --2.0100e+03 -6.8571e+02 5.3377e+00 --2.0100e+03 -6.5714e+02 5.3101e+00 --2.0100e+03 -6.2857e+02 5.2832e+00 --2.0100e+03 -6.0000e+02 5.2571e+00 --2.0100e+03 -5.7143e+02 5.2318e+00 --2.0100e+03 -5.4286e+02 5.2075e+00 --2.0100e+03 -5.1429e+02 5.1840e+00 --2.0100e+03 -4.8571e+02 5.1616e+00 --2.0100e+03 -4.5714e+02 5.1401e+00 --2.0100e+03 -4.2857e+02 5.1198e+00 --2.0100e+03 -4.0000e+02 5.1005e+00 --2.0100e+03 -3.7143e+02 5.0824e+00 --2.0100e+03 -3.4286e+02 5.0654e+00 --2.0100e+03 -3.1429e+02 5.0497e+00 --2.0100e+03 -2.8571e+02 5.0352e+00 --2.0100e+03 -2.5714e+02 5.0220e+00 --2.0100e+03 -2.2857e+02 5.0102e+00 --2.0100e+03 -2.0000e+02 4.9996e+00 --2.0100e+03 -1.7143e+02 4.9904e+00 --2.0100e+03 -1.4286e+02 4.9826e+00 --2.0100e+03 -1.1429e+02 4.9762e+00 --2.0100e+03 -8.5714e+01 4.9712e+00 --2.0100e+03 -5.7143e+01 4.9676e+00 --2.0100e+03 -2.8571e+01 4.9654e+00 --2.0100e+03 0.0000e+00 4.9647e+00 --2.0100e+03 2.8571e+01 4.9654e+00 --2.0100e+03 5.7143e+01 4.9676e+00 --2.0100e+03 8.5714e+01 4.9712e+00 --2.0100e+03 1.1429e+02 4.9762e+00 --2.0100e+03 1.4286e+02 4.9826e+00 --2.0100e+03 1.7143e+02 4.9904e+00 --2.0100e+03 2.0000e+02 4.9996e+00 --2.0100e+03 2.2857e+02 5.0102e+00 --2.0100e+03 2.5714e+02 5.0220e+00 --2.0100e+03 2.8571e+02 5.0352e+00 --2.0100e+03 3.1429e+02 5.0497e+00 --2.0100e+03 3.4286e+02 5.0654e+00 --2.0100e+03 3.7143e+02 5.0824e+00 --2.0100e+03 4.0000e+02 5.1005e+00 --2.0100e+03 4.2857e+02 5.1198e+00 --2.0100e+03 4.5714e+02 5.1401e+00 --2.0100e+03 4.8571e+02 5.1616e+00 --2.0100e+03 5.1429e+02 5.1840e+00 --2.0100e+03 5.4286e+02 5.2075e+00 --2.0100e+03 5.7143e+02 5.2318e+00 --2.0100e+03 6.0000e+02 5.2571e+00 --2.0100e+03 6.2857e+02 5.2832e+00 --2.0100e+03 6.5714e+02 5.3101e+00 --2.0100e+03 6.8571e+02 5.3377e+00 --2.0100e+03 7.1429e+02 5.3661e+00 --2.0100e+03 7.4286e+02 5.3951e+00 --2.0100e+03 7.7143e+02 5.4248e+00 --2.0100e+03 8.0000e+02 5.4550e+00 --2.0100e+03 8.2857e+02 5.4858e+00 --2.0100e+03 8.5714e+02 5.5170e+00 --2.0100e+03 8.8571e+02 5.5487e+00 --2.0100e+03 9.1429e+02 5.5808e+00 --2.0100e+03 9.4286e+02 5.6133e+00 --2.0100e+03 9.7143e+02 5.6461e+00 --2.0100e+03 1.0000e+03 5.6792e+00 --2.0100e+03 1.0286e+03 5.7125e+00 --2.0100e+03 1.0571e+03 5.7461e+00 --2.0100e+03 1.0857e+03 5.7798e+00 --2.0100e+03 1.1143e+03 5.8137e+00 --2.0100e+03 1.1429e+03 5.8477e+00 --2.0100e+03 1.1714e+03 5.8818e+00 --2.0100e+03 1.2000e+03 5.9160e+00 --2.0100e+03 1.2286e+03 5.9501e+00 --2.0100e+03 1.2571e+03 5.9843e+00 --2.0100e+03 1.2857e+03 6.0185e+00 --2.0100e+03 1.3143e+03 6.0526e+00 --2.0100e+03 1.3429e+03 6.0866e+00 --2.0100e+03 1.3714e+03 6.1206e+00 --2.0100e+03 1.4000e+03 6.1544e+00 --2.0100e+03 1.4286e+03 6.1881e+00 --2.0100e+03 1.4571e+03 6.2217e+00 --2.0100e+03 1.4857e+03 6.2551e+00 --2.0100e+03 1.5143e+03 6.2884e+00 --2.0100e+03 1.5429e+03 6.3214e+00 --2.0100e+03 1.5714e+03 6.3542e+00 --2.0100e+03 1.6000e+03 6.3869e+00 --2.0100e+03 1.6286e+03 6.4193e+00 --2.0100e+03 1.6571e+03 6.4514e+00 --2.0100e+03 1.6857e+03 6.4833e+00 --2.0100e+03 1.7143e+03 6.5150e+00 --2.0100e+03 1.7429e+03 6.5463e+00 --2.0100e+03 1.7714e+03 6.5775e+00 --2.0100e+03 1.8000e+03 6.6083e+00 --2.0100e+03 1.8286e+03 6.6388e+00 --2.0100e+03 1.8571e+03 6.6691e+00 --2.0100e+03 1.8857e+03 6.6991e+00 --2.0100e+03 1.9143e+03 6.7287e+00 --2.0100e+03 1.9429e+03 6.7581e+00 --2.0100e+03 1.9714e+03 6.7872e+00 --2.0100e+03 2.0000e+03 6.8159e+00 --1.9800e+03 -2.0000e+03 6.7856e+00 --1.9800e+03 -1.9714e+03 6.7560e+00 --1.9800e+03 -1.9429e+03 6.7262e+00 --1.9800e+03 -1.9143e+03 6.6960e+00 --1.9800e+03 -1.8857e+03 6.6655e+00 --1.9800e+03 -1.8571e+03 6.6346e+00 --1.9800e+03 -1.8286e+03 6.6035e+00 --1.9800e+03 -1.8000e+03 6.5720e+00 --1.9800e+03 -1.7714e+03 6.5403e+00 --1.9800e+03 -1.7429e+03 6.5082e+00 --1.9800e+03 -1.7143e+03 6.4758e+00 --1.9800e+03 -1.6857e+03 6.4432e+00 --1.9800e+03 -1.6571e+03 6.4103e+00 --1.9800e+03 -1.6286e+03 6.3771e+00 --1.9800e+03 -1.6000e+03 6.3436e+00 --1.9800e+03 -1.5714e+03 6.3099e+00 --1.9800e+03 -1.5429e+03 6.2759e+00 --1.9800e+03 -1.5143e+03 6.2417e+00 --1.9800e+03 -1.4857e+03 6.2073e+00 --1.9800e+03 -1.4571e+03 6.1727e+00 --1.9800e+03 -1.4286e+03 6.1379e+00 --1.9800e+03 -1.4000e+03 6.1029e+00 --1.9800e+03 -1.3714e+03 6.0678e+00 --1.9800e+03 -1.3429e+03 6.0326e+00 --1.9800e+03 -1.3143e+03 5.9972e+00 --1.9800e+03 -1.2857e+03 5.9618e+00 --1.9800e+03 -1.2571e+03 5.9262e+00 --1.9800e+03 -1.2286e+03 5.8907e+00 --1.9800e+03 -1.2000e+03 5.8551e+00 --1.9800e+03 -1.1714e+03 5.8195e+00 --1.9800e+03 -1.1429e+03 5.7840e+00 --1.9800e+03 -1.1143e+03 5.7485e+00 --1.9800e+03 -1.0857e+03 5.7132e+00 --1.9800e+03 -1.0571e+03 5.6780e+00 --1.9800e+03 -1.0286e+03 5.6429e+00 --1.9800e+03 -1.0000e+03 5.6081e+00 --1.9800e+03 -9.7143e+02 5.5734e+00 --1.9800e+03 -9.4286e+02 5.5391e+00 --1.9800e+03 -9.1429e+02 5.5051e+00 --1.9800e+03 -8.8571e+02 5.4715e+00 --1.9800e+03 -8.5714e+02 5.4383e+00 --1.9800e+03 -8.2857e+02 5.4055e+00 --1.9800e+03 -8.0000e+02 5.3732e+00 --1.9800e+03 -7.7143e+02 5.3415e+00 --1.9800e+03 -7.4286e+02 5.3103e+00 --1.9800e+03 -7.1429e+02 5.2798e+00 --1.9800e+03 -6.8571e+02 5.2499e+00 --1.9800e+03 -6.5714e+02 5.2208e+00 --1.9800e+03 -6.2857e+02 5.1925e+00 --1.9800e+03 -6.0000e+02 5.1650e+00 --1.9800e+03 -5.7143e+02 5.1384e+00 --1.9800e+03 -5.4286e+02 5.1127e+00 --1.9800e+03 -5.1429e+02 5.0880e+00 --1.9800e+03 -4.8571e+02 5.0643e+00 --1.9800e+03 -4.5714e+02 5.0417e+00 --1.9800e+03 -4.2857e+02 5.0202e+00 --1.9800e+03 -4.0000e+02 4.9999e+00 --1.9800e+03 -3.7143e+02 4.9807e+00 --1.9800e+03 -3.4286e+02 4.9628e+00 --1.9800e+03 -3.1429e+02 4.9462e+00 --1.9800e+03 -2.8571e+02 4.9309e+00 --1.9800e+03 -2.5714e+02 4.9169e+00 --1.9800e+03 -2.2857e+02 4.9043e+00 --1.9800e+03 -2.0000e+02 4.8932e+00 --1.9800e+03 -1.7143e+02 4.8834e+00 --1.9800e+03 -1.4286e+02 4.8751e+00 --1.9800e+03 -1.1429e+02 4.8683e+00 --1.9800e+03 -8.5714e+01 4.8630e+00 --1.9800e+03 -5.7143e+01 4.8592e+00 --1.9800e+03 -2.8571e+01 4.8570e+00 --1.9800e+03 0.0000e+00 4.8562e+00 --1.9800e+03 2.8571e+01 4.8570e+00 --1.9800e+03 5.7143e+01 4.8592e+00 --1.9800e+03 8.5714e+01 4.8630e+00 --1.9800e+03 1.1429e+02 4.8683e+00 --1.9800e+03 1.4286e+02 4.8751e+00 --1.9800e+03 1.7143e+02 4.8834e+00 --1.9800e+03 2.0000e+02 4.8932e+00 --1.9800e+03 2.2857e+02 4.9043e+00 --1.9800e+03 2.5714e+02 4.9169e+00 --1.9800e+03 2.8571e+02 4.9309e+00 --1.9800e+03 3.1429e+02 4.9462e+00 --1.9800e+03 3.4286e+02 4.9628e+00 --1.9800e+03 3.7143e+02 4.9807e+00 --1.9800e+03 4.0000e+02 4.9999e+00 --1.9800e+03 4.2857e+02 5.0202e+00 --1.9800e+03 4.5714e+02 5.0417e+00 --1.9800e+03 4.8571e+02 5.0643e+00 --1.9800e+03 5.1429e+02 5.0880e+00 --1.9800e+03 5.4286e+02 5.1127e+00 --1.9800e+03 5.7143e+02 5.1384e+00 --1.9800e+03 6.0000e+02 5.1650e+00 --1.9800e+03 6.2857e+02 5.1925e+00 --1.9800e+03 6.5714e+02 5.2208e+00 --1.9800e+03 6.8571e+02 5.2499e+00 --1.9800e+03 7.1429e+02 5.2798e+00 --1.9800e+03 7.4286e+02 5.3103e+00 --1.9800e+03 7.7143e+02 5.3415e+00 --1.9800e+03 8.0000e+02 5.3732e+00 --1.9800e+03 8.2857e+02 5.4055e+00 --1.9800e+03 8.5714e+02 5.4383e+00 --1.9800e+03 8.8571e+02 5.4715e+00 --1.9800e+03 9.1429e+02 5.5051e+00 --1.9800e+03 9.4286e+02 5.5391e+00 --1.9800e+03 9.7143e+02 5.5734e+00 --1.9800e+03 1.0000e+03 5.6081e+00 --1.9800e+03 1.0286e+03 5.6429e+00 --1.9800e+03 1.0571e+03 5.6780e+00 --1.9800e+03 1.0857e+03 5.7132e+00 --1.9800e+03 1.1143e+03 5.7485e+00 --1.9800e+03 1.1429e+03 5.7840e+00 --1.9800e+03 1.1714e+03 5.8195e+00 --1.9800e+03 1.2000e+03 5.8551e+00 --1.9800e+03 1.2286e+03 5.8907e+00 --1.9800e+03 1.2571e+03 5.9262e+00 --1.9800e+03 1.2857e+03 5.9618e+00 --1.9800e+03 1.3143e+03 5.9972e+00 --1.9800e+03 1.3429e+03 6.0326e+00 --1.9800e+03 1.3714e+03 6.0678e+00 --1.9800e+03 1.4000e+03 6.1029e+00 --1.9800e+03 1.4286e+03 6.1379e+00 --1.9800e+03 1.4571e+03 6.1727e+00 --1.9800e+03 1.4857e+03 6.2073e+00 --1.9800e+03 1.5143e+03 6.2417e+00 --1.9800e+03 1.5429e+03 6.2759e+00 --1.9800e+03 1.5714e+03 6.3099e+00 --1.9800e+03 1.6000e+03 6.3436e+00 --1.9800e+03 1.6286e+03 6.3771e+00 --1.9800e+03 1.6571e+03 6.4103e+00 --1.9800e+03 1.6857e+03 6.4432e+00 --1.9800e+03 1.7143e+03 6.4758e+00 --1.9800e+03 1.7429e+03 6.5082e+00 --1.9800e+03 1.7714e+03 6.5403e+00 --1.9800e+03 1.8000e+03 6.5720e+00 --1.9800e+03 1.8286e+03 6.6035e+00 --1.9800e+03 1.8571e+03 6.6346e+00 --1.9800e+03 1.8857e+03 6.6655e+00 --1.9800e+03 1.9143e+03 6.6960e+00 --1.9800e+03 1.9429e+03 6.7262e+00 --1.9800e+03 1.9714e+03 6.7560e+00 --1.9800e+03 2.0000e+03 6.7856e+00 --1.9500e+03 -2.0000e+03 6.7549e+00 --1.9500e+03 -1.9714e+03 6.7245e+00 --1.9500e+03 -1.9429e+03 6.6938e+00 --1.9500e+03 -1.9143e+03 6.6628e+00 --1.9500e+03 -1.8857e+03 6.6314e+00 --1.9500e+03 -1.8571e+03 6.5997e+00 --1.9500e+03 -1.8286e+03 6.5677e+00 --1.9500e+03 -1.8000e+03 6.5353e+00 --1.9500e+03 -1.7714e+03 6.5025e+00 --1.9500e+03 -1.7429e+03 6.4695e+00 --1.9500e+03 -1.7143e+03 6.4361e+00 --1.9500e+03 -1.6857e+03 6.4024e+00 --1.9500e+03 -1.6571e+03 6.3684e+00 --1.9500e+03 -1.6286e+03 6.3341e+00 --1.9500e+03 -1.6000e+03 6.2995e+00 --1.9500e+03 -1.5714e+03 6.2647e+00 --1.9500e+03 -1.5429e+03 6.2296e+00 --1.9500e+03 -1.5143e+03 6.1942e+00 --1.9500e+03 -1.4857e+03 6.1585e+00 --1.9500e+03 -1.4571e+03 6.1227e+00 --1.9500e+03 -1.4286e+03 6.0866e+00 --1.9500e+03 -1.4000e+03 6.0503e+00 --1.9500e+03 -1.3714e+03 6.0139e+00 --1.9500e+03 -1.3429e+03 5.9773e+00 --1.9500e+03 -1.3143e+03 5.9405e+00 --1.9500e+03 -1.2857e+03 5.9037e+00 --1.9500e+03 -1.2571e+03 5.8667e+00 --1.9500e+03 -1.2286e+03 5.8297e+00 --1.9500e+03 -1.2000e+03 5.7927e+00 --1.9500e+03 -1.1714e+03 5.7556e+00 --1.9500e+03 -1.1429e+03 5.7185e+00 --1.9500e+03 -1.1143e+03 5.6815e+00 --1.9500e+03 -1.0857e+03 5.6446e+00 --1.9500e+03 -1.0571e+03 5.6078e+00 --1.9500e+03 -1.0286e+03 5.5712e+00 --1.9500e+03 -1.0000e+03 5.5348e+00 --1.9500e+03 -9.7143e+02 5.4985e+00 --1.9500e+03 -9.4286e+02 5.4626e+00 --1.9500e+03 -9.1429e+02 5.4270e+00 --1.9500e+03 -8.8571e+02 5.3917e+00 --1.9500e+03 -8.5714e+02 5.3569e+00 --1.9500e+03 -8.2857e+02 5.3225e+00 --1.9500e+03 -8.0000e+02 5.2886e+00 --1.9500e+03 -7.7143e+02 5.2552e+00 --1.9500e+03 -7.4286e+02 5.2225e+00 --1.9500e+03 -7.1429e+02 5.1903e+00 --1.9500e+03 -6.8571e+02 5.1590e+00 --1.9500e+03 -6.5714e+02 5.1283e+00 --1.9500e+03 -6.2857e+02 5.0985e+00 --1.9500e+03 -6.0000e+02 5.0695e+00 --1.9500e+03 -5.7143e+02 5.0414e+00 --1.9500e+03 -5.4286e+02 5.0143e+00 --1.9500e+03 -5.1429e+02 4.9882e+00 --1.9500e+03 -4.8571e+02 4.9632e+00 --1.9500e+03 -4.5714e+02 4.9393e+00 --1.9500e+03 -4.2857e+02 4.9166e+00 --1.9500e+03 -4.0000e+02 4.8951e+00 --1.9500e+03 -3.7143e+02 4.8748e+00 --1.9500e+03 -3.4286e+02 4.8559e+00 --1.9500e+03 -3.1429e+02 4.8383e+00 --1.9500e+03 -2.8571e+02 4.8221e+00 --1.9500e+03 -2.5714e+02 4.8073e+00 --1.9500e+03 -2.2857e+02 4.7939e+00 --1.9500e+03 -2.0000e+02 4.7821e+00 --1.9500e+03 -1.7143e+02 4.7718e+00 --1.9500e+03 -1.4286e+02 4.7630e+00 --1.9500e+03 -1.1429e+02 4.7558e+00 --1.9500e+03 -8.5714e+01 4.7502e+00 --1.9500e+03 -5.7143e+01 4.7462e+00 --1.9500e+03 -2.8571e+01 4.7437e+00 --1.9500e+03 0.0000e+00 4.7429e+00 --1.9500e+03 2.8571e+01 4.7437e+00 --1.9500e+03 5.7143e+01 4.7462e+00 --1.9500e+03 8.5714e+01 4.7502e+00 --1.9500e+03 1.1429e+02 4.7558e+00 --1.9500e+03 1.4286e+02 4.7630e+00 --1.9500e+03 1.7143e+02 4.7718e+00 --1.9500e+03 2.0000e+02 4.7821e+00 --1.9500e+03 2.2857e+02 4.7939e+00 --1.9500e+03 2.5714e+02 4.8073e+00 --1.9500e+03 2.8571e+02 4.8221e+00 --1.9500e+03 3.1429e+02 4.8383e+00 --1.9500e+03 3.4286e+02 4.8559e+00 --1.9500e+03 3.7143e+02 4.8748e+00 --1.9500e+03 4.0000e+02 4.8951e+00 --1.9500e+03 4.2857e+02 4.9166e+00 --1.9500e+03 4.5714e+02 4.9393e+00 --1.9500e+03 4.8571e+02 4.9632e+00 --1.9500e+03 5.1429e+02 4.9882e+00 --1.9500e+03 5.4286e+02 5.0143e+00 --1.9500e+03 5.7143e+02 5.0414e+00 --1.9500e+03 6.0000e+02 5.0695e+00 --1.9500e+03 6.2857e+02 5.0985e+00 --1.9500e+03 6.5714e+02 5.1283e+00 --1.9500e+03 6.8571e+02 5.1590e+00 --1.9500e+03 7.1429e+02 5.1903e+00 --1.9500e+03 7.4286e+02 5.2225e+00 --1.9500e+03 7.7143e+02 5.2552e+00 --1.9500e+03 8.0000e+02 5.2886e+00 --1.9500e+03 8.2857e+02 5.3225e+00 --1.9500e+03 8.5714e+02 5.3569e+00 --1.9500e+03 8.8571e+02 5.3917e+00 --1.9500e+03 9.1429e+02 5.4270e+00 --1.9500e+03 9.4286e+02 5.4626e+00 --1.9500e+03 9.7143e+02 5.4985e+00 --1.9500e+03 1.0000e+03 5.5348e+00 --1.9500e+03 1.0286e+03 5.5712e+00 --1.9500e+03 1.0571e+03 5.6078e+00 --1.9500e+03 1.0857e+03 5.6446e+00 --1.9500e+03 1.1143e+03 5.6815e+00 --1.9500e+03 1.1429e+03 5.7185e+00 --1.9500e+03 1.1714e+03 5.7556e+00 --1.9500e+03 1.2000e+03 5.7927e+00 --1.9500e+03 1.2286e+03 5.8297e+00 --1.9500e+03 1.2571e+03 5.8667e+00 --1.9500e+03 1.2857e+03 5.9037e+00 --1.9500e+03 1.3143e+03 5.9405e+00 --1.9500e+03 1.3429e+03 5.9773e+00 --1.9500e+03 1.3714e+03 6.0139e+00 --1.9500e+03 1.4000e+03 6.0503e+00 --1.9500e+03 1.4286e+03 6.0866e+00 --1.9500e+03 1.4571e+03 6.1227e+00 --1.9500e+03 1.4857e+03 6.1585e+00 --1.9500e+03 1.5143e+03 6.1942e+00 --1.9500e+03 1.5429e+03 6.2296e+00 --1.9500e+03 1.5714e+03 6.2647e+00 --1.9500e+03 1.6000e+03 6.2995e+00 --1.9500e+03 1.6286e+03 6.3341e+00 --1.9500e+03 1.6571e+03 6.3684e+00 --1.9500e+03 1.6857e+03 6.4024e+00 --1.9500e+03 1.7143e+03 6.4361e+00 --1.9500e+03 1.7429e+03 6.4695e+00 --1.9500e+03 1.7714e+03 6.5025e+00 --1.9500e+03 1.8000e+03 6.5353e+00 --1.9500e+03 1.8286e+03 6.5677e+00 --1.9500e+03 1.8571e+03 6.5997e+00 --1.9500e+03 1.8857e+03 6.6314e+00 --1.9500e+03 1.9143e+03 6.6628e+00 --1.9500e+03 1.9429e+03 6.6938e+00 --1.9500e+03 1.9714e+03 6.7245e+00 --1.9500e+03 2.0000e+03 6.7549e+00 --1.9200e+03 -2.0000e+03 6.7238e+00 --1.9200e+03 -1.9714e+03 6.6927e+00 --1.9200e+03 -1.9429e+03 6.6611e+00 --1.9200e+03 -1.9143e+03 6.6292e+00 --1.9200e+03 -1.8857e+03 6.5970e+00 --1.9200e+03 -1.8571e+03 6.5643e+00 --1.9200e+03 -1.8286e+03 6.5313e+00 --1.9200e+03 -1.8000e+03 6.4980e+00 --1.9200e+03 -1.7714e+03 6.4642e+00 --1.9200e+03 -1.7429e+03 6.4302e+00 --1.9200e+03 -1.7143e+03 6.3957e+00 --1.9200e+03 -1.6857e+03 6.3610e+00 --1.9200e+03 -1.6571e+03 6.3259e+00 --1.9200e+03 -1.6286e+03 6.2905e+00 --1.9200e+03 -1.6000e+03 6.2547e+00 --1.9200e+03 -1.5714e+03 6.2187e+00 --1.9200e+03 -1.5429e+03 6.1823e+00 --1.9200e+03 -1.5143e+03 6.1457e+00 --1.9200e+03 -1.4857e+03 6.1088e+00 --1.9200e+03 -1.4571e+03 6.0716e+00 --1.9200e+03 -1.4286e+03 6.0342e+00 --1.9200e+03 -1.4000e+03 5.9966e+00 --1.9200e+03 -1.3714e+03 5.9587e+00 --1.9200e+03 -1.3429e+03 5.9207e+00 --1.9200e+03 -1.3143e+03 5.8825e+00 --1.9200e+03 -1.2857e+03 5.8442e+00 --1.9200e+03 -1.2571e+03 5.8057e+00 --1.9200e+03 -1.2286e+03 5.7672e+00 --1.9200e+03 -1.2000e+03 5.7286e+00 --1.9200e+03 -1.1714e+03 5.6899e+00 --1.9200e+03 -1.1429e+03 5.6513e+00 --1.9200e+03 -1.1143e+03 5.6127e+00 --1.9200e+03 -1.0857e+03 5.5741e+00 --1.9200e+03 -1.0571e+03 5.5357e+00 --1.9200e+03 -1.0286e+03 5.4974e+00 --1.9200e+03 -1.0000e+03 5.4592e+00 --1.9200e+03 -9.7143e+02 5.4213e+00 --1.9200e+03 -9.4286e+02 5.3837e+00 --1.9200e+03 -9.1429e+02 5.3463e+00 --1.9200e+03 -8.8571e+02 5.3093e+00 --1.9200e+03 -8.5714e+02 5.2727e+00 --1.9200e+03 -8.2857e+02 5.2366e+00 --1.9200e+03 -8.0000e+02 5.2010e+00 --1.9200e+03 -7.7143e+02 5.1659e+00 --1.9200e+03 -7.4286e+02 5.1314e+00 --1.9200e+03 -7.1429e+02 5.0976e+00 --1.9200e+03 -6.8571e+02 5.0646e+00 --1.9200e+03 -6.5714e+02 5.0323e+00 --1.9200e+03 -6.2857e+02 5.0008e+00 --1.9200e+03 -6.0000e+02 4.9702e+00 --1.9200e+03 -5.7143e+02 4.9406e+00 --1.9200e+03 -5.4286e+02 4.9120e+00 --1.9200e+03 -5.1429e+02 4.8844e+00 --1.9200e+03 -4.8571e+02 4.8580e+00 --1.9200e+03 -4.5714e+02 4.8327e+00 --1.9200e+03 -4.2857e+02 4.8087e+00 --1.9200e+03 -4.0000e+02 4.7859e+00 --1.9200e+03 -3.7143e+02 4.7644e+00 --1.9200e+03 -3.4286e+02 4.7444e+00 --1.9200e+03 -3.1429e+02 4.7257e+00 --1.9200e+03 -2.8571e+02 4.7085e+00 --1.9200e+03 -2.5714e+02 4.6929e+00 --1.9200e+03 -2.2857e+02 4.6787e+00 --1.9200e+03 -2.0000e+02 4.6662e+00 --1.9200e+03 -1.7143e+02 4.6552e+00 --1.9200e+03 -1.4286e+02 4.6459e+00 --1.9200e+03 -1.1429e+02 4.6383e+00 --1.9200e+03 -8.5714e+01 4.6323e+00 --1.9200e+03 -5.7143e+01 4.6280e+00 --1.9200e+03 -2.8571e+01 4.6255e+00 --1.9200e+03 0.0000e+00 4.6246e+00 --1.9200e+03 2.8571e+01 4.6255e+00 --1.9200e+03 5.7143e+01 4.6280e+00 --1.9200e+03 8.5714e+01 4.6323e+00 --1.9200e+03 1.1429e+02 4.6383e+00 --1.9200e+03 1.4286e+02 4.6459e+00 --1.9200e+03 1.7143e+02 4.6552e+00 --1.9200e+03 2.0000e+02 4.6662e+00 --1.9200e+03 2.2857e+02 4.6787e+00 --1.9200e+03 2.5714e+02 4.6929e+00 --1.9200e+03 2.8571e+02 4.7085e+00 --1.9200e+03 3.1429e+02 4.7257e+00 --1.9200e+03 3.4286e+02 4.7444e+00 --1.9200e+03 3.7143e+02 4.7644e+00 --1.9200e+03 4.0000e+02 4.7859e+00 --1.9200e+03 4.2857e+02 4.8087e+00 --1.9200e+03 4.5714e+02 4.8327e+00 --1.9200e+03 4.8571e+02 4.8580e+00 --1.9200e+03 5.1429e+02 4.8844e+00 --1.9200e+03 5.4286e+02 4.9120e+00 --1.9200e+03 5.7143e+02 4.9406e+00 --1.9200e+03 6.0000e+02 4.9702e+00 --1.9200e+03 6.2857e+02 5.0008e+00 --1.9200e+03 6.5714e+02 5.0323e+00 --1.9200e+03 6.8571e+02 5.0646e+00 --1.9200e+03 7.1429e+02 5.0976e+00 --1.9200e+03 7.4286e+02 5.1314e+00 --1.9200e+03 7.7143e+02 5.1659e+00 --1.9200e+03 8.0000e+02 5.2010e+00 --1.9200e+03 8.2857e+02 5.2366e+00 --1.9200e+03 8.5714e+02 5.2727e+00 --1.9200e+03 8.8571e+02 5.3093e+00 --1.9200e+03 9.1429e+02 5.3463e+00 --1.9200e+03 9.4286e+02 5.3837e+00 --1.9200e+03 9.7143e+02 5.4213e+00 --1.9200e+03 1.0000e+03 5.4592e+00 --1.9200e+03 1.0286e+03 5.4974e+00 --1.9200e+03 1.0571e+03 5.5357e+00 --1.9200e+03 1.0857e+03 5.5741e+00 --1.9200e+03 1.1143e+03 5.6127e+00 --1.9200e+03 1.1429e+03 5.6513e+00 --1.9200e+03 1.1714e+03 5.6899e+00 --1.9200e+03 1.2000e+03 5.7286e+00 --1.9200e+03 1.2286e+03 5.7672e+00 --1.9200e+03 1.2571e+03 5.8057e+00 --1.9200e+03 1.2857e+03 5.8442e+00 --1.9200e+03 1.3143e+03 5.8825e+00 --1.9200e+03 1.3429e+03 5.9207e+00 --1.9200e+03 1.3714e+03 5.9587e+00 --1.9200e+03 1.4000e+03 5.9966e+00 --1.9200e+03 1.4286e+03 6.0342e+00 --1.9200e+03 1.4571e+03 6.0716e+00 --1.9200e+03 1.4857e+03 6.1088e+00 --1.9200e+03 1.5143e+03 6.1457e+00 --1.9200e+03 1.5429e+03 6.1823e+00 --1.9200e+03 1.5714e+03 6.2187e+00 --1.9200e+03 1.6000e+03 6.2547e+00 --1.9200e+03 1.6286e+03 6.2905e+00 --1.9200e+03 1.6571e+03 6.3259e+00 --1.9200e+03 1.6857e+03 6.3610e+00 --1.9200e+03 1.7143e+03 6.3957e+00 --1.9200e+03 1.7429e+03 6.4302e+00 --1.9200e+03 1.7714e+03 6.4642e+00 --1.9200e+03 1.8000e+03 6.4980e+00 --1.9200e+03 1.8286e+03 6.5313e+00 --1.9200e+03 1.8571e+03 6.5643e+00 --1.9200e+03 1.8857e+03 6.5970e+00 --1.9200e+03 1.9143e+03 6.6292e+00 --1.9200e+03 1.9429e+03 6.6611e+00 --1.9200e+03 1.9714e+03 6.6927e+00 --1.9200e+03 2.0000e+03 6.7238e+00 --1.8900e+03 -2.0000e+03 6.6924e+00 --1.8900e+03 -1.9714e+03 6.6604e+00 --1.8900e+03 -1.9429e+03 6.6280e+00 --1.8900e+03 -1.9143e+03 6.5952e+00 --1.8900e+03 -1.8857e+03 6.5620e+00 --1.8900e+03 -1.8571e+03 6.5285e+00 --1.8900e+03 -1.8286e+03 6.4945e+00 --1.8900e+03 -1.8000e+03 6.4601e+00 --1.8900e+03 -1.7714e+03 6.4254e+00 --1.8900e+03 -1.7429e+03 6.3903e+00 --1.8900e+03 -1.7143e+03 6.3547e+00 --1.8900e+03 -1.6857e+03 6.3189e+00 --1.8900e+03 -1.6571e+03 6.2826e+00 --1.8900e+03 -1.6286e+03 6.2460e+00 --1.8900e+03 -1.6000e+03 6.2091e+00 --1.8900e+03 -1.5714e+03 6.1718e+00 --1.8900e+03 -1.5429e+03 6.1342e+00 --1.8900e+03 -1.5143e+03 6.0962e+00 --1.8900e+03 -1.4857e+03 6.0580e+00 --1.8900e+03 -1.4571e+03 6.0195e+00 --1.8900e+03 -1.4286e+03 5.9807e+00 --1.8900e+03 -1.4000e+03 5.9416e+00 --1.8900e+03 -1.3714e+03 5.9023e+00 --1.8900e+03 -1.3429e+03 5.8628e+00 --1.8900e+03 -1.3143e+03 5.8231e+00 --1.8900e+03 -1.2857e+03 5.7833e+00 --1.8900e+03 -1.2571e+03 5.7432e+00 --1.8900e+03 -1.2286e+03 5.7031e+00 --1.8900e+03 -1.2000e+03 5.6628e+00 --1.8900e+03 -1.1714e+03 5.6225e+00 --1.8900e+03 -1.1429e+03 5.5822e+00 --1.8900e+03 -1.1143e+03 5.5419e+00 --1.8900e+03 -1.0857e+03 5.5016e+00 --1.8900e+03 -1.0571e+03 5.4614e+00 --1.8900e+03 -1.0286e+03 5.4213e+00 --1.8900e+03 -1.0000e+03 5.3814e+00 --1.8900e+03 -9.7143e+02 5.3416e+00 --1.8900e+03 -9.4286e+02 5.3022e+00 --1.8900e+03 -9.1429e+02 5.2630e+00 --1.8900e+03 -8.8571e+02 5.2242e+00 --1.8900e+03 -8.5714e+02 5.1857e+00 --1.8900e+03 -8.2857e+02 5.1478e+00 --1.8900e+03 -8.0000e+02 5.1103e+00 --1.8900e+03 -7.7143e+02 5.0734e+00 --1.8900e+03 -7.4286e+02 5.0371e+00 --1.8900e+03 -7.1429e+02 5.0015e+00 --1.8900e+03 -6.8571e+02 4.9666e+00 --1.8900e+03 -6.5714e+02 4.9326e+00 --1.8900e+03 -6.2857e+02 4.8994e+00 --1.8900e+03 -6.0000e+02 4.8671e+00 --1.8900e+03 -5.7143e+02 4.8358e+00 --1.8900e+03 -5.4286e+02 4.8055e+00 --1.8900e+03 -5.1429e+02 4.7764e+00 --1.8900e+03 -4.8571e+02 4.7484e+00 --1.8900e+03 -4.5714e+02 4.7216e+00 --1.8900e+03 -4.2857e+02 4.6962e+00 --1.8900e+03 -4.0000e+02 4.6720e+00 --1.8900e+03 -3.7143e+02 4.6493e+00 --1.8900e+03 -3.4286e+02 4.6280e+00 --1.8900e+03 -3.1429e+02 4.6082e+00 --1.8900e+03 -2.8571e+02 4.5900e+00 --1.8900e+03 -2.5714e+02 4.5734e+00 --1.8900e+03 -2.2857e+02 4.5583e+00 --1.8900e+03 -2.0000e+02 4.5450e+00 --1.8900e+03 -1.7143e+02 4.5334e+00 --1.8900e+03 -1.4286e+02 4.5235e+00 --1.8900e+03 -1.1429e+02 4.5154e+00 --1.8900e+03 -8.5714e+01 4.5090e+00 --1.8900e+03 -5.7143e+01 4.5045e+00 --1.8900e+03 -2.8571e+01 4.5018e+00 --1.8900e+03 0.0000e+00 4.5008e+00 --1.8900e+03 2.8571e+01 4.5018e+00 --1.8900e+03 5.7143e+01 4.5045e+00 --1.8900e+03 8.5714e+01 4.5090e+00 --1.8900e+03 1.1429e+02 4.5154e+00 --1.8900e+03 1.4286e+02 4.5235e+00 --1.8900e+03 1.7143e+02 4.5334e+00 --1.8900e+03 2.0000e+02 4.5450e+00 --1.8900e+03 2.2857e+02 4.5583e+00 --1.8900e+03 2.5714e+02 4.5734e+00 --1.8900e+03 2.8571e+02 4.5900e+00 --1.8900e+03 3.1429e+02 4.6082e+00 --1.8900e+03 3.4286e+02 4.6280e+00 --1.8900e+03 3.7143e+02 4.6493e+00 --1.8900e+03 4.0000e+02 4.6720e+00 --1.8900e+03 4.2857e+02 4.6962e+00 --1.8900e+03 4.5714e+02 4.7216e+00 --1.8900e+03 4.8571e+02 4.7484e+00 --1.8900e+03 5.1429e+02 4.7764e+00 --1.8900e+03 5.4286e+02 4.8055e+00 --1.8900e+03 5.7143e+02 4.8358e+00 --1.8900e+03 6.0000e+02 4.8671e+00 --1.8900e+03 6.2857e+02 4.8994e+00 --1.8900e+03 6.5714e+02 4.9326e+00 --1.8900e+03 6.8571e+02 4.9666e+00 --1.8900e+03 7.1429e+02 5.0015e+00 --1.8900e+03 7.4286e+02 5.0371e+00 --1.8900e+03 7.7143e+02 5.0734e+00 --1.8900e+03 8.0000e+02 5.1103e+00 --1.8900e+03 8.2857e+02 5.1478e+00 --1.8900e+03 8.5714e+02 5.1857e+00 --1.8900e+03 8.8571e+02 5.2242e+00 --1.8900e+03 9.1429e+02 5.2630e+00 --1.8900e+03 9.4286e+02 5.3022e+00 --1.8900e+03 9.7143e+02 5.3416e+00 --1.8900e+03 1.0000e+03 5.3814e+00 --1.8900e+03 1.0286e+03 5.4213e+00 --1.8900e+03 1.0571e+03 5.4614e+00 --1.8900e+03 1.0857e+03 5.5016e+00 --1.8900e+03 1.1143e+03 5.5419e+00 --1.8900e+03 1.1429e+03 5.5822e+00 --1.8900e+03 1.1714e+03 5.6225e+00 --1.8900e+03 1.2000e+03 5.6628e+00 --1.8900e+03 1.2286e+03 5.7031e+00 --1.8900e+03 1.2571e+03 5.7432e+00 --1.8900e+03 1.2857e+03 5.7833e+00 --1.8900e+03 1.3143e+03 5.8231e+00 --1.8900e+03 1.3429e+03 5.8628e+00 --1.8900e+03 1.3714e+03 5.9023e+00 --1.8900e+03 1.4000e+03 5.9416e+00 --1.8900e+03 1.4286e+03 5.9807e+00 --1.8900e+03 1.4571e+03 6.0195e+00 --1.8900e+03 1.4857e+03 6.0580e+00 --1.8900e+03 1.5143e+03 6.0962e+00 --1.8900e+03 1.5429e+03 6.1342e+00 --1.8900e+03 1.5714e+03 6.1718e+00 --1.8900e+03 1.6000e+03 6.2091e+00 --1.8900e+03 1.6286e+03 6.2460e+00 --1.8900e+03 1.6571e+03 6.2826e+00 --1.8900e+03 1.6857e+03 6.3189e+00 --1.8900e+03 1.7143e+03 6.3547e+00 --1.8900e+03 1.7429e+03 6.3903e+00 --1.8900e+03 1.7714e+03 6.4254e+00 --1.8900e+03 1.8000e+03 6.4601e+00 --1.8900e+03 1.8286e+03 6.4945e+00 --1.8900e+03 1.8571e+03 6.5285e+00 --1.8900e+03 1.8857e+03 6.5620e+00 --1.8900e+03 1.9143e+03 6.5952e+00 --1.8900e+03 1.9429e+03 6.6280e+00 --1.8900e+03 1.9714e+03 6.6604e+00 --1.8900e+03 2.0000e+03 6.6924e+00 --1.8600e+03 -2.0000e+03 6.6607e+00 --1.8600e+03 -1.9714e+03 6.6278e+00 --1.8600e+03 -1.9429e+03 6.5945e+00 --1.8600e+03 -1.9143e+03 6.5608e+00 --1.8600e+03 -1.8857e+03 6.5267e+00 --1.8600e+03 -1.8571e+03 6.4921e+00 --1.8600e+03 -1.8286e+03 6.4572e+00 --1.8600e+03 -1.8000e+03 6.4218e+00 --1.8600e+03 -1.7714e+03 6.3860e+00 --1.8600e+03 -1.7429e+03 6.3497e+00 --1.8600e+03 -1.7143e+03 6.3131e+00 --1.8600e+03 -1.6857e+03 6.2761e+00 --1.8600e+03 -1.6571e+03 6.2386e+00 --1.8600e+03 -1.6286e+03 6.2008e+00 --1.8600e+03 -1.6000e+03 6.1626e+00 --1.8600e+03 -1.5714e+03 6.1241e+00 --1.8600e+03 -1.5429e+03 6.0851e+00 --1.8600e+03 -1.5143e+03 6.0459e+00 --1.8600e+03 -1.4857e+03 6.0062e+00 --1.8600e+03 -1.4571e+03 5.9663e+00 --1.8600e+03 -1.4286e+03 5.9260e+00 --1.8600e+03 -1.4000e+03 5.8855e+00 --1.8600e+03 -1.3714e+03 5.8447e+00 --1.8600e+03 -1.3429e+03 5.8036e+00 --1.8600e+03 -1.3143e+03 5.7623e+00 --1.8600e+03 -1.2857e+03 5.7208e+00 --1.8600e+03 -1.2571e+03 5.6791e+00 --1.8600e+03 -1.2286e+03 5.6373e+00 --1.8600e+03 -1.2000e+03 5.5954e+00 --1.8600e+03 -1.1714e+03 5.5533e+00 --1.8600e+03 -1.1429e+03 5.5112e+00 --1.8600e+03 -1.1143e+03 5.4691e+00 --1.8600e+03 -1.0857e+03 5.4270e+00 --1.8600e+03 -1.0571e+03 5.3849e+00 --1.8600e+03 -1.0286e+03 5.3429e+00 --1.8600e+03 -1.0000e+03 5.3011e+00 --1.8600e+03 -9.7143e+02 5.2595e+00 --1.8600e+03 -9.4286e+02 5.2180e+00 --1.8600e+03 -9.1429e+02 5.1769e+00 --1.8600e+03 -8.8571e+02 5.1361e+00 --1.8600e+03 -8.5714e+02 5.0958e+00 --1.8600e+03 -8.2857e+02 5.0558e+00 --1.8600e+03 -8.0000e+02 5.0164e+00 --1.8600e+03 -7.7143e+02 4.9775e+00 --1.8600e+03 -7.4286e+02 4.9393e+00 --1.8600e+03 -7.1429e+02 4.9017e+00 --1.8600e+03 -6.8571e+02 4.8650e+00 --1.8600e+03 -6.5714e+02 4.8290e+00 --1.8600e+03 -6.2857e+02 4.7939e+00 --1.8600e+03 -6.0000e+02 4.7598e+00 --1.8600e+03 -5.7143e+02 4.7267e+00 --1.8600e+03 -5.4286e+02 4.6947e+00 --1.8600e+03 -5.1429e+02 4.6638e+00 --1.8600e+03 -4.8571e+02 4.6342e+00 --1.8600e+03 -4.5714e+02 4.6058e+00 --1.8600e+03 -4.2857e+02 4.5788e+00 --1.8600e+03 -4.0000e+02 4.5532e+00 --1.8600e+03 -3.7143e+02 4.5291e+00 --1.8600e+03 -3.4286e+02 4.5065e+00 --1.8600e+03 -3.1429e+02 4.4855e+00 --1.8600e+03 -2.8571e+02 4.4661e+00 --1.8600e+03 -2.5714e+02 4.4484e+00 --1.8600e+03 -2.2857e+02 4.4325e+00 --1.8600e+03 -2.0000e+02 4.4183e+00 --1.8600e+03 -1.7143e+02 4.4059e+00 --1.8600e+03 -1.4286e+02 4.3954e+00 --1.8600e+03 -1.1429e+02 4.3867e+00 --1.8600e+03 -8.5714e+01 4.3800e+00 --1.8600e+03 -5.7143e+01 4.3752e+00 --1.8600e+03 -2.8571e+01 4.3723e+00 --1.8600e+03 0.0000e+00 4.3713e+00 --1.8600e+03 2.8571e+01 4.3723e+00 --1.8600e+03 5.7143e+01 4.3752e+00 --1.8600e+03 8.5714e+01 4.3800e+00 --1.8600e+03 1.1429e+02 4.3867e+00 --1.8600e+03 1.4286e+02 4.3954e+00 --1.8600e+03 1.7143e+02 4.4059e+00 --1.8600e+03 2.0000e+02 4.4183e+00 --1.8600e+03 2.2857e+02 4.4325e+00 --1.8600e+03 2.5714e+02 4.4484e+00 --1.8600e+03 2.8571e+02 4.4661e+00 --1.8600e+03 3.1429e+02 4.4855e+00 --1.8600e+03 3.4286e+02 4.5065e+00 --1.8600e+03 3.7143e+02 4.5291e+00 --1.8600e+03 4.0000e+02 4.5532e+00 --1.8600e+03 4.2857e+02 4.5788e+00 --1.8600e+03 4.5714e+02 4.6058e+00 --1.8600e+03 4.8571e+02 4.6342e+00 --1.8600e+03 5.1429e+02 4.6638e+00 --1.8600e+03 5.4286e+02 4.6947e+00 --1.8600e+03 5.7143e+02 4.7267e+00 --1.8600e+03 6.0000e+02 4.7598e+00 --1.8600e+03 6.2857e+02 4.7939e+00 --1.8600e+03 6.5714e+02 4.8290e+00 --1.8600e+03 6.8571e+02 4.8650e+00 --1.8600e+03 7.1429e+02 4.9017e+00 --1.8600e+03 7.4286e+02 4.9393e+00 --1.8600e+03 7.7143e+02 4.9775e+00 --1.8600e+03 8.0000e+02 5.0164e+00 --1.8600e+03 8.2857e+02 5.0558e+00 --1.8600e+03 8.5714e+02 5.0958e+00 --1.8600e+03 8.8571e+02 5.1361e+00 --1.8600e+03 9.1429e+02 5.1769e+00 --1.8600e+03 9.4286e+02 5.2180e+00 --1.8600e+03 9.7143e+02 5.2595e+00 --1.8600e+03 1.0000e+03 5.3011e+00 --1.8600e+03 1.0286e+03 5.3429e+00 --1.8600e+03 1.0571e+03 5.3849e+00 --1.8600e+03 1.0857e+03 5.4270e+00 --1.8600e+03 1.1143e+03 5.4691e+00 --1.8600e+03 1.1429e+03 5.5112e+00 --1.8600e+03 1.1714e+03 5.5533e+00 --1.8600e+03 1.2000e+03 5.5954e+00 --1.8600e+03 1.2286e+03 5.6373e+00 --1.8600e+03 1.2571e+03 5.6791e+00 --1.8600e+03 1.2857e+03 5.7208e+00 --1.8600e+03 1.3143e+03 5.7623e+00 --1.8600e+03 1.3429e+03 5.8036e+00 --1.8600e+03 1.3714e+03 5.8447e+00 --1.8600e+03 1.4000e+03 5.8855e+00 --1.8600e+03 1.4286e+03 5.9260e+00 --1.8600e+03 1.4571e+03 5.9663e+00 --1.8600e+03 1.4857e+03 6.0062e+00 --1.8600e+03 1.5143e+03 6.0459e+00 --1.8600e+03 1.5429e+03 6.0851e+00 --1.8600e+03 1.5714e+03 6.1241e+00 --1.8600e+03 1.6000e+03 6.1626e+00 --1.8600e+03 1.6286e+03 6.2008e+00 --1.8600e+03 1.6571e+03 6.2386e+00 --1.8600e+03 1.6857e+03 6.2761e+00 --1.8600e+03 1.7143e+03 6.3131e+00 --1.8600e+03 1.7429e+03 6.3497e+00 --1.8600e+03 1.7714e+03 6.3860e+00 --1.8600e+03 1.8000e+03 6.4218e+00 --1.8600e+03 1.8286e+03 6.4572e+00 --1.8600e+03 1.8571e+03 6.4921e+00 --1.8600e+03 1.8857e+03 6.5267e+00 --1.8600e+03 1.9143e+03 6.5608e+00 --1.8600e+03 1.9429e+03 6.5945e+00 --1.8600e+03 1.9714e+03 6.6278e+00 --1.8600e+03 2.0000e+03 6.6607e+00 --1.8300e+03 -2.0000e+03 6.6287e+00 --1.8300e+03 -1.9714e+03 6.5949e+00 --1.8300e+03 -1.9429e+03 6.5607e+00 --1.8300e+03 -1.9143e+03 6.5260e+00 --1.8300e+03 -1.8857e+03 6.4909e+00 --1.8300e+03 -1.8571e+03 6.4553e+00 --1.8300e+03 -1.8286e+03 6.4193e+00 --1.8300e+03 -1.8000e+03 6.3829e+00 --1.8300e+03 -1.7714e+03 6.3460e+00 --1.8300e+03 -1.7429e+03 6.3086e+00 --1.8300e+03 -1.7143e+03 6.2708e+00 --1.8300e+03 -1.6857e+03 6.2326e+00 --1.8300e+03 -1.6571e+03 6.1939e+00 --1.8300e+03 -1.6286e+03 6.1549e+00 --1.8300e+03 -1.6000e+03 6.1154e+00 --1.8300e+03 -1.5714e+03 6.0755e+00 --1.8300e+03 -1.5429e+03 6.0352e+00 --1.8300e+03 -1.5143e+03 5.9945e+00 --1.8300e+03 -1.4857e+03 5.9534e+00 --1.8300e+03 -1.4571e+03 5.9120e+00 --1.8300e+03 -1.4286e+03 5.8702e+00 --1.8300e+03 -1.4000e+03 5.8281e+00 --1.8300e+03 -1.3714e+03 5.7857e+00 --1.8300e+03 -1.3429e+03 5.7430e+00 --1.8300e+03 -1.3143e+03 5.7001e+00 --1.8300e+03 -1.2857e+03 5.6569e+00 --1.8300e+03 -1.2571e+03 5.6135e+00 --1.8300e+03 -1.2286e+03 5.5698e+00 --1.8300e+03 -1.2000e+03 5.5261e+00 --1.8300e+03 -1.1714e+03 5.4822e+00 --1.8300e+03 -1.1429e+03 5.4382e+00 --1.8300e+03 -1.1143e+03 5.3942e+00 --1.8300e+03 -1.0857e+03 5.3501e+00 --1.8300e+03 -1.0571e+03 5.3061e+00 --1.8300e+03 -1.0286e+03 5.2621e+00 --1.8300e+03 -1.0000e+03 5.2183e+00 --1.8300e+03 -9.7143e+02 5.1746e+00 --1.8300e+03 -9.4286e+02 5.1312e+00 --1.8300e+03 -9.1429e+02 5.0880e+00 --1.8300e+03 -8.8571e+02 5.0451e+00 --1.8300e+03 -8.5714e+02 5.0026e+00 --1.8300e+03 -8.2857e+02 4.9606e+00 --1.8300e+03 -8.0000e+02 4.9191e+00 --1.8300e+03 -7.7143e+02 4.8781e+00 --1.8300e+03 -7.4286e+02 4.8378e+00 --1.8300e+03 -7.1429e+02 4.7981e+00 --1.8300e+03 -6.8571e+02 4.7593e+00 --1.8300e+03 -6.5714e+02 4.7213e+00 --1.8300e+03 -6.2857e+02 4.6842e+00 --1.8300e+03 -6.0000e+02 4.6481e+00 --1.8300e+03 -5.7143e+02 4.6130e+00 --1.8300e+03 -5.4286e+02 4.5791e+00 --1.8300e+03 -5.1429e+02 4.5464e+00 --1.8300e+03 -4.8571e+02 4.5150e+00 --1.8300e+03 -4.5714e+02 4.4849e+00 --1.8300e+03 -4.2857e+02 4.4562e+00 --1.8300e+03 -4.0000e+02 4.4291e+00 --1.8300e+03 -3.7143e+02 4.4034e+00 --1.8300e+03 -3.4286e+02 4.3794e+00 --1.8300e+03 -3.1429e+02 4.3571e+00 --1.8300e+03 -2.8571e+02 4.3365e+00 --1.8300e+03 -2.5714e+02 4.3176e+00 --1.8300e+03 -2.2857e+02 4.3007e+00 --1.8300e+03 -2.0000e+02 4.2856e+00 --1.8300e+03 -1.7143e+02 4.2724e+00 --1.8300e+03 -1.4286e+02 4.2612e+00 --1.8300e+03 -1.1429e+02 4.2520e+00 --1.8300e+03 -8.5714e+01 4.2448e+00 --1.8300e+03 -5.7143e+01 4.2396e+00 --1.8300e+03 -2.8571e+01 4.2365e+00 --1.8300e+03 0.0000e+00 4.2355e+00 --1.8300e+03 2.8571e+01 4.2365e+00 --1.8300e+03 5.7143e+01 4.2396e+00 --1.8300e+03 8.5714e+01 4.2448e+00 --1.8300e+03 1.1429e+02 4.2520e+00 --1.8300e+03 1.4286e+02 4.2612e+00 --1.8300e+03 1.7143e+02 4.2724e+00 --1.8300e+03 2.0000e+02 4.2856e+00 --1.8300e+03 2.2857e+02 4.3007e+00 --1.8300e+03 2.5714e+02 4.3176e+00 --1.8300e+03 2.8571e+02 4.3365e+00 --1.8300e+03 3.1429e+02 4.3571e+00 --1.8300e+03 3.4286e+02 4.3794e+00 --1.8300e+03 3.7143e+02 4.4034e+00 --1.8300e+03 4.0000e+02 4.4291e+00 --1.8300e+03 4.2857e+02 4.4562e+00 --1.8300e+03 4.5714e+02 4.4849e+00 --1.8300e+03 4.8571e+02 4.5150e+00 --1.8300e+03 5.1429e+02 4.5464e+00 --1.8300e+03 5.4286e+02 4.5791e+00 --1.8300e+03 5.7143e+02 4.6130e+00 --1.8300e+03 6.0000e+02 4.6481e+00 --1.8300e+03 6.2857e+02 4.6842e+00 --1.8300e+03 6.5714e+02 4.7213e+00 --1.8300e+03 6.8571e+02 4.7593e+00 --1.8300e+03 7.1429e+02 4.7981e+00 --1.8300e+03 7.4286e+02 4.8378e+00 --1.8300e+03 7.7143e+02 4.8781e+00 --1.8300e+03 8.0000e+02 4.9191e+00 --1.8300e+03 8.2857e+02 4.9606e+00 --1.8300e+03 8.5714e+02 5.0026e+00 --1.8300e+03 8.8571e+02 5.0451e+00 --1.8300e+03 9.1429e+02 5.0880e+00 --1.8300e+03 9.4286e+02 5.1312e+00 --1.8300e+03 9.7143e+02 5.1746e+00 --1.8300e+03 1.0000e+03 5.2183e+00 --1.8300e+03 1.0286e+03 5.2621e+00 --1.8300e+03 1.0571e+03 5.3061e+00 --1.8300e+03 1.0857e+03 5.3501e+00 --1.8300e+03 1.1143e+03 5.3942e+00 --1.8300e+03 1.1429e+03 5.4382e+00 --1.8300e+03 1.1714e+03 5.4822e+00 --1.8300e+03 1.2000e+03 5.5261e+00 --1.8300e+03 1.2286e+03 5.5698e+00 --1.8300e+03 1.2571e+03 5.6135e+00 --1.8300e+03 1.2857e+03 5.6569e+00 --1.8300e+03 1.3143e+03 5.7001e+00 --1.8300e+03 1.3429e+03 5.7430e+00 --1.8300e+03 1.3714e+03 5.7857e+00 --1.8300e+03 1.4000e+03 5.8281e+00 --1.8300e+03 1.4286e+03 5.8702e+00 --1.8300e+03 1.4571e+03 5.9120e+00 --1.8300e+03 1.4857e+03 5.9534e+00 --1.8300e+03 1.5143e+03 5.9945e+00 --1.8300e+03 1.5429e+03 6.0352e+00 --1.8300e+03 1.5714e+03 6.0755e+00 --1.8300e+03 1.6000e+03 6.1154e+00 --1.8300e+03 1.6286e+03 6.1549e+00 --1.8300e+03 1.6571e+03 6.1939e+00 --1.8300e+03 1.6857e+03 6.2326e+00 --1.8300e+03 1.7143e+03 6.2708e+00 --1.8300e+03 1.7429e+03 6.3086e+00 --1.8300e+03 1.7714e+03 6.3460e+00 --1.8300e+03 1.8000e+03 6.3829e+00 --1.8300e+03 1.8286e+03 6.4193e+00 --1.8300e+03 1.8571e+03 6.4553e+00 --1.8300e+03 1.8857e+03 6.4909e+00 --1.8300e+03 1.9143e+03 6.5260e+00 --1.8300e+03 1.9429e+03 6.5607e+00 --1.8300e+03 1.9714e+03 6.5949e+00 --1.8300e+03 2.0000e+03 6.6287e+00 --1.8000e+03 -2.0000e+03 6.5963e+00 --1.8000e+03 -1.9714e+03 6.5616e+00 --1.8000e+03 -1.9429e+03 6.5264e+00 --1.8000e+03 -1.9143e+03 6.4908e+00 --1.8000e+03 -1.8857e+03 6.4547e+00 --1.8000e+03 -1.8571e+03 6.4181e+00 --1.8000e+03 -1.8286e+03 6.3810e+00 --1.8000e+03 -1.8000e+03 6.3434e+00 --1.8000e+03 -1.7714e+03 6.3054e+00 --1.8000e+03 -1.7429e+03 6.2669e+00 --1.8000e+03 -1.7143e+03 6.2279e+00 --1.8000e+03 -1.6857e+03 6.1884e+00 --1.8000e+03 -1.6571e+03 6.1485e+00 --1.8000e+03 -1.6286e+03 6.1081e+00 --1.8000e+03 -1.6000e+03 6.0673e+00 --1.8000e+03 -1.5714e+03 6.0260e+00 --1.8000e+03 -1.5429e+03 5.9843e+00 --1.8000e+03 -1.5143e+03 5.9421e+00 --1.8000e+03 -1.4857e+03 5.8995e+00 --1.8000e+03 -1.4571e+03 5.8566e+00 --1.8000e+03 -1.4286e+03 5.8132e+00 --1.8000e+03 -1.4000e+03 5.7695e+00 --1.8000e+03 -1.3714e+03 5.7254e+00 --1.8000e+03 -1.3429e+03 5.6810e+00 --1.8000e+03 -1.3143e+03 5.6363e+00 --1.8000e+03 -1.2857e+03 5.5913e+00 --1.8000e+03 -1.2571e+03 5.5461e+00 --1.8000e+03 -1.2286e+03 5.5006e+00 --1.8000e+03 -1.2000e+03 5.4550e+00 --1.8000e+03 -1.1714e+03 5.4091e+00 --1.8000e+03 -1.1429e+03 5.3632e+00 --1.8000e+03 -1.1143e+03 5.3171e+00 --1.8000e+03 -1.0857e+03 5.2710e+00 --1.8000e+03 -1.0571e+03 5.2249e+00 --1.8000e+03 -1.0286e+03 5.1788e+00 --1.8000e+03 -1.0000e+03 5.1329e+00 --1.8000e+03 -9.7143e+02 5.0870e+00 --1.8000e+03 -9.4286e+02 5.0414e+00 --1.8000e+03 -9.1429e+02 4.9960e+00 --1.8000e+03 -8.8571e+02 4.9509e+00 --1.8000e+03 -8.5714e+02 4.9062e+00 --1.8000e+03 -8.2857e+02 4.8619e+00 --1.8000e+03 -8.0000e+02 4.8181e+00 --1.8000e+03 -7.7143e+02 4.7749e+00 --1.8000e+03 -7.4286e+02 4.7324e+00 --1.8000e+03 -7.1429e+02 4.6905e+00 --1.8000e+03 -6.8571e+02 4.6494e+00 --1.8000e+03 -6.5714e+02 4.6092e+00 --1.8000e+03 -6.2857e+02 4.5700e+00 --1.8000e+03 -6.0000e+02 4.5318e+00 --1.8000e+03 -5.7143e+02 4.4946e+00 --1.8000e+03 -5.4286e+02 4.4587e+00 --1.8000e+03 -5.1429e+02 4.4240e+00 --1.8000e+03 -4.8571e+02 4.3906e+00 --1.8000e+03 -4.5714e+02 4.3586e+00 --1.8000e+03 -4.2857e+02 4.3282e+00 --1.8000e+03 -4.0000e+02 4.2993e+00 --1.8000e+03 -3.7143e+02 4.2720e+00 --1.8000e+03 -3.4286e+02 4.2464e+00 --1.8000e+03 -3.1429e+02 4.2226e+00 --1.8000e+03 -2.8571e+02 4.2007e+00 --1.8000e+03 -2.5714e+02 4.1807e+00 --1.8000e+03 -2.2857e+02 4.1626e+00 --1.8000e+03 -2.0000e+02 4.1465e+00 --1.8000e+03 -1.7143e+02 4.1324e+00 --1.8000e+03 -1.4286e+02 4.1205e+00 --1.8000e+03 -1.1429e+02 4.1106e+00 --1.8000e+03 -8.5714e+01 4.1030e+00 --1.8000e+03 -5.7143e+01 4.0975e+00 --1.8000e+03 -2.8571e+01 4.0942e+00 --1.8000e+03 0.0000e+00 4.0931e+00 --1.8000e+03 2.8571e+01 4.0942e+00 --1.8000e+03 5.7143e+01 4.0975e+00 --1.8000e+03 8.5714e+01 4.1030e+00 --1.8000e+03 1.1429e+02 4.1106e+00 --1.8000e+03 1.4286e+02 4.1205e+00 --1.8000e+03 1.7143e+02 4.1324e+00 --1.8000e+03 2.0000e+02 4.1465e+00 --1.8000e+03 2.2857e+02 4.1626e+00 --1.8000e+03 2.5714e+02 4.1807e+00 --1.8000e+03 2.8571e+02 4.2007e+00 --1.8000e+03 3.1429e+02 4.2226e+00 --1.8000e+03 3.4286e+02 4.2464e+00 --1.8000e+03 3.7143e+02 4.2720e+00 --1.8000e+03 4.0000e+02 4.2993e+00 --1.8000e+03 4.2857e+02 4.3282e+00 --1.8000e+03 4.5714e+02 4.3586e+00 --1.8000e+03 4.8571e+02 4.3906e+00 --1.8000e+03 5.1429e+02 4.4240e+00 --1.8000e+03 5.4286e+02 4.4587e+00 --1.8000e+03 5.7143e+02 4.4946e+00 --1.8000e+03 6.0000e+02 4.5318e+00 --1.8000e+03 6.2857e+02 4.5700e+00 --1.8000e+03 6.5714e+02 4.6092e+00 --1.8000e+03 6.8571e+02 4.6494e+00 --1.8000e+03 7.1429e+02 4.6905e+00 --1.8000e+03 7.4286e+02 4.7324e+00 --1.8000e+03 7.7143e+02 4.7749e+00 --1.8000e+03 8.0000e+02 4.8181e+00 --1.8000e+03 8.2857e+02 4.8619e+00 --1.8000e+03 8.5714e+02 4.9062e+00 --1.8000e+03 8.8571e+02 4.9509e+00 --1.8000e+03 9.1429e+02 4.9960e+00 --1.8000e+03 9.4286e+02 5.0414e+00 --1.8000e+03 9.7143e+02 5.0870e+00 --1.8000e+03 1.0000e+03 5.1329e+00 --1.8000e+03 1.0286e+03 5.1788e+00 --1.8000e+03 1.0571e+03 5.2249e+00 --1.8000e+03 1.0857e+03 5.2710e+00 --1.8000e+03 1.1143e+03 5.3171e+00 --1.8000e+03 1.1429e+03 5.3632e+00 --1.8000e+03 1.1714e+03 5.4091e+00 --1.8000e+03 1.2000e+03 5.4550e+00 --1.8000e+03 1.2286e+03 5.5006e+00 --1.8000e+03 1.2571e+03 5.5461e+00 --1.8000e+03 1.2857e+03 5.5913e+00 --1.8000e+03 1.3143e+03 5.6363e+00 --1.8000e+03 1.3429e+03 5.6810e+00 --1.8000e+03 1.3714e+03 5.7254e+00 --1.8000e+03 1.4000e+03 5.7695e+00 --1.8000e+03 1.4286e+03 5.8132e+00 --1.8000e+03 1.4571e+03 5.8566e+00 --1.8000e+03 1.4857e+03 5.8995e+00 --1.8000e+03 1.5143e+03 5.9421e+00 --1.8000e+03 1.5429e+03 5.9843e+00 --1.8000e+03 1.5714e+03 6.0260e+00 --1.8000e+03 1.6000e+03 6.0673e+00 --1.8000e+03 1.6286e+03 6.1081e+00 --1.8000e+03 1.6571e+03 6.1485e+00 --1.8000e+03 1.6857e+03 6.1884e+00 --1.8000e+03 1.7143e+03 6.2279e+00 --1.8000e+03 1.7429e+03 6.2669e+00 --1.8000e+03 1.7714e+03 6.3054e+00 --1.8000e+03 1.8000e+03 6.3434e+00 --1.8000e+03 1.8286e+03 6.3810e+00 --1.8000e+03 1.8571e+03 6.4181e+00 --1.8000e+03 1.8857e+03 6.4547e+00 --1.8000e+03 1.9143e+03 6.4908e+00 --1.8000e+03 1.9429e+03 6.5264e+00 --1.8000e+03 1.9714e+03 6.5616e+00 --1.8000e+03 2.0000e+03 6.5963e+00 --1.7700e+03 -2.0000e+03 6.5636e+00 --1.7700e+03 -1.9714e+03 6.5279e+00 --1.7700e+03 -1.9429e+03 6.4918e+00 --1.7700e+03 -1.9143e+03 6.4552e+00 --1.7700e+03 -1.8857e+03 6.4180e+00 --1.7700e+03 -1.8571e+03 6.3804e+00 --1.7700e+03 -1.8286e+03 6.3422e+00 --1.7700e+03 -1.8000e+03 6.3035e+00 --1.7700e+03 -1.7714e+03 6.2643e+00 --1.7700e+03 -1.7429e+03 6.2246e+00 --1.7700e+03 -1.7143e+03 6.1843e+00 --1.7700e+03 -1.6857e+03 6.1436e+00 --1.7700e+03 -1.6571e+03 6.1023e+00 --1.7700e+03 -1.6286e+03 6.0606e+00 --1.7700e+03 -1.6000e+03 6.0183e+00 --1.7700e+03 -1.5714e+03 5.9756e+00 --1.7700e+03 -1.5429e+03 5.9324e+00 --1.7700e+03 -1.5143e+03 5.8887e+00 --1.7700e+03 -1.4857e+03 5.8446e+00 --1.7700e+03 -1.4571e+03 5.8000e+00 --1.7700e+03 -1.4286e+03 5.7550e+00 --1.7700e+03 -1.4000e+03 5.7096e+00 --1.7700e+03 -1.3714e+03 5.6638e+00 --1.7700e+03 -1.3429e+03 5.6176e+00 --1.7700e+03 -1.3143e+03 5.5711e+00 --1.7700e+03 -1.2857e+03 5.5242e+00 --1.7700e+03 -1.2571e+03 5.4770e+00 --1.7700e+03 -1.2286e+03 5.4296e+00 --1.7700e+03 -1.2000e+03 5.3819e+00 --1.7700e+03 -1.1714e+03 5.3340e+00 --1.7700e+03 -1.1429e+03 5.2860e+00 --1.7700e+03 -1.1143e+03 5.2378e+00 --1.7700e+03 -1.0857e+03 5.1895e+00 --1.7700e+03 -1.0571e+03 5.1412e+00 --1.7700e+03 -1.0286e+03 5.0929e+00 --1.7700e+03 -1.0000e+03 5.0447e+00 --1.7700e+03 -9.7143e+02 4.9966e+00 --1.7700e+03 -9.4286e+02 4.9486e+00 --1.7700e+03 -9.1429e+02 4.9008e+00 --1.7700e+03 -8.8571e+02 4.8534e+00 --1.7700e+03 -8.5714e+02 4.8063e+00 --1.7700e+03 -8.2857e+02 4.7596e+00 --1.7700e+03 -8.0000e+02 4.7134e+00 --1.7700e+03 -7.7143e+02 4.6678e+00 --1.7700e+03 -7.4286e+02 4.6229e+00 --1.7700e+03 -7.1429e+02 4.5786e+00 --1.7700e+03 -6.8571e+02 4.5352e+00 --1.7700e+03 -6.5714e+02 4.4926e+00 --1.7700e+03 -6.2857e+02 4.4510e+00 --1.7700e+03 -6.0000e+02 4.4105e+00 --1.7700e+03 -5.7143e+02 4.3711e+00 --1.7700e+03 -5.4286e+02 4.3329e+00 --1.7700e+03 -5.1429e+02 4.2960e+00 --1.7700e+03 -4.8571e+02 4.2606e+00 --1.7700e+03 -4.5714e+02 4.2266e+00 --1.7700e+03 -4.2857e+02 4.1942e+00 --1.7700e+03 -4.0000e+02 4.1634e+00 --1.7700e+03 -3.7143e+02 4.1344e+00 --1.7700e+03 -3.4286e+02 4.1071e+00 --1.7700e+03 -3.1429e+02 4.0818e+00 --1.7700e+03 -2.8571e+02 4.0584e+00 --1.7700e+03 -2.5714e+02 4.0370e+00 --1.7700e+03 -2.2857e+02 4.0177e+00 --1.7700e+03 -2.0000e+02 4.0005e+00 --1.7700e+03 -1.7143e+02 3.9855e+00 --1.7700e+03 -1.4286e+02 3.9727e+00 --1.7700e+03 -1.1429e+02 3.9622e+00 --1.7700e+03 -8.5714e+01 3.9540e+00 --1.7700e+03 -5.7143e+01 3.9481e+00 --1.7700e+03 -2.8571e+01 3.9446e+00 --1.7700e+03 0.0000e+00 3.9434e+00 --1.7700e+03 2.8571e+01 3.9446e+00 --1.7700e+03 5.7143e+01 3.9481e+00 --1.7700e+03 8.5714e+01 3.9540e+00 --1.7700e+03 1.1429e+02 3.9622e+00 --1.7700e+03 1.4286e+02 3.9727e+00 --1.7700e+03 1.7143e+02 3.9855e+00 --1.7700e+03 2.0000e+02 4.0005e+00 --1.7700e+03 2.2857e+02 4.0177e+00 --1.7700e+03 2.5714e+02 4.0370e+00 --1.7700e+03 2.8571e+02 4.0584e+00 --1.7700e+03 3.1429e+02 4.0818e+00 --1.7700e+03 3.4286e+02 4.1071e+00 --1.7700e+03 3.7143e+02 4.1344e+00 --1.7700e+03 4.0000e+02 4.1634e+00 --1.7700e+03 4.2857e+02 4.1942e+00 --1.7700e+03 4.5714e+02 4.2266e+00 --1.7700e+03 4.8571e+02 4.2606e+00 --1.7700e+03 5.1429e+02 4.2960e+00 --1.7700e+03 5.4286e+02 4.3329e+00 --1.7700e+03 5.7143e+02 4.3711e+00 --1.7700e+03 6.0000e+02 4.4105e+00 --1.7700e+03 6.2857e+02 4.4510e+00 --1.7700e+03 6.5714e+02 4.4926e+00 --1.7700e+03 6.8571e+02 4.5352e+00 --1.7700e+03 7.1429e+02 4.5786e+00 --1.7700e+03 7.4286e+02 4.6229e+00 --1.7700e+03 7.7143e+02 4.6678e+00 --1.7700e+03 8.0000e+02 4.7134e+00 --1.7700e+03 8.2857e+02 4.7596e+00 --1.7700e+03 8.5714e+02 4.8063e+00 --1.7700e+03 8.8571e+02 4.8534e+00 --1.7700e+03 9.1429e+02 4.9008e+00 --1.7700e+03 9.4286e+02 4.9486e+00 --1.7700e+03 9.7143e+02 4.9966e+00 --1.7700e+03 1.0000e+03 5.0447e+00 --1.7700e+03 1.0286e+03 5.0929e+00 --1.7700e+03 1.0571e+03 5.1412e+00 --1.7700e+03 1.0857e+03 5.1895e+00 --1.7700e+03 1.1143e+03 5.2378e+00 --1.7700e+03 1.1429e+03 5.2860e+00 --1.7700e+03 1.1714e+03 5.3340e+00 --1.7700e+03 1.2000e+03 5.3819e+00 --1.7700e+03 1.2286e+03 5.4296e+00 --1.7700e+03 1.2571e+03 5.4770e+00 --1.7700e+03 1.2857e+03 5.5242e+00 --1.7700e+03 1.3143e+03 5.5711e+00 --1.7700e+03 1.3429e+03 5.6176e+00 --1.7700e+03 1.3714e+03 5.6638e+00 --1.7700e+03 1.4000e+03 5.7096e+00 --1.7700e+03 1.4286e+03 5.7550e+00 --1.7700e+03 1.4571e+03 5.8000e+00 --1.7700e+03 1.4857e+03 5.8446e+00 --1.7700e+03 1.5143e+03 5.8887e+00 --1.7700e+03 1.5429e+03 5.9324e+00 --1.7700e+03 1.5714e+03 5.9756e+00 --1.7700e+03 1.6000e+03 6.0183e+00 --1.7700e+03 1.6286e+03 6.0606e+00 --1.7700e+03 1.6571e+03 6.1023e+00 --1.7700e+03 1.6857e+03 6.1436e+00 --1.7700e+03 1.7143e+03 6.1843e+00 --1.7700e+03 1.7429e+03 6.2246e+00 --1.7700e+03 1.7714e+03 6.2643e+00 --1.7700e+03 1.8000e+03 6.3035e+00 --1.7700e+03 1.8286e+03 6.3422e+00 --1.7700e+03 1.8571e+03 6.3804e+00 --1.7700e+03 1.8857e+03 6.4180e+00 --1.7700e+03 1.9143e+03 6.4552e+00 --1.7700e+03 1.9429e+03 6.4918e+00 --1.7700e+03 1.9714e+03 6.5279e+00 --1.7700e+03 2.0000e+03 6.5636e+00 --1.7400e+03 -2.0000e+03 6.5305e+00 --1.7400e+03 -1.9714e+03 6.4940e+00 --1.7400e+03 -1.9429e+03 6.4568e+00 --1.7400e+03 -1.9143e+03 6.4192e+00 --1.7400e+03 -1.8857e+03 6.3810e+00 --1.7400e+03 -1.8571e+03 6.3422e+00 --1.7400e+03 -1.8286e+03 6.3029e+00 --1.7400e+03 -1.8000e+03 6.2630e+00 --1.7400e+03 -1.7714e+03 6.2226e+00 --1.7400e+03 -1.7429e+03 6.1816e+00 --1.7400e+03 -1.7143e+03 6.1401e+00 --1.7400e+03 -1.6857e+03 6.0980e+00 --1.7400e+03 -1.6571e+03 6.0554e+00 --1.7400e+03 -1.6286e+03 6.0123e+00 --1.7400e+03 -1.6000e+03 5.9686e+00 --1.7400e+03 -1.5714e+03 5.9243e+00 --1.7400e+03 -1.5429e+03 5.8796e+00 --1.7400e+03 -1.5143e+03 5.8343e+00 --1.7400e+03 -1.4857e+03 5.7886e+00 --1.7400e+03 -1.4571e+03 5.7423e+00 --1.7400e+03 -1.4286e+03 5.6956e+00 --1.7400e+03 -1.4000e+03 5.6484e+00 --1.7400e+03 -1.3714e+03 5.6008e+00 --1.7400e+03 -1.3429e+03 5.5527e+00 --1.7400e+03 -1.3143e+03 5.5042e+00 --1.7400e+03 -1.2857e+03 5.4554e+00 --1.7400e+03 -1.2571e+03 5.4062e+00 --1.7400e+03 -1.2286e+03 5.3567e+00 --1.7400e+03 -1.2000e+03 5.3069e+00 --1.7400e+03 -1.1714e+03 5.2569e+00 --1.7400e+03 -1.1429e+03 5.2066e+00 --1.7400e+03 -1.1143e+03 5.1562e+00 --1.7400e+03 -1.0857e+03 5.1056e+00 --1.7400e+03 -1.0571e+03 5.0550e+00 --1.7400e+03 -1.0286e+03 5.0043e+00 --1.7400e+03 -1.0000e+03 4.9537e+00 --1.7400e+03 -9.7143e+02 4.9031e+00 --1.7400e+03 -9.4286e+02 4.8526e+00 --1.7400e+03 -9.1429e+02 4.8024e+00 --1.7400e+03 -8.8571e+02 4.7524e+00 --1.7400e+03 -8.5714e+02 4.7028e+00 --1.7400e+03 -8.2857e+02 4.6535e+00 --1.7400e+03 -8.0000e+02 4.6048e+00 --1.7400e+03 -7.7143e+02 4.5566e+00 --1.7400e+03 -7.4286e+02 4.5090e+00 --1.7400e+03 -7.1429e+02 4.4622e+00 --1.7400e+03 -6.8571e+02 4.4162e+00 --1.7400e+03 -6.5714e+02 4.3711e+00 --1.7400e+03 -6.2857e+02 4.3270e+00 --1.7400e+03 -6.0000e+02 4.2840e+00 --1.7400e+03 -5.7143e+02 4.2421e+00 --1.7400e+03 -5.4286e+02 4.2016e+00 --1.7400e+03 -5.1429e+02 4.1624e+00 --1.7400e+03 -4.8571e+02 4.1246e+00 --1.7400e+03 -4.5714e+02 4.0884e+00 --1.7400e+03 -4.2857e+02 4.0539e+00 --1.7400e+03 -4.0000e+02 4.0211e+00 --1.7400e+03 -3.7143e+02 3.9901e+00 --1.7400e+03 -3.4286e+02 3.9611e+00 --1.7400e+03 -3.1429e+02 3.9340e+00 --1.7400e+03 -2.8571e+02 3.9090e+00 --1.7400e+03 -2.5714e+02 3.8861e+00 --1.7400e+03 -2.2857e+02 3.8655e+00 --1.7400e+03 -2.0000e+02 3.8471e+00 --1.7400e+03 -1.7143e+02 3.8311e+00 --1.7400e+03 -1.4286e+02 3.8174e+00 --1.7400e+03 -1.1429e+02 3.8062e+00 --1.7400e+03 -8.5714e+01 3.7974e+00 --1.7400e+03 -5.7143e+01 3.7911e+00 --1.7400e+03 -2.8571e+01 3.7873e+00 --1.7400e+03 0.0000e+00 3.7861e+00 --1.7400e+03 2.8571e+01 3.7873e+00 --1.7400e+03 5.7143e+01 3.7911e+00 --1.7400e+03 8.5714e+01 3.7974e+00 --1.7400e+03 1.1429e+02 3.8062e+00 --1.7400e+03 1.4286e+02 3.8174e+00 --1.7400e+03 1.7143e+02 3.8311e+00 --1.7400e+03 2.0000e+02 3.8471e+00 --1.7400e+03 2.2857e+02 3.8655e+00 --1.7400e+03 2.5714e+02 3.8861e+00 --1.7400e+03 2.8571e+02 3.9090e+00 --1.7400e+03 3.1429e+02 3.9340e+00 --1.7400e+03 3.4286e+02 3.9611e+00 --1.7400e+03 3.7143e+02 3.9901e+00 --1.7400e+03 4.0000e+02 4.0211e+00 --1.7400e+03 4.2857e+02 4.0539e+00 --1.7400e+03 4.5714e+02 4.0884e+00 --1.7400e+03 4.8571e+02 4.1246e+00 --1.7400e+03 5.1429e+02 4.1624e+00 --1.7400e+03 5.4286e+02 4.2016e+00 --1.7400e+03 5.7143e+02 4.2421e+00 --1.7400e+03 6.0000e+02 4.2840e+00 --1.7400e+03 6.2857e+02 4.3270e+00 --1.7400e+03 6.5714e+02 4.3711e+00 --1.7400e+03 6.8571e+02 4.4162e+00 --1.7400e+03 7.1429e+02 4.4622e+00 --1.7400e+03 7.4286e+02 4.5090e+00 --1.7400e+03 7.7143e+02 4.5566e+00 --1.7400e+03 8.0000e+02 4.6048e+00 --1.7400e+03 8.2857e+02 4.6535e+00 --1.7400e+03 8.5714e+02 4.7028e+00 --1.7400e+03 8.8571e+02 4.7524e+00 --1.7400e+03 9.1429e+02 4.8024e+00 --1.7400e+03 9.4286e+02 4.8526e+00 --1.7400e+03 9.7143e+02 4.9031e+00 --1.7400e+03 1.0000e+03 4.9537e+00 --1.7400e+03 1.0286e+03 5.0043e+00 --1.7400e+03 1.0571e+03 5.0550e+00 --1.7400e+03 1.0857e+03 5.1056e+00 --1.7400e+03 1.1143e+03 5.1562e+00 --1.7400e+03 1.1429e+03 5.2066e+00 --1.7400e+03 1.1714e+03 5.2569e+00 --1.7400e+03 1.2000e+03 5.3069e+00 --1.7400e+03 1.2286e+03 5.3567e+00 --1.7400e+03 1.2571e+03 5.4062e+00 --1.7400e+03 1.2857e+03 5.4554e+00 --1.7400e+03 1.3143e+03 5.5042e+00 --1.7400e+03 1.3429e+03 5.5527e+00 --1.7400e+03 1.3714e+03 5.6008e+00 --1.7400e+03 1.4000e+03 5.6484e+00 --1.7400e+03 1.4286e+03 5.6956e+00 --1.7400e+03 1.4571e+03 5.7423e+00 --1.7400e+03 1.4857e+03 5.7886e+00 --1.7400e+03 1.5143e+03 5.8343e+00 --1.7400e+03 1.5429e+03 5.8796e+00 --1.7400e+03 1.5714e+03 5.9243e+00 --1.7400e+03 1.6000e+03 5.9686e+00 --1.7400e+03 1.6286e+03 6.0123e+00 --1.7400e+03 1.6571e+03 6.0554e+00 --1.7400e+03 1.6857e+03 6.0980e+00 --1.7400e+03 1.7143e+03 6.1401e+00 --1.7400e+03 1.7429e+03 6.1816e+00 --1.7400e+03 1.7714e+03 6.2226e+00 --1.7400e+03 1.8000e+03 6.2630e+00 --1.7400e+03 1.8286e+03 6.3029e+00 --1.7400e+03 1.8571e+03 6.3422e+00 --1.7400e+03 1.8857e+03 6.3810e+00 --1.7400e+03 1.9143e+03 6.4192e+00 --1.7400e+03 1.9429e+03 6.4568e+00 --1.7400e+03 1.9714e+03 6.4940e+00 --1.7400e+03 2.0000e+03 6.5305e+00 --1.7100e+03 -2.0000e+03 6.4972e+00 --1.7100e+03 -1.9714e+03 6.4596e+00 --1.7100e+03 -1.9429e+03 6.4215e+00 --1.7100e+03 -1.9143e+03 6.3828e+00 --1.7100e+03 -1.8857e+03 6.3435e+00 --1.7100e+03 -1.8571e+03 6.3036e+00 --1.7100e+03 -1.8286e+03 6.2631e+00 --1.7100e+03 -1.8000e+03 6.2220e+00 --1.7100e+03 -1.7714e+03 6.1803e+00 --1.7100e+03 -1.7429e+03 6.1381e+00 --1.7100e+03 -1.7143e+03 6.0952e+00 --1.7100e+03 -1.6857e+03 6.0518e+00 --1.7100e+03 -1.6571e+03 6.0078e+00 --1.7100e+03 -1.6286e+03 5.9631e+00 --1.7100e+03 -1.6000e+03 5.9179e+00 --1.7100e+03 -1.5714e+03 5.8722e+00 --1.7100e+03 -1.5429e+03 5.8258e+00 --1.7100e+03 -1.5143e+03 5.7789e+00 --1.7100e+03 -1.4857e+03 5.7314e+00 --1.7100e+03 -1.4571e+03 5.6834e+00 --1.7100e+03 -1.4286e+03 5.6349e+00 --1.7100e+03 -1.4000e+03 5.5858e+00 --1.7100e+03 -1.3714e+03 5.5363e+00 --1.7100e+03 -1.3429e+03 5.4863e+00 --1.7100e+03 -1.3143e+03 5.4358e+00 --1.7100e+03 -1.2857e+03 5.3849e+00 --1.7100e+03 -1.2571e+03 5.3336e+00 --1.7100e+03 -1.2286e+03 5.2819e+00 --1.7100e+03 -1.2000e+03 5.2299e+00 --1.7100e+03 -1.1714e+03 5.1776e+00 --1.7100e+03 -1.1429e+03 5.1250e+00 --1.7100e+03 -1.1143e+03 5.0722e+00 --1.7100e+03 -1.0857e+03 5.0192e+00 --1.7100e+03 -1.0571e+03 4.9661e+00 --1.7100e+03 -1.0286e+03 4.9129e+00 --1.7100e+03 -1.0000e+03 4.8596e+00 --1.7100e+03 -9.7143e+02 4.8065e+00 --1.7100e+03 -9.4286e+02 4.7534e+00 --1.7100e+03 -9.1429e+02 4.7005e+00 --1.7100e+03 -8.8571e+02 4.6478e+00 --1.7100e+03 -8.5714e+02 4.5954e+00 --1.7100e+03 -8.2857e+02 4.5434e+00 --1.7100e+03 -8.0000e+02 4.4919e+00 --1.7100e+03 -7.7143e+02 4.4409e+00 --1.7100e+03 -7.4286e+02 4.3906e+00 --1.7100e+03 -7.1429e+02 4.3410e+00 --1.7100e+03 -6.8571e+02 4.2922e+00 --1.7100e+03 -6.5714e+02 4.2444e+00 --1.7100e+03 -6.2857e+02 4.1976e+00 --1.7100e+03 -6.0000e+02 4.1519e+00 --1.7100e+03 -5.7143e+02 4.1074e+00 --1.7100e+03 -5.4286e+02 4.0642e+00 --1.7100e+03 -5.1429e+02 4.0225e+00 --1.7100e+03 -4.8571e+02 3.9823e+00 --1.7100e+03 -4.5714e+02 3.9437e+00 --1.7100e+03 -4.2857e+02 3.9068e+00 --1.7100e+03 -4.0000e+02 3.8718e+00 --1.7100e+03 -3.7143e+02 3.8388e+00 --1.7100e+03 -3.4286e+02 3.8077e+00 --1.7100e+03 -3.1429e+02 3.7788e+00 --1.7100e+03 -2.8571e+02 3.7520e+00 --1.7100e+03 -2.5714e+02 3.7276e+00 --1.7100e+03 -2.2857e+02 3.7055e+00 --1.7100e+03 -2.0000e+02 3.6858e+00 --1.7100e+03 -1.7143e+02 3.6686e+00 --1.7100e+03 -1.4286e+02 3.6540e+00 --1.7100e+03 -1.1429e+02 3.6419e+00 --1.7100e+03 -8.5714e+01 3.6325e+00 --1.7100e+03 -5.7143e+01 3.6258e+00 --1.7100e+03 -2.8571e+01 3.6217e+00 --1.7100e+03 0.0000e+00 3.6204e+00 --1.7100e+03 2.8571e+01 3.6217e+00 --1.7100e+03 5.7143e+01 3.6258e+00 --1.7100e+03 8.5714e+01 3.6325e+00 --1.7100e+03 1.1429e+02 3.6419e+00 --1.7100e+03 1.4286e+02 3.6540e+00 --1.7100e+03 1.7143e+02 3.6686e+00 --1.7100e+03 2.0000e+02 3.6858e+00 --1.7100e+03 2.2857e+02 3.7055e+00 --1.7100e+03 2.5714e+02 3.7276e+00 --1.7100e+03 2.8571e+02 3.7520e+00 --1.7100e+03 3.1429e+02 3.7788e+00 --1.7100e+03 3.4286e+02 3.8077e+00 --1.7100e+03 3.7143e+02 3.8388e+00 --1.7100e+03 4.0000e+02 3.8718e+00 --1.7100e+03 4.2857e+02 3.9068e+00 --1.7100e+03 4.5714e+02 3.9437e+00 --1.7100e+03 4.8571e+02 3.9823e+00 --1.7100e+03 5.1429e+02 4.0225e+00 --1.7100e+03 5.4286e+02 4.0642e+00 --1.7100e+03 5.7143e+02 4.1074e+00 --1.7100e+03 6.0000e+02 4.1519e+00 --1.7100e+03 6.2857e+02 4.1976e+00 --1.7100e+03 6.5714e+02 4.2444e+00 --1.7100e+03 6.8571e+02 4.2922e+00 --1.7100e+03 7.1429e+02 4.3410e+00 --1.7100e+03 7.4286e+02 4.3906e+00 --1.7100e+03 7.7143e+02 4.4409e+00 --1.7100e+03 8.0000e+02 4.4919e+00 --1.7100e+03 8.2857e+02 4.5434e+00 --1.7100e+03 8.5714e+02 4.5954e+00 --1.7100e+03 8.8571e+02 4.6478e+00 --1.7100e+03 9.1429e+02 4.7005e+00 --1.7100e+03 9.4286e+02 4.7534e+00 --1.7100e+03 9.7143e+02 4.8065e+00 --1.7100e+03 1.0000e+03 4.8596e+00 --1.7100e+03 1.0286e+03 4.9129e+00 --1.7100e+03 1.0571e+03 4.9661e+00 --1.7100e+03 1.0857e+03 5.0192e+00 --1.7100e+03 1.1143e+03 5.0722e+00 --1.7100e+03 1.1429e+03 5.1250e+00 --1.7100e+03 1.1714e+03 5.1776e+00 --1.7100e+03 1.2000e+03 5.2299e+00 --1.7100e+03 1.2286e+03 5.2819e+00 --1.7100e+03 1.2571e+03 5.3336e+00 --1.7100e+03 1.2857e+03 5.3849e+00 --1.7100e+03 1.3143e+03 5.4358e+00 --1.7100e+03 1.3429e+03 5.4863e+00 --1.7100e+03 1.3714e+03 5.5363e+00 --1.7100e+03 1.4000e+03 5.5858e+00 --1.7100e+03 1.4286e+03 5.6349e+00 --1.7100e+03 1.4571e+03 5.6834e+00 --1.7100e+03 1.4857e+03 5.7314e+00 --1.7100e+03 1.5143e+03 5.7789e+00 --1.7100e+03 1.5429e+03 5.8258e+00 --1.7100e+03 1.5714e+03 5.8722e+00 --1.7100e+03 1.6000e+03 5.9179e+00 --1.7100e+03 1.6286e+03 5.9631e+00 --1.7100e+03 1.6571e+03 6.0078e+00 --1.7100e+03 1.6857e+03 6.0518e+00 --1.7100e+03 1.7143e+03 6.0952e+00 --1.7100e+03 1.7429e+03 6.1381e+00 --1.7100e+03 1.7714e+03 6.1803e+00 --1.7100e+03 1.8000e+03 6.2220e+00 --1.7100e+03 1.8286e+03 6.2631e+00 --1.7100e+03 1.8571e+03 6.3036e+00 --1.7100e+03 1.8857e+03 6.3435e+00 --1.7100e+03 1.9143e+03 6.3828e+00 --1.7100e+03 1.9429e+03 6.4215e+00 --1.7100e+03 1.9714e+03 6.4596e+00 --1.7100e+03 2.0000e+03 6.4972e+00 --1.6800e+03 -2.0000e+03 6.4636e+00 --1.6800e+03 -1.9714e+03 6.4250e+00 --1.6800e+03 -1.9429e+03 6.3858e+00 --1.6800e+03 -1.9143e+03 6.3460e+00 --1.6800e+03 -1.8857e+03 6.3055e+00 --1.6800e+03 -1.8571e+03 6.2645e+00 --1.6800e+03 -1.8286e+03 6.2228e+00 --1.6800e+03 -1.8000e+03 6.1805e+00 --1.6800e+03 -1.7714e+03 6.1375e+00 --1.6800e+03 -1.7429e+03 6.0940e+00 --1.6800e+03 -1.7143e+03 6.0497e+00 --1.6800e+03 -1.6857e+03 6.0049e+00 --1.6800e+03 -1.6571e+03 5.9594e+00 --1.6800e+03 -1.6286e+03 5.9132e+00 --1.6800e+03 -1.6000e+03 5.8665e+00 --1.6800e+03 -1.5714e+03 5.8191e+00 --1.6800e+03 -1.5429e+03 5.7710e+00 --1.6800e+03 -1.5143e+03 5.7224e+00 --1.6800e+03 -1.4857e+03 5.6732e+00 --1.6800e+03 -1.4571e+03 5.6233e+00 --1.6800e+03 -1.4286e+03 5.5729e+00 --1.6800e+03 -1.4000e+03 5.5219e+00 --1.6800e+03 -1.3714e+03 5.4704e+00 --1.6800e+03 -1.3429e+03 5.4183e+00 --1.6800e+03 -1.3143e+03 5.3657e+00 --1.6800e+03 -1.2857e+03 5.3126e+00 --1.6800e+03 -1.2571e+03 5.2591e+00 --1.6800e+03 -1.2286e+03 5.2051e+00 --1.6800e+03 -1.2000e+03 5.1508e+00 --1.6800e+03 -1.1714e+03 5.0960e+00 --1.6800e+03 -1.1429e+03 5.0410e+00 --1.6800e+03 -1.1143e+03 4.9857e+00 --1.6800e+03 -1.0857e+03 4.9301e+00 --1.6800e+03 -1.0571e+03 4.8744e+00 --1.6800e+03 -1.0286e+03 4.8185e+00 --1.6800e+03 -1.0000e+03 4.7625e+00 --1.6800e+03 -9.7143e+02 4.7066e+00 --1.6800e+03 -9.4286e+02 4.6507e+00 --1.6800e+03 -9.1429e+02 4.5949e+00 --1.6800e+03 -8.8571e+02 4.5393e+00 --1.6800e+03 -8.5714e+02 4.4840e+00 --1.6800e+03 -8.2857e+02 4.4291e+00 --1.6800e+03 -8.0000e+02 4.3746e+00 --1.6800e+03 -7.7143e+02 4.3207e+00 --1.6800e+03 -7.4286e+02 4.2674e+00 --1.6800e+03 -7.1429e+02 4.2148e+00 --1.6800e+03 -6.8571e+02 4.1630e+00 --1.6800e+03 -6.5714e+02 4.1122e+00 --1.6800e+03 -6.2857e+02 4.0624e+00 --1.6800e+03 -6.0000e+02 4.0138e+00 --1.6800e+03 -5.7143e+02 3.9665e+00 --1.6800e+03 -5.4286e+02 3.9205e+00 --1.6800e+03 -5.1429e+02 3.8760e+00 --1.6800e+03 -4.8571e+02 3.8331e+00 --1.6800e+03 -4.5714e+02 3.7919e+00 --1.6800e+03 -4.2857e+02 3.7526e+00 --1.6800e+03 -4.0000e+02 3.7151e+00 --1.6800e+03 -3.7143e+02 3.6798e+00 --1.6800e+03 -3.4286e+02 3.6465e+00 --1.6800e+03 -3.1429e+02 3.6155e+00 --1.6800e+03 -2.8571e+02 3.5869e+00 --1.6800e+03 -2.5714e+02 3.5607e+00 --1.6800e+03 -2.2857e+02 3.5370e+00 --1.6800e+03 -2.0000e+02 3.5159e+00 --1.6800e+03 -1.7143e+02 3.4975e+00 --1.6800e+03 -1.4286e+02 3.4818e+00 --1.6800e+03 -1.1429e+02 3.4688e+00 --1.6800e+03 -8.5714e+01 3.4587e+00 --1.6800e+03 -5.7143e+01 3.4515e+00 --1.6800e+03 -2.8571e+01 3.4471e+00 --1.6800e+03 0.0000e+00 3.4457e+00 --1.6800e+03 2.8571e+01 3.4471e+00 --1.6800e+03 5.7143e+01 3.4515e+00 --1.6800e+03 8.5714e+01 3.4587e+00 --1.6800e+03 1.1429e+02 3.4688e+00 --1.6800e+03 1.4286e+02 3.4818e+00 --1.6800e+03 1.7143e+02 3.4975e+00 --1.6800e+03 2.0000e+02 3.5159e+00 --1.6800e+03 2.2857e+02 3.5370e+00 --1.6800e+03 2.5714e+02 3.5607e+00 --1.6800e+03 2.8571e+02 3.5869e+00 --1.6800e+03 3.1429e+02 3.6155e+00 --1.6800e+03 3.4286e+02 3.6465e+00 --1.6800e+03 3.7143e+02 3.6798e+00 --1.6800e+03 4.0000e+02 3.7151e+00 --1.6800e+03 4.2857e+02 3.7526e+00 --1.6800e+03 4.5714e+02 3.7919e+00 --1.6800e+03 4.8571e+02 3.8331e+00 --1.6800e+03 5.1429e+02 3.8760e+00 --1.6800e+03 5.4286e+02 3.9205e+00 --1.6800e+03 5.7143e+02 3.9665e+00 --1.6800e+03 6.0000e+02 4.0138e+00 --1.6800e+03 6.2857e+02 4.0624e+00 --1.6800e+03 6.5714e+02 4.1122e+00 --1.6800e+03 6.8571e+02 4.1630e+00 --1.6800e+03 7.1429e+02 4.2148e+00 --1.6800e+03 7.4286e+02 4.2674e+00 --1.6800e+03 7.7143e+02 4.3207e+00 --1.6800e+03 8.0000e+02 4.3746e+00 --1.6800e+03 8.2857e+02 4.4291e+00 --1.6800e+03 8.5714e+02 4.4840e+00 --1.6800e+03 8.8571e+02 4.5393e+00 --1.6800e+03 9.1429e+02 4.5949e+00 --1.6800e+03 9.4286e+02 4.6507e+00 --1.6800e+03 9.7143e+02 4.7066e+00 --1.6800e+03 1.0000e+03 4.7625e+00 --1.6800e+03 1.0286e+03 4.8185e+00 --1.6800e+03 1.0571e+03 4.8744e+00 --1.6800e+03 1.0857e+03 4.9301e+00 --1.6800e+03 1.1143e+03 4.9857e+00 --1.6800e+03 1.1429e+03 5.0410e+00 --1.6800e+03 1.1714e+03 5.0960e+00 --1.6800e+03 1.2000e+03 5.1508e+00 --1.6800e+03 1.2286e+03 5.2051e+00 --1.6800e+03 1.2571e+03 5.2591e+00 --1.6800e+03 1.2857e+03 5.3126e+00 --1.6800e+03 1.3143e+03 5.3657e+00 --1.6800e+03 1.3429e+03 5.4183e+00 --1.6800e+03 1.3714e+03 5.4704e+00 --1.6800e+03 1.4000e+03 5.5219e+00 --1.6800e+03 1.4286e+03 5.5729e+00 --1.6800e+03 1.4571e+03 5.6233e+00 --1.6800e+03 1.4857e+03 5.6732e+00 --1.6800e+03 1.5143e+03 5.7224e+00 --1.6800e+03 1.5429e+03 5.7710e+00 --1.6800e+03 1.5714e+03 5.8191e+00 --1.6800e+03 1.6000e+03 5.8665e+00 --1.6800e+03 1.6286e+03 5.9132e+00 --1.6800e+03 1.6571e+03 5.9594e+00 --1.6800e+03 1.6857e+03 6.0049e+00 --1.6800e+03 1.7143e+03 6.0497e+00 --1.6800e+03 1.7429e+03 6.0940e+00 --1.6800e+03 1.7714e+03 6.1375e+00 --1.6800e+03 1.8000e+03 6.1805e+00 --1.6800e+03 1.8286e+03 6.2228e+00 --1.6800e+03 1.8571e+03 6.2645e+00 --1.6800e+03 1.8857e+03 6.3055e+00 --1.6800e+03 1.9143e+03 6.3460e+00 --1.6800e+03 1.9429e+03 6.3858e+00 --1.6800e+03 1.9714e+03 6.4250e+00 --1.6800e+03 2.0000e+03 6.4636e+00 --1.6500e+03 -2.0000e+03 6.4297e+00 --1.6500e+03 -1.9714e+03 6.3900e+00 --1.6500e+03 -1.9429e+03 6.3498e+00 --1.6500e+03 -1.9143e+03 6.3088e+00 --1.6500e+03 -1.8857e+03 6.2672e+00 --1.6500e+03 -1.8571e+03 6.2250e+00 --1.6500e+03 -1.8286e+03 6.1821e+00 --1.6500e+03 -1.8000e+03 6.1385e+00 --1.6500e+03 -1.7714e+03 6.0942e+00 --1.6500e+03 -1.7429e+03 6.0492e+00 --1.6500e+03 -1.7143e+03 6.0036e+00 --1.6500e+03 -1.6857e+03 5.9572e+00 --1.6500e+03 -1.6571e+03 5.9102e+00 --1.6500e+03 -1.6286e+03 5.8625e+00 --1.6500e+03 -1.6000e+03 5.8141e+00 --1.6500e+03 -1.5714e+03 5.7651e+00 --1.6500e+03 -1.5429e+03 5.7153e+00 --1.6500e+03 -1.5143e+03 5.6649e+00 --1.6500e+03 -1.4857e+03 5.6138e+00 --1.6500e+03 -1.4571e+03 5.5620e+00 --1.6500e+03 -1.4286e+03 5.5096e+00 --1.6500e+03 -1.4000e+03 5.4566e+00 --1.6500e+03 -1.3714e+03 5.4030e+00 --1.6500e+03 -1.3429e+03 5.3488e+00 --1.6500e+03 -1.3143e+03 5.2940e+00 --1.6500e+03 -1.2857e+03 5.2386e+00 --1.6500e+03 -1.2571e+03 5.1827e+00 --1.6500e+03 -1.2286e+03 5.1263e+00 --1.6500e+03 -1.2000e+03 5.0695e+00 --1.6500e+03 -1.1714e+03 5.0122e+00 --1.6500e+03 -1.1429e+03 4.9546e+00 --1.6500e+03 -1.1143e+03 4.8966e+00 --1.6500e+03 -1.0857e+03 4.8383e+00 --1.6500e+03 -1.0571e+03 4.7797e+00 --1.6500e+03 -1.0286e+03 4.7210e+00 --1.6500e+03 -1.0000e+03 4.6622e+00 --1.6500e+03 -9.7143e+02 4.6032e+00 --1.6500e+03 -9.4286e+02 4.5443e+00 --1.6500e+03 -9.1429e+02 4.4855e+00 --1.6500e+03 -8.8571e+02 4.4268e+00 --1.6500e+03 -8.5714e+02 4.3684e+00 --1.6500e+03 -8.2857e+02 4.3103e+00 --1.6500e+03 -8.0000e+02 4.2527e+00 --1.6500e+03 -7.7143e+02 4.1955e+00 --1.6500e+03 -7.4286e+02 4.1390e+00 --1.6500e+03 -7.1429e+02 4.0832e+00 --1.6500e+03 -6.8571e+02 4.0282e+00 --1.6500e+03 -6.5714e+02 3.9742e+00 --1.6500e+03 -6.2857e+02 3.9212e+00 --1.6500e+03 -6.0000e+02 3.8695e+00 --1.6500e+03 -5.7143e+02 3.8190e+00 --1.6500e+03 -5.4286e+02 3.7699e+00 --1.6500e+03 -5.1429e+02 3.7224e+00 --1.6500e+03 -4.8571e+02 3.6766e+00 --1.6500e+03 -4.5714e+02 3.6326e+00 --1.6500e+03 -4.2857e+02 3.5905e+00 --1.6500e+03 -4.0000e+02 3.5504e+00 --1.6500e+03 -3.7143e+02 3.5125e+00 --1.6500e+03 -3.4286e+02 3.4769e+00 --1.6500e+03 -3.1429e+02 3.4437e+00 --1.6500e+03 -2.8571e+02 3.4130e+00 --1.6500e+03 -2.5714e+02 3.3848e+00 --1.6500e+03 -2.2857e+02 3.3594e+00 --1.6500e+03 -2.0000e+02 3.3367e+00 --1.6500e+03 -1.7143e+02 3.3169e+00 --1.6500e+03 -1.4286e+02 3.3000e+00 --1.6500e+03 -1.1429e+02 3.2861e+00 --1.6500e+03 -8.5714e+01 3.2753e+00 --1.6500e+03 -5.7143e+01 3.2675e+00 --1.6500e+03 -2.8571e+01 3.2628e+00 --1.6500e+03 0.0000e+00 3.2612e+00 --1.6500e+03 2.8571e+01 3.2628e+00 --1.6500e+03 5.7143e+01 3.2675e+00 --1.6500e+03 8.5714e+01 3.2753e+00 --1.6500e+03 1.1429e+02 3.2861e+00 --1.6500e+03 1.4286e+02 3.3000e+00 --1.6500e+03 1.7143e+02 3.3169e+00 --1.6500e+03 2.0000e+02 3.3367e+00 --1.6500e+03 2.2857e+02 3.3594e+00 --1.6500e+03 2.5714e+02 3.3848e+00 --1.6500e+03 2.8571e+02 3.4130e+00 --1.6500e+03 3.1429e+02 3.4437e+00 --1.6500e+03 3.4286e+02 3.4769e+00 --1.6500e+03 3.7143e+02 3.5125e+00 --1.6500e+03 4.0000e+02 3.5504e+00 --1.6500e+03 4.2857e+02 3.5905e+00 --1.6500e+03 4.5714e+02 3.6326e+00 --1.6500e+03 4.8571e+02 3.6766e+00 --1.6500e+03 5.1429e+02 3.7224e+00 --1.6500e+03 5.4286e+02 3.7699e+00 --1.6500e+03 5.7143e+02 3.8190e+00 --1.6500e+03 6.0000e+02 3.8695e+00 --1.6500e+03 6.2857e+02 3.9212e+00 --1.6500e+03 6.5714e+02 3.9742e+00 --1.6500e+03 6.8571e+02 4.0282e+00 --1.6500e+03 7.1429e+02 4.0832e+00 --1.6500e+03 7.4286e+02 4.1390e+00 --1.6500e+03 7.7143e+02 4.1955e+00 --1.6500e+03 8.0000e+02 4.2527e+00 --1.6500e+03 8.2857e+02 4.3103e+00 --1.6500e+03 8.5714e+02 4.3684e+00 --1.6500e+03 8.8571e+02 4.4268e+00 --1.6500e+03 9.1429e+02 4.4855e+00 --1.6500e+03 9.4286e+02 4.5443e+00 --1.6500e+03 9.7143e+02 4.6032e+00 --1.6500e+03 1.0000e+03 4.6622e+00 --1.6500e+03 1.0286e+03 4.7210e+00 --1.6500e+03 1.0571e+03 4.7797e+00 --1.6500e+03 1.0857e+03 4.8383e+00 --1.6500e+03 1.1143e+03 4.8966e+00 --1.6500e+03 1.1429e+03 4.9546e+00 --1.6500e+03 1.1714e+03 5.0122e+00 --1.6500e+03 1.2000e+03 5.0695e+00 --1.6500e+03 1.2286e+03 5.1263e+00 --1.6500e+03 1.2571e+03 5.1827e+00 --1.6500e+03 1.2857e+03 5.2386e+00 --1.6500e+03 1.3143e+03 5.2940e+00 --1.6500e+03 1.3429e+03 5.3488e+00 --1.6500e+03 1.3714e+03 5.4030e+00 --1.6500e+03 1.4000e+03 5.4566e+00 --1.6500e+03 1.4286e+03 5.5096e+00 --1.6500e+03 1.4571e+03 5.5620e+00 --1.6500e+03 1.4857e+03 5.6138e+00 --1.6500e+03 1.5143e+03 5.6649e+00 --1.6500e+03 1.5429e+03 5.7153e+00 --1.6500e+03 1.5714e+03 5.7651e+00 --1.6500e+03 1.6000e+03 5.8141e+00 --1.6500e+03 1.6286e+03 5.8625e+00 --1.6500e+03 1.6571e+03 5.9102e+00 --1.6500e+03 1.6857e+03 5.9572e+00 --1.6500e+03 1.7143e+03 6.0036e+00 --1.6500e+03 1.7429e+03 6.0492e+00 --1.6500e+03 1.7714e+03 6.0942e+00 --1.6500e+03 1.8000e+03 6.1385e+00 --1.6500e+03 1.8286e+03 6.1821e+00 --1.6500e+03 1.8571e+03 6.2250e+00 --1.6500e+03 1.8857e+03 6.2672e+00 --1.6500e+03 1.9143e+03 6.3088e+00 --1.6500e+03 1.9429e+03 6.3498e+00 --1.6500e+03 1.9714e+03 6.3900e+00 --1.6500e+03 2.0000e+03 6.4297e+00 --1.6200e+03 -2.0000e+03 6.3955e+00 --1.6200e+03 -1.9714e+03 6.3548e+00 --1.6200e+03 -1.9429e+03 6.3134e+00 --1.6200e+03 -1.9143e+03 6.2713e+00 --1.6200e+03 -1.8857e+03 6.2285e+00 --1.6200e+03 -1.8571e+03 6.1850e+00 --1.6200e+03 -1.8286e+03 6.1408e+00 --1.6200e+03 -1.8000e+03 6.0959e+00 --1.6200e+03 -1.7714e+03 6.0503e+00 --1.6200e+03 -1.7429e+03 6.0039e+00 --1.6200e+03 -1.7143e+03 5.9568e+00 --1.6200e+03 -1.6857e+03 5.9089e+00 --1.6200e+03 -1.6571e+03 5.8603e+00 --1.6200e+03 -1.6286e+03 5.8110e+00 --1.6200e+03 -1.6000e+03 5.7609e+00 --1.6200e+03 -1.5714e+03 5.7101e+00 --1.6200e+03 -1.5429e+03 5.6586e+00 --1.6200e+03 -1.5143e+03 5.6063e+00 --1.6200e+03 -1.4857e+03 5.5532e+00 --1.6200e+03 -1.4571e+03 5.4995e+00 --1.6200e+03 -1.4286e+03 5.4451e+00 --1.6200e+03 -1.4000e+03 5.3899e+00 --1.6200e+03 -1.3714e+03 5.3341e+00 --1.6200e+03 -1.3429e+03 5.2776e+00 --1.6200e+03 -1.3143e+03 5.2205e+00 --1.6200e+03 -1.2857e+03 5.1627e+00 --1.6200e+03 -1.2571e+03 5.1044e+00 --1.6200e+03 -1.2286e+03 5.0454e+00 --1.6200e+03 -1.2000e+03 4.9860e+00 --1.6200e+03 -1.1714e+03 4.9260e+00 --1.6200e+03 -1.1429e+03 4.8656e+00 --1.6200e+03 -1.1143e+03 4.8048e+00 --1.6200e+03 -1.0857e+03 4.7436e+00 --1.6200e+03 -1.0571e+03 4.6821e+00 --1.6200e+03 -1.0286e+03 4.6204e+00 --1.6200e+03 -1.0000e+03 4.5584e+00 --1.6200e+03 -9.7143e+02 4.4963e+00 --1.6200e+03 -9.4286e+02 4.4342e+00 --1.6200e+03 -9.1429e+02 4.3721e+00 --1.6200e+03 -8.8571e+02 4.3102e+00 --1.6200e+03 -8.5714e+02 4.2484e+00 --1.6200e+03 -8.2857e+02 4.1869e+00 --1.6200e+03 -8.0000e+02 4.1258e+00 --1.6200e+03 -7.7143e+02 4.0652e+00 --1.6200e+03 -7.4286e+02 4.0052e+00 --1.6200e+03 -7.1429e+02 3.9459e+00 --1.6200e+03 -6.8571e+02 3.8874e+00 --1.6200e+03 -6.5714e+02 3.8299e+00 --1.6200e+03 -6.2857e+02 3.7735e+00 --1.6200e+03 -6.0000e+02 3.7183e+00 --1.6200e+03 -5.7143e+02 3.6645e+00 --1.6200e+03 -5.4286e+02 3.6121e+00 --1.6200e+03 -5.1429e+02 3.5613e+00 --1.6200e+03 -4.8571e+02 3.5123e+00 --1.6200e+03 -4.5714e+02 3.4652e+00 --1.6200e+03 -4.2857e+02 3.4201e+00 --1.6200e+03 -4.0000e+02 3.3771e+00 --1.6200e+03 -3.7143e+02 3.3365e+00 --1.6200e+03 -3.4286e+02 3.2982e+00 --1.6200e+03 -3.1429e+02 3.2625e+00 --1.6200e+03 -2.8571e+02 3.2295e+00 --1.6200e+03 -2.5714e+02 3.1992e+00 --1.6200e+03 -2.2857e+02 3.1719e+00 --1.6200e+03 -2.0000e+02 3.1475e+00 --1.6200e+03 -1.7143e+02 3.1261e+00 --1.6200e+03 -1.4286e+02 3.1080e+00 --1.6200e+03 -1.1429e+02 3.0930e+00 --1.6200e+03 -8.5714e+01 3.0813e+00 --1.6200e+03 -5.7143e+01 3.0729e+00 --1.6200e+03 -2.8571e+01 3.0679e+00 --1.6200e+03 0.0000e+00 3.0662e+00 --1.6200e+03 2.8571e+01 3.0679e+00 --1.6200e+03 5.7143e+01 3.0729e+00 --1.6200e+03 8.5714e+01 3.0813e+00 --1.6200e+03 1.1429e+02 3.0930e+00 --1.6200e+03 1.4286e+02 3.1080e+00 --1.6200e+03 1.7143e+02 3.1261e+00 --1.6200e+03 2.0000e+02 3.1475e+00 --1.6200e+03 2.2857e+02 3.1719e+00 --1.6200e+03 2.5714e+02 3.1992e+00 --1.6200e+03 2.8571e+02 3.2295e+00 --1.6200e+03 3.1429e+02 3.2625e+00 --1.6200e+03 3.4286e+02 3.2982e+00 --1.6200e+03 3.7143e+02 3.3365e+00 --1.6200e+03 4.0000e+02 3.3771e+00 --1.6200e+03 4.2857e+02 3.4201e+00 --1.6200e+03 4.5714e+02 3.4652e+00 --1.6200e+03 4.8571e+02 3.5123e+00 --1.6200e+03 5.1429e+02 3.5613e+00 --1.6200e+03 5.4286e+02 3.6121e+00 --1.6200e+03 5.7143e+02 3.6645e+00 --1.6200e+03 6.0000e+02 3.7183e+00 --1.6200e+03 6.2857e+02 3.7735e+00 --1.6200e+03 6.5714e+02 3.8299e+00 --1.6200e+03 6.8571e+02 3.8874e+00 --1.6200e+03 7.1429e+02 3.9459e+00 --1.6200e+03 7.4286e+02 4.0052e+00 --1.6200e+03 7.7143e+02 4.0652e+00 --1.6200e+03 8.0000e+02 4.1258e+00 --1.6200e+03 8.2857e+02 4.1869e+00 --1.6200e+03 8.5714e+02 4.2484e+00 --1.6200e+03 8.8571e+02 4.3102e+00 --1.6200e+03 9.1429e+02 4.3721e+00 --1.6200e+03 9.4286e+02 4.4342e+00 --1.6200e+03 9.7143e+02 4.4963e+00 --1.6200e+03 1.0000e+03 4.5584e+00 --1.6200e+03 1.0286e+03 4.6204e+00 --1.6200e+03 1.0571e+03 4.6821e+00 --1.6200e+03 1.0857e+03 4.7436e+00 --1.6200e+03 1.1143e+03 4.8048e+00 --1.6200e+03 1.1429e+03 4.8656e+00 --1.6200e+03 1.1714e+03 4.9260e+00 --1.6200e+03 1.2000e+03 4.9860e+00 --1.6200e+03 1.2286e+03 5.0454e+00 --1.6200e+03 1.2571e+03 5.1044e+00 --1.6200e+03 1.2857e+03 5.1627e+00 --1.6200e+03 1.3143e+03 5.2205e+00 --1.6200e+03 1.3429e+03 5.2776e+00 --1.6200e+03 1.3714e+03 5.3341e+00 --1.6200e+03 1.4000e+03 5.3899e+00 --1.6200e+03 1.4286e+03 5.4451e+00 --1.6200e+03 1.4571e+03 5.4995e+00 --1.6200e+03 1.4857e+03 5.5532e+00 --1.6200e+03 1.5143e+03 5.6063e+00 --1.6200e+03 1.5429e+03 5.6586e+00 --1.6200e+03 1.5714e+03 5.7101e+00 --1.6200e+03 1.6000e+03 5.7609e+00 --1.6200e+03 1.6286e+03 5.8110e+00 --1.6200e+03 1.6571e+03 5.8603e+00 --1.6200e+03 1.6857e+03 5.9089e+00 --1.6200e+03 1.7143e+03 5.9568e+00 --1.6200e+03 1.7429e+03 6.0039e+00 --1.6200e+03 1.7714e+03 6.0503e+00 --1.6200e+03 1.8000e+03 6.0959e+00 --1.6200e+03 1.8286e+03 6.1408e+00 --1.6200e+03 1.8571e+03 6.1850e+00 --1.6200e+03 1.8857e+03 6.2285e+00 --1.6200e+03 1.9143e+03 6.2713e+00 --1.6200e+03 1.9429e+03 6.3134e+00 --1.6200e+03 1.9714e+03 6.3548e+00 --1.6200e+03 2.0000e+03 6.3955e+00 --1.5900e+03 -2.0000e+03 6.3610e+00 --1.5900e+03 -1.9714e+03 6.3192e+00 --1.5900e+03 -1.9429e+03 6.2767e+00 --1.5900e+03 -1.9143e+03 6.2334e+00 --1.5900e+03 -1.8857e+03 6.1894e+00 --1.5900e+03 -1.8571e+03 6.1447e+00 --1.5900e+03 -1.8286e+03 6.0992e+00 --1.5900e+03 -1.8000e+03 6.0529e+00 --1.5900e+03 -1.7714e+03 6.0058e+00 --1.5900e+03 -1.7429e+03 5.9580e+00 --1.5900e+03 -1.7143e+03 5.9093e+00 --1.5900e+03 -1.6857e+03 5.8599e+00 --1.5900e+03 -1.6571e+03 5.8097e+00 --1.5900e+03 -1.6286e+03 5.7587e+00 --1.5900e+03 -1.6000e+03 5.7069e+00 --1.5900e+03 -1.5714e+03 5.6542e+00 --1.5900e+03 -1.5429e+03 5.6008e+00 --1.5900e+03 -1.5143e+03 5.5466e+00 --1.5900e+03 -1.4857e+03 5.4916e+00 --1.5900e+03 -1.4571e+03 5.4357e+00 --1.5900e+03 -1.4286e+03 5.3791e+00 --1.5900e+03 -1.4000e+03 5.3218e+00 --1.5900e+03 -1.3714e+03 5.2637e+00 --1.5900e+03 -1.3429e+03 5.2048e+00 --1.5900e+03 -1.3143e+03 5.1452e+00 --1.5900e+03 -1.2857e+03 5.0850e+00 --1.5900e+03 -1.2571e+03 5.0240e+00 --1.5900e+03 -1.2286e+03 4.9624e+00 --1.5900e+03 -1.2000e+03 4.9002e+00 --1.5900e+03 -1.1714e+03 4.8374e+00 --1.5900e+03 -1.1429e+03 4.7741e+00 --1.5900e+03 -1.1143e+03 4.7103e+00 --1.5900e+03 -1.0857e+03 4.6460e+00 --1.5900e+03 -1.0571e+03 4.5813e+00 --1.5900e+03 -1.0286e+03 4.5164e+00 --1.5900e+03 -1.0000e+03 4.4511e+00 --1.5900e+03 -9.7143e+02 4.3857e+00 --1.5900e+03 -9.4286e+02 4.3201e+00 --1.5900e+03 -9.1429e+02 4.2546e+00 --1.5900e+03 -8.8571e+02 4.1890e+00 --1.5900e+03 -8.5714e+02 4.1236e+00 --1.5900e+03 -8.2857e+02 4.0585e+00 --1.5900e+03 -8.0000e+02 3.9937e+00 --1.5900e+03 -7.7143e+02 3.9294e+00 --1.5900e+03 -7.4286e+02 3.8656e+00 --1.5900e+03 -7.1429e+02 3.8026e+00 --1.5900e+03 -6.8571e+02 3.7403e+00 --1.5900e+03 -6.5714e+02 3.6791e+00 --1.5900e+03 -6.2857e+02 3.6189e+00 --1.5900e+03 -6.0000e+02 3.5600e+00 --1.5900e+03 -5.7143e+02 3.5024e+00 --1.5900e+03 -5.4286e+02 3.4464e+00 --1.5900e+03 -5.1429e+02 3.3920e+00 --1.5900e+03 -4.8571e+02 3.3395e+00 --1.5900e+03 -4.5714e+02 3.2890e+00 --1.5900e+03 -4.2857e+02 3.2406e+00 --1.5900e+03 -4.0000e+02 3.1945e+00 --1.5900e+03 -3.7143e+02 3.1508e+00 --1.5900e+03 -3.4286e+02 3.1097e+00 --1.5900e+03 -3.1429e+02 3.0713e+00 --1.5900e+03 -2.8571e+02 3.0357e+00 --1.5900e+03 -2.5714e+02 3.0031e+00 --1.5900e+03 -2.2857e+02 2.9736e+00 --1.5900e+03 -2.0000e+02 2.9473e+00 --1.5900e+03 -1.7143e+02 2.9243e+00 --1.5900e+03 -1.4286e+02 2.9047e+00 --1.5900e+03 -1.1429e+02 2.8885e+00 --1.5900e+03 -8.5714e+01 2.8759e+00 --1.5900e+03 -5.7143e+01 2.8668e+00 --1.5900e+03 -2.8571e+01 2.8614e+00 --1.5900e+03 0.0000e+00 2.8596e+00 --1.5900e+03 2.8571e+01 2.8614e+00 --1.5900e+03 5.7143e+01 2.8668e+00 --1.5900e+03 8.5714e+01 2.8759e+00 --1.5900e+03 1.1429e+02 2.8885e+00 --1.5900e+03 1.4286e+02 2.9047e+00 --1.5900e+03 1.7143e+02 2.9243e+00 --1.5900e+03 2.0000e+02 2.9473e+00 --1.5900e+03 2.2857e+02 2.9736e+00 --1.5900e+03 2.5714e+02 3.0031e+00 --1.5900e+03 2.8571e+02 3.0357e+00 --1.5900e+03 3.1429e+02 3.0713e+00 --1.5900e+03 3.4286e+02 3.1097e+00 --1.5900e+03 3.7143e+02 3.1508e+00 --1.5900e+03 4.0000e+02 3.1945e+00 --1.5900e+03 4.2857e+02 3.2406e+00 --1.5900e+03 4.5714e+02 3.2890e+00 --1.5900e+03 4.8571e+02 3.3395e+00 --1.5900e+03 5.1429e+02 3.3920e+00 --1.5900e+03 5.4286e+02 3.4464e+00 --1.5900e+03 5.7143e+02 3.5024e+00 --1.5900e+03 6.0000e+02 3.5600e+00 --1.5900e+03 6.2857e+02 3.6189e+00 --1.5900e+03 6.5714e+02 3.6791e+00 --1.5900e+03 6.8571e+02 3.7403e+00 --1.5900e+03 7.1429e+02 3.8026e+00 --1.5900e+03 7.4286e+02 3.8656e+00 --1.5900e+03 7.7143e+02 3.9294e+00 --1.5900e+03 8.0000e+02 3.9937e+00 --1.5900e+03 8.2857e+02 4.0585e+00 --1.5900e+03 8.5714e+02 4.1236e+00 --1.5900e+03 8.8571e+02 4.1890e+00 --1.5900e+03 9.1429e+02 4.2546e+00 --1.5900e+03 9.4286e+02 4.3201e+00 --1.5900e+03 9.7143e+02 4.3857e+00 --1.5900e+03 1.0000e+03 4.4511e+00 --1.5900e+03 1.0286e+03 4.5164e+00 --1.5900e+03 1.0571e+03 4.5813e+00 --1.5900e+03 1.0857e+03 4.6460e+00 --1.5900e+03 1.1143e+03 4.7103e+00 --1.5900e+03 1.1429e+03 4.7741e+00 --1.5900e+03 1.1714e+03 4.8374e+00 --1.5900e+03 1.2000e+03 4.9002e+00 --1.5900e+03 1.2286e+03 4.9624e+00 --1.5900e+03 1.2571e+03 5.0240e+00 --1.5900e+03 1.2857e+03 5.0850e+00 --1.5900e+03 1.3143e+03 5.1452e+00 --1.5900e+03 1.3429e+03 5.2048e+00 --1.5900e+03 1.3714e+03 5.2637e+00 --1.5900e+03 1.4000e+03 5.3218e+00 --1.5900e+03 1.4286e+03 5.3791e+00 --1.5900e+03 1.4571e+03 5.4357e+00 --1.5900e+03 1.4857e+03 5.4916e+00 --1.5900e+03 1.5143e+03 5.5466e+00 --1.5900e+03 1.5429e+03 5.6008e+00 --1.5900e+03 1.5714e+03 5.6542e+00 --1.5900e+03 1.6000e+03 5.7069e+00 --1.5900e+03 1.6286e+03 5.7587e+00 --1.5900e+03 1.6571e+03 5.8097e+00 --1.5900e+03 1.6857e+03 5.8599e+00 --1.5900e+03 1.7143e+03 5.9093e+00 --1.5900e+03 1.7429e+03 5.9580e+00 --1.5900e+03 1.7714e+03 6.0058e+00 --1.5900e+03 1.8000e+03 6.0529e+00 --1.5900e+03 1.8286e+03 6.0992e+00 --1.5900e+03 1.8571e+03 6.1447e+00 --1.5900e+03 1.8857e+03 6.1894e+00 --1.5900e+03 1.9143e+03 6.2334e+00 --1.5900e+03 1.9429e+03 6.2767e+00 --1.5900e+03 1.9714e+03 6.3192e+00 --1.5900e+03 2.0000e+03 6.3610e+00 --1.5600e+03 -2.0000e+03 6.3263e+00 --1.5600e+03 -1.9714e+03 6.2834e+00 --1.5600e+03 -1.9429e+03 6.2397e+00 --1.5600e+03 -1.9143e+03 6.1952e+00 --1.5600e+03 -1.8857e+03 6.1499e+00 --1.5600e+03 -1.8571e+03 6.1039e+00 --1.5600e+03 -1.8286e+03 6.0570e+00 --1.5600e+03 -1.8000e+03 6.0093e+00 --1.5600e+03 -1.7714e+03 5.9608e+00 --1.5600e+03 -1.7429e+03 5.9115e+00 --1.5600e+03 -1.7143e+03 5.8613e+00 --1.5600e+03 -1.6857e+03 5.8102e+00 --1.5600e+03 -1.6571e+03 5.7583e+00 --1.5600e+03 -1.6286e+03 5.7056e+00 --1.5600e+03 -1.6000e+03 5.6519e+00 --1.5600e+03 -1.5714e+03 5.5974e+00 --1.5600e+03 -1.5429e+03 5.5421e+00 --1.5600e+03 -1.5143e+03 5.4858e+00 --1.5600e+03 -1.4857e+03 5.4287e+00 --1.5600e+03 -1.4571e+03 5.3707e+00 --1.5600e+03 -1.4286e+03 5.3119e+00 --1.5600e+03 -1.4000e+03 5.2522e+00 --1.5600e+03 -1.3714e+03 5.1917e+00 --1.5600e+03 -1.3429e+03 5.1303e+00 --1.5600e+03 -1.3143e+03 5.0682e+00 --1.5600e+03 -1.2857e+03 5.0053e+00 --1.5600e+03 -1.2571e+03 4.9416e+00 --1.5600e+03 -1.2286e+03 4.8772e+00 --1.5600e+03 -1.2000e+03 4.8120e+00 --1.5600e+03 -1.1714e+03 4.7462e+00 --1.5600e+03 -1.1429e+03 4.6798e+00 --1.5600e+03 -1.1143e+03 4.6128e+00 --1.5600e+03 -1.0857e+03 4.5453e+00 --1.5600e+03 -1.0571e+03 4.4773e+00 --1.5600e+03 -1.0286e+03 4.4089e+00 --1.5600e+03 -1.0000e+03 4.3402e+00 --1.5600e+03 -9.7143e+02 4.2711e+00 --1.5600e+03 -9.4286e+02 4.2019e+00 --1.5600e+03 -9.1429e+02 4.1326e+00 --1.5600e+03 -8.8571e+02 4.0632e+00 --1.5600e+03 -8.5714e+02 3.9940e+00 --1.5600e+03 -8.2857e+02 3.9249e+00 --1.5600e+03 -8.0000e+02 3.8561e+00 --1.5600e+03 -7.7143e+02 3.7878e+00 --1.5600e+03 -7.4286e+02 3.7200e+00 --1.5600e+03 -7.1429e+02 3.6528e+00 --1.5600e+03 -6.8571e+02 3.5865e+00 --1.5600e+03 -6.5714e+02 3.5211e+00 --1.5600e+03 -6.2857e+02 3.4569e+00 --1.5600e+03 -6.0000e+02 3.3939e+00 --1.5600e+03 -5.7143e+02 3.3323e+00 --1.5600e+03 -5.4286e+02 3.2723e+00 --1.5600e+03 -5.1429e+02 3.2140e+00 --1.5600e+03 -4.8571e+02 3.1577e+00 --1.5600e+03 -4.5714e+02 3.1034e+00 --1.5600e+03 -4.2857e+02 3.0514e+00 --1.5600e+03 -4.0000e+02 3.0018e+00 --1.5600e+03 -3.7143e+02 2.9548e+00 --1.5600e+03 -3.4286e+02 2.9105e+00 --1.5600e+03 -3.1429e+02 2.8691e+00 --1.5600e+03 -2.8571e+02 2.8307e+00 --1.5600e+03 -2.5714e+02 2.7956e+00 --1.5600e+03 -2.2857e+02 2.7637e+00 --1.5600e+03 -2.0000e+02 2.7353e+00 --1.5600e+03 -1.7143e+02 2.7104e+00 --1.5600e+03 -1.4286e+02 2.6892e+00 --1.5600e+03 -1.1429e+02 2.6718e+00 --1.5600e+03 -8.5714e+01 2.6581e+00 --1.5600e+03 -5.7143e+01 2.6483e+00 --1.5600e+03 -2.8571e+01 2.6424e+00 --1.5600e+03 0.0000e+00 2.6404e+00 --1.5600e+03 2.8571e+01 2.6424e+00 --1.5600e+03 5.7143e+01 2.6483e+00 --1.5600e+03 8.5714e+01 2.6581e+00 --1.5600e+03 1.1429e+02 2.6718e+00 --1.5600e+03 1.4286e+02 2.6892e+00 --1.5600e+03 1.7143e+02 2.7104e+00 --1.5600e+03 2.0000e+02 2.7353e+00 --1.5600e+03 2.2857e+02 2.7637e+00 --1.5600e+03 2.5714e+02 2.7956e+00 --1.5600e+03 2.8571e+02 2.8307e+00 --1.5600e+03 3.1429e+02 2.8691e+00 --1.5600e+03 3.4286e+02 2.9105e+00 --1.5600e+03 3.7143e+02 2.9548e+00 --1.5600e+03 4.0000e+02 3.0018e+00 --1.5600e+03 4.2857e+02 3.0514e+00 --1.5600e+03 4.5714e+02 3.1034e+00 --1.5600e+03 4.8571e+02 3.1577e+00 --1.5600e+03 5.1429e+02 3.2140e+00 --1.5600e+03 5.4286e+02 3.2723e+00 --1.5600e+03 5.7143e+02 3.3323e+00 --1.5600e+03 6.0000e+02 3.3939e+00 --1.5600e+03 6.2857e+02 3.4569e+00 --1.5600e+03 6.5714e+02 3.5211e+00 --1.5600e+03 6.8571e+02 3.5865e+00 --1.5600e+03 7.1429e+02 3.6528e+00 --1.5600e+03 7.4286e+02 3.7200e+00 --1.5600e+03 7.7143e+02 3.7878e+00 --1.5600e+03 8.0000e+02 3.8561e+00 --1.5600e+03 8.2857e+02 3.9249e+00 --1.5600e+03 8.5714e+02 3.9940e+00 --1.5600e+03 8.8571e+02 4.0632e+00 --1.5600e+03 9.1429e+02 4.1326e+00 --1.5600e+03 9.4286e+02 4.2019e+00 --1.5600e+03 9.7143e+02 4.2711e+00 --1.5600e+03 1.0000e+03 4.3402e+00 --1.5600e+03 1.0286e+03 4.4089e+00 --1.5600e+03 1.0571e+03 4.4773e+00 --1.5600e+03 1.0857e+03 4.5453e+00 --1.5600e+03 1.1143e+03 4.6128e+00 --1.5600e+03 1.1429e+03 4.6798e+00 --1.5600e+03 1.1714e+03 4.7462e+00 --1.5600e+03 1.2000e+03 4.8120e+00 --1.5600e+03 1.2286e+03 4.8772e+00 --1.5600e+03 1.2571e+03 4.9416e+00 --1.5600e+03 1.2857e+03 5.0053e+00 --1.5600e+03 1.3143e+03 5.0682e+00 --1.5600e+03 1.3429e+03 5.1303e+00 --1.5600e+03 1.3714e+03 5.1917e+00 --1.5600e+03 1.4000e+03 5.2522e+00 --1.5600e+03 1.4286e+03 5.3119e+00 --1.5600e+03 1.4571e+03 5.3707e+00 --1.5600e+03 1.4857e+03 5.4287e+00 --1.5600e+03 1.5143e+03 5.4858e+00 --1.5600e+03 1.5429e+03 5.5421e+00 --1.5600e+03 1.5714e+03 5.5974e+00 --1.5600e+03 1.6000e+03 5.6519e+00 --1.5600e+03 1.6286e+03 5.7056e+00 --1.5600e+03 1.6571e+03 5.7583e+00 --1.5600e+03 1.6857e+03 5.8102e+00 --1.5600e+03 1.7143e+03 5.8613e+00 --1.5600e+03 1.7429e+03 5.9115e+00 --1.5600e+03 1.7714e+03 5.9608e+00 --1.5600e+03 1.8000e+03 6.0093e+00 --1.5600e+03 1.8286e+03 6.0570e+00 --1.5600e+03 1.8571e+03 6.1039e+00 --1.5600e+03 1.8857e+03 6.1499e+00 --1.5600e+03 1.9143e+03 6.1952e+00 --1.5600e+03 1.9429e+03 6.2397e+00 --1.5600e+03 1.9714e+03 6.2834e+00 --1.5600e+03 2.0000e+03 6.3263e+00 --1.5300e+03 -2.0000e+03 6.2913e+00 --1.5300e+03 -1.9714e+03 6.2472e+00 --1.5300e+03 -1.9429e+03 6.2024e+00 --1.5300e+03 -1.9143e+03 6.1567e+00 --1.5300e+03 -1.8857e+03 6.1101e+00 --1.5300e+03 -1.8571e+03 6.0627e+00 --1.5300e+03 -1.8286e+03 6.0145e+00 --1.5300e+03 -1.8000e+03 5.9653e+00 --1.5300e+03 -1.7714e+03 5.9153e+00 --1.5300e+03 -1.7429e+03 5.8644e+00 --1.5300e+03 -1.7143e+03 5.8126e+00 --1.5300e+03 -1.6857e+03 5.7599e+00 --1.5300e+03 -1.6571e+03 5.7062e+00 --1.5300e+03 -1.6286e+03 5.6517e+00 --1.5300e+03 -1.6000e+03 5.5962e+00 --1.5300e+03 -1.5714e+03 5.5397e+00 --1.5300e+03 -1.5429e+03 5.4823e+00 --1.5300e+03 -1.5143e+03 5.4240e+00 --1.5300e+03 -1.4857e+03 5.3647e+00 --1.5300e+03 -1.4571e+03 5.3044e+00 --1.5300e+03 -1.4286e+03 5.2432e+00 --1.5300e+03 -1.4000e+03 5.1811e+00 --1.5300e+03 -1.3714e+03 5.1181e+00 --1.5300e+03 -1.3429e+03 5.0542e+00 --1.5300e+03 -1.3143e+03 4.9893e+00 --1.5300e+03 -1.2857e+03 4.9236e+00 --1.5300e+03 -1.2571e+03 4.8570e+00 --1.5300e+03 -1.2286e+03 4.7896e+00 --1.5300e+03 -1.2000e+03 4.7215e+00 --1.5300e+03 -1.1714e+03 4.6525e+00 --1.5300e+03 -1.1429e+03 4.5828e+00 --1.5300e+03 -1.1143e+03 4.5125e+00 --1.5300e+03 -1.0857e+03 4.4415e+00 --1.5300e+03 -1.0571e+03 4.3699e+00 --1.5300e+03 -1.0286e+03 4.2979e+00 --1.5300e+03 -1.0000e+03 4.2254e+00 --1.5300e+03 -9.7143e+02 4.1525e+00 --1.5300e+03 -9.4286e+02 4.0793e+00 --1.5300e+03 -9.1429e+02 4.0060e+00 --1.5300e+03 -8.8571e+02 3.9326e+00 --1.5300e+03 -8.5714e+02 3.8591e+00 --1.5300e+03 -8.2857e+02 3.7858e+00 --1.5300e+03 -8.0000e+02 3.7127e+00 --1.5300e+03 -7.7143e+02 3.6400e+00 --1.5300e+03 -7.4286e+02 3.5678e+00 --1.5300e+03 -7.1429e+02 3.4963e+00 --1.5300e+03 -6.8571e+02 3.4255e+00 --1.5300e+03 -6.5714e+02 3.3557e+00 --1.5300e+03 -6.2857e+02 3.2870e+00 --1.5300e+03 -6.0000e+02 3.2195e+00 --1.5300e+03 -5.7143e+02 3.1535e+00 --1.5300e+03 -5.4286e+02 3.0892e+00 --1.5300e+03 -5.1429e+02 3.0266e+00 --1.5300e+03 -4.8571e+02 2.9661e+00 --1.5300e+03 -4.5714e+02 2.9077e+00 --1.5300e+03 -4.2857e+02 2.8517e+00 --1.5300e+03 -4.0000e+02 2.7983e+00 --1.5300e+03 -3.7143e+02 2.7475e+00 --1.5300e+03 -3.4286e+02 2.6997e+00 --1.5300e+03 -3.1429e+02 2.6550e+00 --1.5300e+03 -2.8571e+02 2.6136e+00 --1.5300e+03 -2.5714e+02 2.5756e+00 --1.5300e+03 -2.2857e+02 2.5411e+00 --1.5300e+03 -2.0000e+02 2.5103e+00 --1.5300e+03 -1.7143e+02 2.4834e+00 --1.5300e+03 -1.4286e+02 2.4604e+00 --1.5300e+03 -1.1429e+02 2.4415e+00 --1.5300e+03 -8.5714e+01 2.4267e+00 --1.5300e+03 -5.7143e+01 2.4160e+00 --1.5300e+03 -2.8571e+01 2.4096e+00 --1.5300e+03 0.0000e+00 2.4075e+00 --1.5300e+03 2.8571e+01 2.4096e+00 --1.5300e+03 5.7143e+01 2.4160e+00 --1.5300e+03 8.5714e+01 2.4267e+00 --1.5300e+03 1.1429e+02 2.4415e+00 --1.5300e+03 1.4286e+02 2.4604e+00 --1.5300e+03 1.7143e+02 2.4834e+00 --1.5300e+03 2.0000e+02 2.5103e+00 --1.5300e+03 2.2857e+02 2.5411e+00 --1.5300e+03 2.5714e+02 2.5756e+00 --1.5300e+03 2.8571e+02 2.6136e+00 --1.5300e+03 3.1429e+02 2.6550e+00 --1.5300e+03 3.4286e+02 2.6997e+00 --1.5300e+03 3.7143e+02 2.7475e+00 --1.5300e+03 4.0000e+02 2.7983e+00 --1.5300e+03 4.2857e+02 2.8517e+00 --1.5300e+03 4.5714e+02 2.9077e+00 --1.5300e+03 4.8571e+02 2.9661e+00 --1.5300e+03 5.1429e+02 3.0266e+00 --1.5300e+03 5.4286e+02 3.0892e+00 --1.5300e+03 5.7143e+02 3.1535e+00 --1.5300e+03 6.0000e+02 3.2195e+00 --1.5300e+03 6.2857e+02 3.2870e+00 --1.5300e+03 6.5714e+02 3.3557e+00 --1.5300e+03 6.8571e+02 3.4255e+00 --1.5300e+03 7.1429e+02 3.4963e+00 --1.5300e+03 7.4286e+02 3.5678e+00 --1.5300e+03 7.7143e+02 3.6400e+00 --1.5300e+03 8.0000e+02 3.7127e+00 --1.5300e+03 8.2857e+02 3.7858e+00 --1.5300e+03 8.5714e+02 3.8591e+00 --1.5300e+03 8.8571e+02 3.9326e+00 --1.5300e+03 9.1429e+02 4.0060e+00 --1.5300e+03 9.4286e+02 4.0793e+00 --1.5300e+03 9.7143e+02 4.1525e+00 --1.5300e+03 1.0000e+03 4.2254e+00 --1.5300e+03 1.0286e+03 4.2979e+00 --1.5300e+03 1.0571e+03 4.3699e+00 --1.5300e+03 1.0857e+03 4.4415e+00 --1.5300e+03 1.1143e+03 4.5125e+00 --1.5300e+03 1.1429e+03 4.5828e+00 --1.5300e+03 1.1714e+03 4.6525e+00 --1.5300e+03 1.2000e+03 4.7215e+00 --1.5300e+03 1.2286e+03 4.7896e+00 --1.5300e+03 1.2571e+03 4.8570e+00 --1.5300e+03 1.2857e+03 4.9236e+00 --1.5300e+03 1.3143e+03 4.9893e+00 --1.5300e+03 1.3429e+03 5.0542e+00 --1.5300e+03 1.3714e+03 5.1181e+00 --1.5300e+03 1.4000e+03 5.1811e+00 --1.5300e+03 1.4286e+03 5.2432e+00 --1.5300e+03 1.4571e+03 5.3044e+00 --1.5300e+03 1.4857e+03 5.3647e+00 --1.5300e+03 1.5143e+03 5.4240e+00 --1.5300e+03 1.5429e+03 5.4823e+00 --1.5300e+03 1.5714e+03 5.5397e+00 --1.5300e+03 1.6000e+03 5.5962e+00 --1.5300e+03 1.6286e+03 5.6517e+00 --1.5300e+03 1.6571e+03 5.7062e+00 --1.5300e+03 1.6857e+03 5.7599e+00 --1.5300e+03 1.7143e+03 5.8126e+00 --1.5300e+03 1.7429e+03 5.8644e+00 --1.5300e+03 1.7714e+03 5.9153e+00 --1.5300e+03 1.8000e+03 5.9653e+00 --1.5300e+03 1.8286e+03 6.0145e+00 --1.5300e+03 1.8571e+03 6.0627e+00 --1.5300e+03 1.8857e+03 6.1101e+00 --1.5300e+03 1.9143e+03 6.1567e+00 --1.5300e+03 1.9429e+03 6.2024e+00 --1.5300e+03 1.9714e+03 6.2472e+00 --1.5300e+03 2.0000e+03 6.2913e+00 --1.5000e+03 -2.0000e+03 6.2561e+00 --1.5000e+03 -1.9714e+03 6.2109e+00 --1.5000e+03 -1.9429e+03 6.1648e+00 --1.5000e+03 -1.9143e+03 6.1178e+00 --1.5000e+03 -1.8857e+03 6.0699e+00 --1.5000e+03 -1.8571e+03 6.0212e+00 --1.5000e+03 -1.8286e+03 5.9715e+00 --1.5000e+03 -1.8000e+03 5.9209e+00 --1.5000e+03 -1.7714e+03 5.8693e+00 --1.5000e+03 -1.7429e+03 5.8168e+00 --1.5000e+03 -1.7143e+03 5.7633e+00 --1.5000e+03 -1.6857e+03 5.7089e+00 --1.5000e+03 -1.6571e+03 5.6534e+00 --1.5000e+03 -1.6286e+03 5.5970e+00 --1.5000e+03 -1.6000e+03 5.5395e+00 --1.5000e+03 -1.5714e+03 5.4810e+00 --1.5000e+03 -1.5429e+03 5.4215e+00 --1.5000e+03 -1.5143e+03 5.3610e+00 --1.5000e+03 -1.4857e+03 5.2994e+00 --1.5000e+03 -1.4571e+03 5.2369e+00 --1.5000e+03 -1.4286e+03 5.1732e+00 --1.5000e+03 -1.4000e+03 5.1086e+00 --1.5000e+03 -1.3714e+03 5.0429e+00 --1.5000e+03 -1.3429e+03 4.9763e+00 --1.5000e+03 -1.3143e+03 4.9086e+00 --1.5000e+03 -1.2857e+03 4.8400e+00 --1.5000e+03 -1.2571e+03 4.7704e+00 --1.5000e+03 -1.2286e+03 4.6998e+00 --1.5000e+03 -1.2000e+03 4.6284e+00 --1.5000e+03 -1.1714e+03 4.5561e+00 --1.5000e+03 -1.1429e+03 4.4829e+00 --1.5000e+03 -1.1143e+03 4.4090e+00 --1.5000e+03 -1.0857e+03 4.3343e+00 --1.5000e+03 -1.0571e+03 4.2590e+00 --1.5000e+03 -1.0286e+03 4.1830e+00 --1.5000e+03 -1.0000e+03 4.1065e+00 --1.5000e+03 -9.7143e+02 4.0296e+00 --1.5000e+03 -9.4286e+02 3.9522e+00 --1.5000e+03 -9.1429e+02 3.8745e+00 --1.5000e+03 -8.8571e+02 3.7967e+00 --1.5000e+03 -8.5714e+02 3.7188e+00 --1.5000e+03 -8.2857e+02 3.6409e+00 --1.5000e+03 -8.0000e+02 3.5632e+00 --1.5000e+03 -7.7143e+02 3.4858e+00 --1.5000e+03 -7.4286e+02 3.4088e+00 --1.5000e+03 -7.1429e+02 3.3324e+00 --1.5000e+03 -6.8571e+02 3.2568e+00 --1.5000e+03 -6.5714e+02 3.1821e+00 --1.5000e+03 -6.2857e+02 3.1086e+00 --1.5000e+03 -6.0000e+02 3.0363e+00 --1.5000e+03 -5.7143e+02 2.9655e+00 --1.5000e+03 -5.4286e+02 2.8963e+00 --1.5000e+03 -5.1429e+02 2.8291e+00 --1.5000e+03 -4.8571e+02 2.7639e+00 --1.5000e+03 -4.5714e+02 2.7010e+00 --1.5000e+03 -4.2857e+02 2.6406e+00 --1.5000e+03 -4.0000e+02 2.5829e+00 --1.5000e+03 -3.7143e+02 2.5281e+00 --1.5000e+03 -3.4286e+02 2.4764e+00 --1.5000e+03 -3.1429e+02 2.4280e+00 --1.5000e+03 -2.8571e+02 2.3832e+00 --1.5000e+03 -2.5714e+02 2.3419e+00 --1.5000e+03 -2.2857e+02 2.3046e+00 --1.5000e+03 -2.0000e+02 2.2712e+00 --1.5000e+03 -1.7143e+02 2.2420e+00 --1.5000e+03 -1.4286e+02 2.2170e+00 --1.5000e+03 -1.1429e+02 2.1965e+00 --1.5000e+03 -8.5714e+01 2.1804e+00 --1.5000e+03 -5.7143e+01 2.1688e+00 --1.5000e+03 -2.8571e+01 2.1619e+00 --1.5000e+03 0.0000e+00 2.1595e+00 --1.5000e+03 2.8571e+01 2.1619e+00 --1.5000e+03 5.7143e+01 2.1688e+00 --1.5000e+03 8.5714e+01 2.1804e+00 --1.5000e+03 1.1429e+02 2.1965e+00 --1.5000e+03 1.4286e+02 2.2170e+00 --1.5000e+03 1.7143e+02 2.2420e+00 --1.5000e+03 2.0000e+02 2.2712e+00 --1.5000e+03 2.2857e+02 2.3046e+00 --1.5000e+03 2.5714e+02 2.3419e+00 --1.5000e+03 2.8571e+02 2.3832e+00 --1.5000e+03 3.1429e+02 2.4280e+00 --1.5000e+03 3.4286e+02 2.4764e+00 --1.5000e+03 3.7143e+02 2.5281e+00 --1.5000e+03 4.0000e+02 2.5829e+00 --1.5000e+03 4.2857e+02 2.6406e+00 --1.5000e+03 4.5714e+02 2.7010e+00 --1.5000e+03 4.8571e+02 2.7639e+00 --1.5000e+03 5.1429e+02 2.8291e+00 --1.5000e+03 5.4286e+02 2.8963e+00 --1.5000e+03 5.7143e+02 2.9655e+00 --1.5000e+03 6.0000e+02 3.0363e+00 --1.5000e+03 6.2857e+02 3.1086e+00 --1.5000e+03 6.5714e+02 3.1821e+00 --1.5000e+03 6.8571e+02 3.2568e+00 --1.5000e+03 7.1429e+02 3.3324e+00 --1.5000e+03 7.4286e+02 3.4088e+00 --1.5000e+03 7.7143e+02 3.4858e+00 --1.5000e+03 8.0000e+02 3.5632e+00 --1.5000e+03 8.2857e+02 3.6409e+00 --1.5000e+03 8.5714e+02 3.7188e+00 --1.5000e+03 8.8571e+02 3.7967e+00 --1.5000e+03 9.1429e+02 3.8745e+00 --1.5000e+03 9.4286e+02 3.9522e+00 --1.5000e+03 9.7143e+02 4.0296e+00 --1.5000e+03 1.0000e+03 4.1065e+00 --1.5000e+03 1.0286e+03 4.1830e+00 --1.5000e+03 1.0571e+03 4.2590e+00 --1.5000e+03 1.0857e+03 4.3343e+00 --1.5000e+03 1.1143e+03 4.4090e+00 --1.5000e+03 1.1429e+03 4.4829e+00 --1.5000e+03 1.1714e+03 4.5561e+00 --1.5000e+03 1.2000e+03 4.6284e+00 --1.5000e+03 1.2286e+03 4.6998e+00 --1.5000e+03 1.2571e+03 4.7704e+00 --1.5000e+03 1.2857e+03 4.8400e+00 --1.5000e+03 1.3143e+03 4.9086e+00 --1.5000e+03 1.3429e+03 4.9763e+00 --1.5000e+03 1.3714e+03 5.0429e+00 --1.5000e+03 1.4000e+03 5.1086e+00 --1.5000e+03 1.4286e+03 5.1732e+00 --1.5000e+03 1.4571e+03 5.2369e+00 --1.5000e+03 1.4857e+03 5.2994e+00 --1.5000e+03 1.5143e+03 5.3610e+00 --1.5000e+03 1.5429e+03 5.4215e+00 --1.5000e+03 1.5714e+03 5.4810e+00 --1.5000e+03 1.6000e+03 5.5395e+00 --1.5000e+03 1.6286e+03 5.5970e+00 --1.5000e+03 1.6571e+03 5.6534e+00 --1.5000e+03 1.6857e+03 5.7089e+00 --1.5000e+03 1.7143e+03 5.7633e+00 --1.5000e+03 1.7429e+03 5.8168e+00 --1.5000e+03 1.7714e+03 5.8693e+00 --1.5000e+03 1.8000e+03 5.9209e+00 --1.5000e+03 1.8286e+03 5.9715e+00 --1.5000e+03 1.8571e+03 6.0212e+00 --1.5000e+03 1.8857e+03 6.0699e+00 --1.5000e+03 1.9143e+03 6.1178e+00 --1.5000e+03 1.9429e+03 6.1648e+00 --1.5000e+03 1.9714e+03 6.2109e+00 --1.5000e+03 2.0000e+03 6.2561e+00 --1.4700e+03 -2.0000e+03 6.2207e+00 --1.4700e+03 -1.9714e+03 6.1743e+00 --1.4700e+03 -1.9429e+03 6.1269e+00 --1.4700e+03 -1.9143e+03 6.0786e+00 --1.4700e+03 -1.8857e+03 6.0294e+00 --1.4700e+03 -1.8571e+03 5.9792e+00 --1.4700e+03 -1.8286e+03 5.9281e+00 --1.4700e+03 -1.8000e+03 5.8760e+00 --1.4700e+03 -1.7714e+03 5.8228e+00 --1.4700e+03 -1.7429e+03 5.7687e+00 --1.4700e+03 -1.7143e+03 5.7135e+00 --1.4700e+03 -1.6857e+03 5.6572e+00 --1.4700e+03 -1.6571e+03 5.5999e+00 --1.4700e+03 -1.6286e+03 5.5415e+00 --1.4700e+03 -1.6000e+03 5.4820e+00 --1.4700e+03 -1.5714e+03 5.4215e+00 --1.4700e+03 -1.5429e+03 5.3598e+00 --1.4700e+03 -1.5143e+03 5.2970e+00 --1.4700e+03 -1.4857e+03 5.2330e+00 --1.4700e+03 -1.4571e+03 5.1680e+00 --1.4700e+03 -1.4286e+03 5.1018e+00 --1.4700e+03 -1.4000e+03 5.0345e+00 --1.4700e+03 -1.3714e+03 4.9661e+00 --1.4700e+03 -1.3429e+03 4.8966e+00 --1.4700e+03 -1.3143e+03 4.8260e+00 --1.4700e+03 -1.2857e+03 4.7542e+00 --1.4700e+03 -1.2571e+03 4.6814e+00 --1.4700e+03 -1.2286e+03 4.6076e+00 --1.4700e+03 -1.2000e+03 4.5327e+00 --1.4700e+03 -1.1714e+03 4.4569e+00 --1.4700e+03 -1.1429e+03 4.3801e+00 --1.4700e+03 -1.1143e+03 4.3024e+00 --1.4700e+03 -1.0857e+03 4.2238e+00 --1.4700e+03 -1.0571e+03 4.1444e+00 --1.4700e+03 -1.0286e+03 4.0643e+00 --1.4700e+03 -1.0000e+03 3.9835e+00 --1.4700e+03 -9.7143e+02 3.9021e+00 --1.4700e+03 -9.4286e+02 3.8203e+00 --1.4700e+03 -9.1429e+02 3.7380e+00 --1.4700e+03 -8.8571e+02 3.6554e+00 --1.4700e+03 -8.5714e+02 3.5727e+00 --1.4700e+03 -8.2857e+02 3.4899e+00 --1.4700e+03 -8.0000e+02 3.4071e+00 --1.4700e+03 -7.7143e+02 3.3246e+00 --1.4700e+03 -7.4286e+02 3.2425e+00 --1.4700e+03 -7.1429e+02 3.1609e+00 --1.4700e+03 -6.8571e+02 3.0800e+00 --1.4700e+03 -6.5714e+02 3.0000e+00 --1.4700e+03 -6.2857e+02 2.9211e+00 --1.4700e+03 -6.0000e+02 2.8435e+00 --1.4700e+03 -5.7143e+02 2.7674e+00 --1.4700e+03 -5.4286e+02 2.6930e+00 --1.4700e+03 -5.1429e+02 2.6205e+00 --1.4700e+03 -4.8571e+02 2.5503e+00 --1.4700e+03 -4.5714e+02 2.4824e+00 --1.4700e+03 -4.2857e+02 2.4171e+00 --1.4700e+03 -4.0000e+02 2.3547e+00 --1.4700e+03 -3.7143e+02 2.2954e+00 --1.4700e+03 -3.4286e+02 2.2394e+00 --1.4700e+03 -3.1429e+02 2.1869e+00 --1.4700e+03 -2.8571e+02 2.1382e+00 --1.4700e+03 -2.5714e+02 2.0935e+00 --1.4700e+03 -2.2857e+02 2.0529e+00 --1.4700e+03 -2.0000e+02 2.0166e+00 --1.4700e+03 -1.7143e+02 1.9848e+00 --1.4700e+03 -1.4286e+02 1.9576e+00 --1.4700e+03 -1.1429e+02 1.9352e+00 --1.4700e+03 -8.5714e+01 1.9177e+00 --1.4700e+03 -5.7143e+01 1.9051e+00 --1.4700e+03 -2.8571e+01 1.8975e+00 --1.4700e+03 0.0000e+00 1.8950e+00 --1.4700e+03 2.8571e+01 1.8975e+00 --1.4700e+03 5.7143e+01 1.9051e+00 --1.4700e+03 8.5714e+01 1.9177e+00 --1.4700e+03 1.1429e+02 1.9352e+00 --1.4700e+03 1.4286e+02 1.9576e+00 --1.4700e+03 1.7143e+02 1.9848e+00 --1.4700e+03 2.0000e+02 2.0166e+00 --1.4700e+03 2.2857e+02 2.0529e+00 --1.4700e+03 2.5714e+02 2.0935e+00 --1.4700e+03 2.8571e+02 2.1382e+00 --1.4700e+03 3.1429e+02 2.1869e+00 --1.4700e+03 3.4286e+02 2.2394e+00 --1.4700e+03 3.7143e+02 2.2954e+00 --1.4700e+03 4.0000e+02 2.3547e+00 --1.4700e+03 4.2857e+02 2.4171e+00 --1.4700e+03 4.5714e+02 2.4824e+00 --1.4700e+03 4.8571e+02 2.5503e+00 --1.4700e+03 5.1429e+02 2.6205e+00 --1.4700e+03 5.4286e+02 2.6930e+00 --1.4700e+03 5.7143e+02 2.7674e+00 --1.4700e+03 6.0000e+02 2.8435e+00 --1.4700e+03 6.2857e+02 2.9211e+00 --1.4700e+03 6.5714e+02 3.0000e+00 --1.4700e+03 6.8571e+02 3.0800e+00 --1.4700e+03 7.1429e+02 3.1609e+00 --1.4700e+03 7.4286e+02 3.2425e+00 --1.4700e+03 7.7143e+02 3.3246e+00 --1.4700e+03 8.0000e+02 3.4071e+00 --1.4700e+03 8.2857e+02 3.4899e+00 --1.4700e+03 8.5714e+02 3.5727e+00 --1.4700e+03 8.8571e+02 3.6554e+00 --1.4700e+03 9.1429e+02 3.7380e+00 --1.4700e+03 9.4286e+02 3.8203e+00 --1.4700e+03 9.7143e+02 3.9021e+00 --1.4700e+03 1.0000e+03 3.9835e+00 --1.4700e+03 1.0286e+03 4.0643e+00 --1.4700e+03 1.0571e+03 4.1444e+00 --1.4700e+03 1.0857e+03 4.2238e+00 --1.4700e+03 1.1143e+03 4.3024e+00 --1.4700e+03 1.1429e+03 4.3801e+00 --1.4700e+03 1.1714e+03 4.4569e+00 --1.4700e+03 1.2000e+03 4.5327e+00 --1.4700e+03 1.2286e+03 4.6076e+00 --1.4700e+03 1.2571e+03 4.6814e+00 --1.4700e+03 1.2857e+03 4.7542e+00 --1.4700e+03 1.3143e+03 4.8260e+00 --1.4700e+03 1.3429e+03 4.8966e+00 --1.4700e+03 1.3714e+03 4.9661e+00 --1.4700e+03 1.4000e+03 5.0345e+00 --1.4700e+03 1.4286e+03 5.1018e+00 --1.4700e+03 1.4571e+03 5.1680e+00 --1.4700e+03 1.4857e+03 5.2330e+00 --1.4700e+03 1.5143e+03 5.2970e+00 --1.4700e+03 1.5429e+03 5.3598e+00 --1.4700e+03 1.5714e+03 5.4215e+00 --1.4700e+03 1.6000e+03 5.4820e+00 --1.4700e+03 1.6286e+03 5.5415e+00 --1.4700e+03 1.6571e+03 5.5999e+00 --1.4700e+03 1.6857e+03 5.6572e+00 --1.4700e+03 1.7143e+03 5.7135e+00 --1.4700e+03 1.7429e+03 5.7687e+00 --1.4700e+03 1.7714e+03 5.8228e+00 --1.4700e+03 1.8000e+03 5.8760e+00 --1.4700e+03 1.8286e+03 5.9281e+00 --1.4700e+03 1.8571e+03 5.9792e+00 --1.4700e+03 1.8857e+03 6.0294e+00 --1.4700e+03 1.9143e+03 6.0786e+00 --1.4700e+03 1.9429e+03 6.1269e+00 --1.4700e+03 1.9714e+03 6.1743e+00 --1.4700e+03 2.0000e+03 6.2207e+00 --1.4400e+03 -2.0000e+03 6.1851e+00 --1.4400e+03 -1.9714e+03 6.1374e+00 --1.4400e+03 -1.9429e+03 6.0888e+00 --1.4400e+03 -1.9143e+03 6.0392e+00 --1.4400e+03 -1.8857e+03 5.9886e+00 --1.4400e+03 -1.8571e+03 5.9370e+00 --1.4400e+03 -1.8286e+03 5.8843e+00 --1.4400e+03 -1.8000e+03 5.8306e+00 --1.4400e+03 -1.7714e+03 5.7758e+00 --1.4400e+03 -1.7429e+03 5.7200e+00 --1.4400e+03 -1.7143e+03 5.6630e+00 --1.4400e+03 -1.6857e+03 5.6049e+00 --1.4400e+03 -1.6571e+03 5.5457e+00 --1.4400e+03 -1.6286e+03 5.4853e+00 --1.4400e+03 -1.6000e+03 5.4237e+00 --1.4400e+03 -1.5714e+03 5.3610e+00 --1.4400e+03 -1.5429e+03 5.2970e+00 --1.4400e+03 -1.5143e+03 5.2318e+00 --1.4400e+03 -1.4857e+03 5.1655e+00 --1.4400e+03 -1.4571e+03 5.0979e+00 --1.4400e+03 -1.4286e+03 5.0290e+00 --1.4400e+03 -1.4000e+03 4.9590e+00 --1.4400e+03 -1.3714e+03 4.8877e+00 --1.4400e+03 -1.3429e+03 4.8151e+00 --1.4400e+03 -1.3143e+03 4.7414e+00 --1.4400e+03 -1.2857e+03 4.6664e+00 --1.4400e+03 -1.2571e+03 4.5903e+00 --1.4400e+03 -1.2286e+03 4.5130e+00 --1.4400e+03 -1.2000e+03 4.4345e+00 --1.4400e+03 -1.1714e+03 4.3549e+00 --1.4400e+03 -1.1429e+03 4.2742e+00 --1.4400e+03 -1.1143e+03 4.1924e+00 --1.4400e+03 -1.0857e+03 4.1097e+00 --1.4400e+03 -1.0571e+03 4.0260e+00 --1.4400e+03 -1.0286e+03 3.9415e+00 --1.4400e+03 -1.0000e+03 3.8561e+00 --1.4400e+03 -9.7143e+02 3.7701e+00 --1.4400e+03 -9.4286e+02 3.6833e+00 --1.4400e+03 -9.1429e+02 3.5961e+00 --1.4400e+03 -8.8571e+02 3.5084e+00 --1.4400e+03 -8.5714e+02 3.4205e+00 --1.4400e+03 -8.2857e+02 3.3323e+00 --1.4400e+03 -8.0000e+02 3.2441e+00 --1.4400e+03 -7.7143e+02 3.1561e+00 --1.4400e+03 -7.4286e+02 3.0683e+00 --1.4400e+03 -7.1429e+02 2.9810e+00 --1.4400e+03 -6.8571e+02 2.8944e+00 --1.4400e+03 -6.5714e+02 2.8086e+00 --1.4400e+03 -6.2857e+02 2.7239e+00 --1.4400e+03 -6.0000e+02 2.6404e+00 --1.4400e+03 -5.7143e+02 2.5585e+00 --1.4400e+03 -5.4286e+02 2.4783e+00 --1.4400e+03 -5.1429e+02 2.4001e+00 --1.4400e+03 -4.8571e+02 2.3242e+00 --1.4400e+03 -4.5714e+02 2.2508e+00 --1.4400e+03 -4.2857e+02 2.1802e+00 --1.4400e+03 -4.0000e+02 2.1125e+00 --1.4400e+03 -3.7143e+02 2.0482e+00 --1.4400e+03 -3.4286e+02 1.9874e+00 --1.4400e+03 -3.1429e+02 1.9304e+00 --1.4400e+03 -2.8571e+02 1.8774e+00 --1.4400e+03 -2.5714e+02 1.8287e+00 --1.4400e+03 -2.2857e+02 1.7844e+00 --1.4400e+03 -2.0000e+02 1.7449e+00 --1.4400e+03 -1.7143e+02 1.7102e+00 --1.4400e+03 -1.4286e+02 1.6806e+00 --1.4400e+03 -1.1429e+02 1.6561e+00 --1.4400e+03 -8.5714e+01 1.6370e+00 --1.4400e+03 -5.7143e+01 1.6232e+00 --1.4400e+03 -2.8571e+01 1.6150e+00 --1.4400e+03 0.0000e+00 1.6122e+00 --1.4400e+03 2.8571e+01 1.6150e+00 --1.4400e+03 5.7143e+01 1.6232e+00 --1.4400e+03 8.5714e+01 1.6370e+00 --1.4400e+03 1.1429e+02 1.6561e+00 --1.4400e+03 1.4286e+02 1.6806e+00 --1.4400e+03 1.7143e+02 1.7102e+00 --1.4400e+03 2.0000e+02 1.7449e+00 --1.4400e+03 2.2857e+02 1.7844e+00 --1.4400e+03 2.5714e+02 1.8287e+00 --1.4400e+03 2.8571e+02 1.8774e+00 --1.4400e+03 3.1429e+02 1.9304e+00 --1.4400e+03 3.4286e+02 1.9874e+00 --1.4400e+03 3.7143e+02 2.0482e+00 --1.4400e+03 4.0000e+02 2.1125e+00 --1.4400e+03 4.2857e+02 2.1802e+00 --1.4400e+03 4.5714e+02 2.2508e+00 --1.4400e+03 4.8571e+02 2.3242e+00 --1.4400e+03 5.1429e+02 2.4001e+00 --1.4400e+03 5.4286e+02 2.4783e+00 --1.4400e+03 5.7143e+02 2.5585e+00 --1.4400e+03 6.0000e+02 2.6404e+00 --1.4400e+03 6.2857e+02 2.7239e+00 --1.4400e+03 6.5714e+02 2.8086e+00 --1.4400e+03 6.8571e+02 2.8944e+00 --1.4400e+03 7.1429e+02 2.9810e+00 --1.4400e+03 7.4286e+02 3.0683e+00 --1.4400e+03 7.7143e+02 3.1561e+00 --1.4400e+03 8.0000e+02 3.2441e+00 --1.4400e+03 8.2857e+02 3.3323e+00 --1.4400e+03 8.5714e+02 3.4205e+00 --1.4400e+03 8.8571e+02 3.5084e+00 --1.4400e+03 9.1429e+02 3.5961e+00 --1.4400e+03 9.4286e+02 3.6833e+00 --1.4400e+03 9.7143e+02 3.7701e+00 --1.4400e+03 1.0000e+03 3.8561e+00 --1.4400e+03 1.0286e+03 3.9415e+00 --1.4400e+03 1.0571e+03 4.0260e+00 --1.4400e+03 1.0857e+03 4.1097e+00 --1.4400e+03 1.1143e+03 4.1924e+00 --1.4400e+03 1.1429e+03 4.2742e+00 --1.4400e+03 1.1714e+03 4.3549e+00 --1.4400e+03 1.2000e+03 4.4345e+00 --1.4400e+03 1.2286e+03 4.5130e+00 --1.4400e+03 1.2571e+03 4.5903e+00 --1.4400e+03 1.2857e+03 4.6664e+00 --1.4400e+03 1.3143e+03 4.7414e+00 --1.4400e+03 1.3429e+03 4.8151e+00 --1.4400e+03 1.3714e+03 4.8877e+00 --1.4400e+03 1.4000e+03 4.9590e+00 --1.4400e+03 1.4286e+03 5.0290e+00 --1.4400e+03 1.4571e+03 5.0979e+00 --1.4400e+03 1.4857e+03 5.1655e+00 --1.4400e+03 1.5143e+03 5.2318e+00 --1.4400e+03 1.5429e+03 5.2970e+00 --1.4400e+03 1.5714e+03 5.3610e+00 --1.4400e+03 1.6000e+03 5.4237e+00 --1.4400e+03 1.6286e+03 5.4853e+00 --1.4400e+03 1.6571e+03 5.5457e+00 --1.4400e+03 1.6857e+03 5.6049e+00 --1.4400e+03 1.7143e+03 5.6630e+00 --1.4400e+03 1.7429e+03 5.7200e+00 --1.4400e+03 1.7714e+03 5.7758e+00 --1.4400e+03 1.8000e+03 5.8306e+00 --1.4400e+03 1.8286e+03 5.8843e+00 --1.4400e+03 1.8571e+03 5.9370e+00 --1.4400e+03 1.8857e+03 5.9886e+00 --1.4400e+03 1.9143e+03 6.0392e+00 --1.4400e+03 1.9429e+03 6.0888e+00 --1.4400e+03 1.9714e+03 6.1374e+00 --1.4400e+03 2.0000e+03 6.1851e+00 --1.4100e+03 -2.0000e+03 6.1493e+00 --1.4100e+03 -1.9714e+03 6.1004e+00 --1.4100e+03 -1.9429e+03 6.0505e+00 --1.4100e+03 -1.9143e+03 5.9995e+00 --1.4100e+03 -1.8857e+03 5.9475e+00 --1.4100e+03 -1.8571e+03 5.8944e+00 --1.4100e+03 -1.8286e+03 5.8402e+00 --1.4100e+03 -1.8000e+03 5.7849e+00 --1.4100e+03 -1.7714e+03 5.7284e+00 --1.4100e+03 -1.7429e+03 5.6708e+00 --1.4100e+03 -1.7143e+03 5.6120e+00 --1.4100e+03 -1.6857e+03 5.5520e+00 --1.4100e+03 -1.6571e+03 5.4908e+00 --1.4100e+03 -1.6286e+03 5.4283e+00 --1.4100e+03 -1.6000e+03 5.3646e+00 --1.4100e+03 -1.5714e+03 5.2995e+00 --1.4100e+03 -1.5429e+03 5.2332e+00 --1.4100e+03 -1.5143e+03 5.1656e+00 --1.4100e+03 -1.4857e+03 5.0967e+00 --1.4100e+03 -1.4571e+03 5.0264e+00 --1.4100e+03 -1.4286e+03 4.9548e+00 --1.4100e+03 -1.4000e+03 4.8819e+00 --1.4100e+03 -1.3714e+03 4.8076e+00 --1.4100e+03 -1.3429e+03 4.7319e+00 --1.4100e+03 -1.3143e+03 4.6549e+00 --1.4100e+03 -1.2857e+03 4.5765e+00 --1.4100e+03 -1.2571e+03 4.4968e+00 --1.4100e+03 -1.2286e+03 4.4158e+00 --1.4100e+03 -1.2000e+03 4.3335e+00 --1.4100e+03 -1.1714e+03 4.2499e+00 --1.4100e+03 -1.1429e+03 4.1651e+00 --1.4100e+03 -1.1143e+03 4.0791e+00 --1.4100e+03 -1.0857e+03 3.9920e+00 --1.4100e+03 -1.0571e+03 3.9037e+00 --1.4100e+03 -1.0286e+03 3.8144e+00 --1.4100e+03 -1.0000e+03 3.7242e+00 --1.4100e+03 -9.7143e+02 3.6331e+00 --1.4100e+03 -9.4286e+02 3.5412e+00 --1.4100e+03 -9.1429e+02 3.4486e+00 --1.4100e+03 -8.8571e+02 3.3554e+00 --1.4100e+03 -8.5714e+02 3.2618e+00 --1.4100e+03 -8.2857e+02 3.1679e+00 --1.4100e+03 -8.0000e+02 3.0738e+00 --1.4100e+03 -7.7143e+02 2.9797e+00 --1.4100e+03 -7.4286e+02 2.8858e+00 --1.4100e+03 -7.1429e+02 2.7923e+00 --1.4100e+03 -6.8571e+02 2.6994e+00 --1.4100e+03 -6.5714e+02 2.6073e+00 --1.4100e+03 -6.2857e+02 2.5161e+00 --1.4100e+03 -6.0000e+02 2.4263e+00 --1.4100e+03 -5.7143e+02 2.3380e+00 --1.4100e+03 -5.4286e+02 2.2514e+00 --1.4100e+03 -5.1429e+02 2.1669e+00 --1.4100e+03 -4.8571e+02 2.0847e+00 --1.4100e+03 -4.5714e+02 2.0052e+00 --1.4100e+03 -4.2857e+02 1.9285e+00 --1.4100e+03 -4.0000e+02 1.8551e+00 --1.4100e+03 -3.7143e+02 1.7851e+00 --1.4100e+03 -3.4286e+02 1.7190e+00 --1.4100e+03 -3.1429e+02 1.6569e+00 --1.4100e+03 -2.8571e+02 1.5991e+00 --1.4100e+03 -2.5714e+02 1.5459e+00 --1.4100e+03 -2.2857e+02 1.4976e+00 --1.4100e+03 -2.0000e+02 1.4544e+00 --1.4100e+03 -1.7143e+02 1.4165e+00 --1.4100e+03 -1.4286e+02 1.3841e+00 --1.4100e+03 -1.1429e+02 1.3573e+00 --1.4100e+03 -8.5714e+01 1.3364e+00 --1.4100e+03 -5.7143e+01 1.3213e+00 --1.4100e+03 -2.8571e+01 1.3123e+00 --1.4100e+03 0.0000e+00 1.3092e+00 --1.4100e+03 2.8571e+01 1.3123e+00 --1.4100e+03 5.7143e+01 1.3213e+00 --1.4100e+03 8.5714e+01 1.3364e+00 --1.4100e+03 1.1429e+02 1.3573e+00 --1.4100e+03 1.4286e+02 1.3841e+00 --1.4100e+03 1.7143e+02 1.4165e+00 --1.4100e+03 2.0000e+02 1.4544e+00 --1.4100e+03 2.2857e+02 1.4976e+00 --1.4100e+03 2.5714e+02 1.5459e+00 --1.4100e+03 2.8571e+02 1.5991e+00 --1.4100e+03 3.1429e+02 1.6569e+00 --1.4100e+03 3.4286e+02 1.7190e+00 --1.4100e+03 3.7143e+02 1.7851e+00 --1.4100e+03 4.0000e+02 1.8551e+00 --1.4100e+03 4.2857e+02 1.9285e+00 --1.4100e+03 4.5714e+02 2.0052e+00 --1.4100e+03 4.8571e+02 2.0847e+00 --1.4100e+03 5.1429e+02 2.1669e+00 --1.4100e+03 5.4286e+02 2.2514e+00 --1.4100e+03 5.7143e+02 2.3380e+00 --1.4100e+03 6.0000e+02 2.4263e+00 --1.4100e+03 6.2857e+02 2.5161e+00 --1.4100e+03 6.5714e+02 2.6073e+00 --1.4100e+03 6.8571e+02 2.6994e+00 --1.4100e+03 7.1429e+02 2.7923e+00 --1.4100e+03 7.4286e+02 2.8858e+00 --1.4100e+03 7.7143e+02 2.9797e+00 --1.4100e+03 8.0000e+02 3.0738e+00 --1.4100e+03 8.2857e+02 3.1679e+00 --1.4100e+03 8.5714e+02 3.2618e+00 --1.4100e+03 8.8571e+02 3.3554e+00 --1.4100e+03 9.1429e+02 3.4486e+00 --1.4100e+03 9.4286e+02 3.5412e+00 --1.4100e+03 9.7143e+02 3.6331e+00 --1.4100e+03 1.0000e+03 3.7242e+00 --1.4100e+03 1.0286e+03 3.8144e+00 --1.4100e+03 1.0571e+03 3.9037e+00 --1.4100e+03 1.0857e+03 3.9920e+00 --1.4100e+03 1.1143e+03 4.0791e+00 --1.4100e+03 1.1429e+03 4.1651e+00 --1.4100e+03 1.1714e+03 4.2499e+00 --1.4100e+03 1.2000e+03 4.3335e+00 --1.4100e+03 1.2286e+03 4.4158e+00 --1.4100e+03 1.2571e+03 4.4968e+00 --1.4100e+03 1.2857e+03 4.5765e+00 --1.4100e+03 1.3143e+03 4.6549e+00 --1.4100e+03 1.3429e+03 4.7319e+00 --1.4100e+03 1.3714e+03 4.8076e+00 --1.4100e+03 1.4000e+03 4.8819e+00 --1.4100e+03 1.4286e+03 4.9548e+00 --1.4100e+03 1.4571e+03 5.0264e+00 --1.4100e+03 1.4857e+03 5.0967e+00 --1.4100e+03 1.5143e+03 5.1656e+00 --1.4100e+03 1.5429e+03 5.2332e+00 --1.4100e+03 1.5714e+03 5.2995e+00 --1.4100e+03 1.6000e+03 5.3646e+00 --1.4100e+03 1.6286e+03 5.4283e+00 --1.4100e+03 1.6571e+03 5.4908e+00 --1.4100e+03 1.6857e+03 5.5520e+00 --1.4100e+03 1.7143e+03 5.6120e+00 --1.4100e+03 1.7429e+03 5.6708e+00 --1.4100e+03 1.7714e+03 5.7284e+00 --1.4100e+03 1.8000e+03 5.7849e+00 --1.4100e+03 1.8286e+03 5.8402e+00 --1.4100e+03 1.8571e+03 5.8944e+00 --1.4100e+03 1.8857e+03 5.9475e+00 --1.4100e+03 1.9143e+03 5.9995e+00 --1.4100e+03 1.9429e+03 6.0505e+00 --1.4100e+03 1.9714e+03 6.1004e+00 --1.4100e+03 2.0000e+03 6.1493e+00 --1.3800e+03 -2.0000e+03 6.1134e+00 --1.3800e+03 -1.9714e+03 6.0632e+00 --1.3800e+03 -1.9429e+03 6.0119e+00 --1.3800e+03 -1.9143e+03 5.9595e+00 --1.3800e+03 -1.8857e+03 5.9061e+00 --1.3800e+03 -1.8571e+03 5.8514e+00 --1.3800e+03 -1.8286e+03 5.7957e+00 --1.3800e+03 -1.8000e+03 5.7387e+00 --1.3800e+03 -1.7714e+03 5.6805e+00 --1.3800e+03 -1.7429e+03 5.6211e+00 --1.3800e+03 -1.7143e+03 5.5604e+00 --1.3800e+03 -1.6857e+03 5.4984e+00 --1.3800e+03 -1.6571e+03 5.4352e+00 --1.3800e+03 -1.6286e+03 5.3706e+00 --1.3800e+03 -1.6000e+03 5.3046e+00 --1.3800e+03 -1.5714e+03 5.2373e+00 --1.3800e+03 -1.5429e+03 5.1685e+00 --1.3800e+03 -1.5143e+03 5.0984e+00 --1.3800e+03 -1.4857e+03 5.0268e+00 --1.3800e+03 -1.4571e+03 4.9537e+00 --1.3800e+03 -1.4286e+03 4.8792e+00 --1.3800e+03 -1.4000e+03 4.8032e+00 --1.3800e+03 -1.3714e+03 4.7258e+00 --1.3800e+03 -1.3429e+03 4.6468e+00 --1.3800e+03 -1.3143e+03 4.5664e+00 --1.3800e+03 -1.2857e+03 4.4844e+00 --1.3800e+03 -1.2571e+03 4.4010e+00 --1.3800e+03 -1.2286e+03 4.3161e+00 --1.3800e+03 -1.2000e+03 4.2298e+00 --1.3800e+03 -1.1714e+03 4.1420e+00 --1.3800e+03 -1.1429e+03 4.0529e+00 --1.3800e+03 -1.1143e+03 3.9623e+00 --1.3800e+03 -1.0857e+03 3.8705e+00 --1.3800e+03 -1.0571e+03 3.7773e+00 --1.3800e+03 -1.0286e+03 3.6830e+00 --1.3800e+03 -1.0000e+03 3.5875e+00 --1.3800e+03 -9.7143e+02 3.4910e+00 --1.3800e+03 -9.4286e+02 3.3935e+00 --1.3800e+03 -9.1429e+02 3.2951e+00 --1.3800e+03 -8.8571e+02 3.1960e+00 --1.3800e+03 -8.5714e+02 3.0963e+00 --1.3800e+03 -8.2857e+02 2.9962e+00 --1.3800e+03 -8.0000e+02 2.8957e+00 --1.3800e+03 -7.7143e+02 2.7951e+00 --1.3800e+03 -7.4286e+02 2.6945e+00 --1.3800e+03 -7.1429e+02 2.5942e+00 --1.3800e+03 -6.8571e+02 2.4944e+00 --1.3800e+03 -6.5714e+02 2.3953e+00 --1.3800e+03 -6.2857e+02 2.2971e+00 --1.3800e+03 -6.0000e+02 2.2002e+00 --1.3800e+03 -5.7143e+02 2.1048e+00 --1.3800e+03 -5.4286e+02 2.0112e+00 --1.3800e+03 -5.1429e+02 1.9197e+00 --1.3800e+03 -4.8571e+02 1.8306e+00 --1.3800e+03 -4.5714e+02 1.7442e+00 --1.3800e+03 -4.2857e+02 1.6609e+00 --1.3800e+03 -4.0000e+02 1.5809e+00 --1.3800e+03 -3.7143e+02 1.5047e+00 --1.3800e+03 -3.4286e+02 1.4325e+00 --1.3800e+03 -3.1429e+02 1.3647e+00 --1.3800e+03 -2.8571e+02 1.3016e+00 --1.3800e+03 -2.5714e+02 1.2434e+00 --1.3800e+03 -2.2857e+02 1.1905e+00 --1.3800e+03 -2.0000e+02 1.1432e+00 --1.3800e+03 -1.7143e+02 1.1016e+00 --1.3800e+03 -1.4286e+02 1.0661e+00 --1.3800e+03 -1.1429e+02 1.0367e+00 --1.3800e+03 -8.5714e+01 1.0137e+00 --1.3800e+03 -5.7143e+01 9.9714e-01 --1.3800e+03 -2.8571e+01 9.8719e-01 --1.3800e+03 0.0000e+00 9.8386e-01 --1.3800e+03 2.8571e+01 9.8719e-01 --1.3800e+03 5.7143e+01 9.9714e-01 --1.3800e+03 8.5714e+01 1.0137e+00 --1.3800e+03 1.1429e+02 1.0367e+00 --1.3800e+03 1.4286e+02 1.0661e+00 --1.3800e+03 1.7143e+02 1.1016e+00 --1.3800e+03 2.0000e+02 1.1432e+00 --1.3800e+03 2.2857e+02 1.1905e+00 --1.3800e+03 2.5714e+02 1.2434e+00 --1.3800e+03 2.8571e+02 1.3016e+00 --1.3800e+03 3.1429e+02 1.3647e+00 --1.3800e+03 3.4286e+02 1.4325e+00 --1.3800e+03 3.7143e+02 1.5047e+00 --1.3800e+03 4.0000e+02 1.5809e+00 --1.3800e+03 4.2857e+02 1.6609e+00 --1.3800e+03 4.5714e+02 1.7442e+00 --1.3800e+03 4.8571e+02 1.8306e+00 --1.3800e+03 5.1429e+02 1.9197e+00 --1.3800e+03 5.4286e+02 2.0112e+00 --1.3800e+03 5.7143e+02 2.1048e+00 --1.3800e+03 6.0000e+02 2.2002e+00 --1.3800e+03 6.2857e+02 2.2971e+00 --1.3800e+03 6.5714e+02 2.3953e+00 --1.3800e+03 6.8571e+02 2.4944e+00 --1.3800e+03 7.1429e+02 2.5942e+00 --1.3800e+03 7.4286e+02 2.6945e+00 --1.3800e+03 7.7143e+02 2.7951e+00 --1.3800e+03 8.0000e+02 2.8957e+00 --1.3800e+03 8.2857e+02 2.9962e+00 --1.3800e+03 8.5714e+02 3.0963e+00 --1.3800e+03 8.8571e+02 3.1960e+00 --1.3800e+03 9.1429e+02 3.2951e+00 --1.3800e+03 9.4286e+02 3.3935e+00 --1.3800e+03 9.7143e+02 3.4910e+00 --1.3800e+03 1.0000e+03 3.5875e+00 --1.3800e+03 1.0286e+03 3.6830e+00 --1.3800e+03 1.0571e+03 3.7773e+00 --1.3800e+03 1.0857e+03 3.8705e+00 --1.3800e+03 1.1143e+03 3.9623e+00 --1.3800e+03 1.1429e+03 4.0529e+00 --1.3800e+03 1.1714e+03 4.1420e+00 --1.3800e+03 1.2000e+03 4.2298e+00 --1.3800e+03 1.2286e+03 4.3161e+00 --1.3800e+03 1.2571e+03 4.4010e+00 --1.3800e+03 1.2857e+03 4.4844e+00 --1.3800e+03 1.3143e+03 4.5664e+00 --1.3800e+03 1.3429e+03 4.6468e+00 --1.3800e+03 1.3714e+03 4.7258e+00 --1.3800e+03 1.4000e+03 4.8032e+00 --1.3800e+03 1.4286e+03 4.8792e+00 --1.3800e+03 1.4571e+03 4.9537e+00 --1.3800e+03 1.4857e+03 5.0268e+00 --1.3800e+03 1.5143e+03 5.0984e+00 --1.3800e+03 1.5429e+03 5.1685e+00 --1.3800e+03 1.5714e+03 5.2373e+00 --1.3800e+03 1.6000e+03 5.3046e+00 --1.3800e+03 1.6286e+03 5.3706e+00 --1.3800e+03 1.6571e+03 5.4352e+00 --1.3800e+03 1.6857e+03 5.4984e+00 --1.3800e+03 1.7143e+03 5.5604e+00 --1.3800e+03 1.7429e+03 5.6211e+00 --1.3800e+03 1.7714e+03 5.6805e+00 --1.3800e+03 1.8000e+03 5.7387e+00 --1.3800e+03 1.8286e+03 5.7957e+00 --1.3800e+03 1.8571e+03 5.8514e+00 --1.3800e+03 1.8857e+03 5.9061e+00 --1.3800e+03 1.9143e+03 5.9595e+00 --1.3800e+03 1.9429e+03 6.0119e+00 --1.3800e+03 1.9714e+03 6.0632e+00 --1.3800e+03 2.0000e+03 6.1134e+00 --1.3500e+03 -2.0000e+03 6.0773e+00 --1.3500e+03 -1.9714e+03 6.0258e+00 --1.3500e+03 -1.9429e+03 5.9732e+00 --1.3500e+03 -1.9143e+03 5.9194e+00 --1.3500e+03 -1.8857e+03 5.8644e+00 --1.3500e+03 -1.8571e+03 5.8082e+00 --1.3500e+03 -1.8286e+03 5.7508e+00 --1.3500e+03 -1.8000e+03 5.6922e+00 --1.3500e+03 -1.7714e+03 5.6322e+00 --1.3500e+03 -1.7429e+03 5.5709e+00 --1.3500e+03 -1.7143e+03 5.5083e+00 --1.3500e+03 -1.6857e+03 5.4443e+00 --1.3500e+03 -1.6571e+03 5.3789e+00 --1.3500e+03 -1.6286e+03 5.3121e+00 --1.3500e+03 -1.6000e+03 5.2438e+00 --1.3500e+03 -1.5714e+03 5.1741e+00 --1.3500e+03 -1.5429e+03 5.1028e+00 --1.3500e+03 -1.5143e+03 5.0300e+00 --1.3500e+03 -1.4857e+03 4.9556e+00 --1.3500e+03 -1.4571e+03 4.8797e+00 --1.3500e+03 -1.4286e+03 4.8022e+00 --1.3500e+03 -1.4000e+03 4.7231e+00 --1.3500e+03 -1.3714e+03 4.6423e+00 --1.3500e+03 -1.3429e+03 4.5599e+00 --1.3500e+03 -1.3143e+03 4.4758e+00 --1.3500e+03 -1.2857e+03 4.3902e+00 --1.3500e+03 -1.2571e+03 4.3028e+00 --1.3500e+03 -1.2286e+03 4.2139e+00 --1.3500e+03 -1.2000e+03 4.1233e+00 --1.3500e+03 -1.1714e+03 4.0310e+00 --1.3500e+03 -1.1429e+03 3.9372e+00 --1.3500e+03 -1.1143e+03 3.8419e+00 --1.3500e+03 -1.0857e+03 3.7450e+00 --1.3500e+03 -1.0571e+03 3.6467e+00 --1.3500e+03 -1.0286e+03 3.5469e+00 --1.3500e+03 -1.0000e+03 3.4459e+00 --1.3500e+03 -9.7143e+02 3.3435e+00 --1.3500e+03 -9.4286e+02 3.2400e+00 --1.3500e+03 -9.1429e+02 3.1355e+00 --1.3500e+03 -8.8571e+02 3.0300e+00 --1.3500e+03 -8.5714e+02 2.9237e+00 --1.3500e+03 -8.2857e+02 2.8167e+00 --1.3500e+03 -8.0000e+02 2.7093e+00 --1.3500e+03 -7.7143e+02 2.6016e+00 --1.3500e+03 -7.4286e+02 2.4937e+00 --1.3500e+03 -7.1429e+02 2.3860e+00 --1.3500e+03 -6.8571e+02 2.2786e+00 --1.3500e+03 -6.5714e+02 2.1718e+00 --1.3500e+03 -6.2857e+02 2.0660e+00 --1.3500e+03 -6.0000e+02 1.9612e+00 --1.3500e+03 -5.7143e+02 1.8580e+00 --1.3500e+03 -5.4286e+02 1.7566e+00 --1.3500e+03 -5.1429e+02 1.6572e+00 --1.3500e+03 -4.8571e+02 1.5604e+00 --1.3500e+03 -4.5714e+02 1.4664e+00 --1.3500e+03 -4.2857e+02 1.3756e+00 --1.3500e+03 -4.0000e+02 1.2884e+00 --1.3500e+03 -3.7143e+02 1.2051e+00 --1.3500e+03 -3.4286e+02 1.1262e+00 --1.3500e+03 -3.1429e+02 1.0520e+00 --1.3500e+03 -2.8571e+02 9.8277e-01 --1.3500e+03 -2.5714e+02 9.1898e-01 --1.3500e+03 -2.2857e+02 8.6092e-01 --1.3500e+03 -2.0000e+02 8.0890e-01 --1.3500e+03 -1.7143e+02 7.6319e-01 --1.3500e+03 -1.4286e+02 7.2407e-01 --1.3500e+03 -1.1429e+02 6.9174e-01 --1.3500e+03 -8.5714e+01 6.6640e-01 --1.3500e+03 -5.7143e+01 6.4819e-01 --1.3500e+03 -2.8571e+01 6.3722e-01 --1.3500e+03 0.0000e+00 6.3355e-01 --1.3500e+03 2.8571e+01 6.3722e-01 --1.3500e+03 5.7143e+01 6.4819e-01 --1.3500e+03 8.5714e+01 6.6640e-01 --1.3500e+03 1.1429e+02 6.9174e-01 --1.3500e+03 1.4286e+02 7.2407e-01 --1.3500e+03 1.7143e+02 7.6319e-01 --1.3500e+03 2.0000e+02 8.0890e-01 --1.3500e+03 2.2857e+02 8.6092e-01 --1.3500e+03 2.5714e+02 9.1898e-01 --1.3500e+03 2.8571e+02 9.8277e-01 --1.3500e+03 3.1429e+02 1.0520e+00 --1.3500e+03 3.4286e+02 1.1262e+00 --1.3500e+03 3.7143e+02 1.2051e+00 --1.3500e+03 4.0000e+02 1.2884e+00 --1.3500e+03 4.2857e+02 1.3756e+00 --1.3500e+03 4.5714e+02 1.4664e+00 --1.3500e+03 4.8571e+02 1.5604e+00 --1.3500e+03 5.1429e+02 1.6572e+00 --1.3500e+03 5.4286e+02 1.7566e+00 --1.3500e+03 5.7143e+02 1.8580e+00 --1.3500e+03 6.0000e+02 1.9612e+00 --1.3500e+03 6.2857e+02 2.0660e+00 --1.3500e+03 6.5714e+02 2.1718e+00 --1.3500e+03 6.8571e+02 2.2786e+00 --1.3500e+03 7.1429e+02 2.3860e+00 --1.3500e+03 7.4286e+02 2.4937e+00 --1.3500e+03 7.7143e+02 2.6016e+00 --1.3500e+03 8.0000e+02 2.7093e+00 --1.3500e+03 8.2857e+02 2.8167e+00 --1.3500e+03 8.5714e+02 2.9237e+00 --1.3500e+03 8.8571e+02 3.0300e+00 --1.3500e+03 9.1429e+02 3.1355e+00 --1.3500e+03 9.4286e+02 3.2400e+00 --1.3500e+03 9.7143e+02 3.3435e+00 --1.3500e+03 1.0000e+03 3.4459e+00 --1.3500e+03 1.0286e+03 3.5469e+00 --1.3500e+03 1.0571e+03 3.6467e+00 --1.3500e+03 1.0857e+03 3.7450e+00 --1.3500e+03 1.1143e+03 3.8419e+00 --1.3500e+03 1.1429e+03 3.9372e+00 --1.3500e+03 1.1714e+03 4.0310e+00 --1.3500e+03 1.2000e+03 4.1233e+00 --1.3500e+03 1.2286e+03 4.2139e+00 --1.3500e+03 1.2571e+03 4.3028e+00 --1.3500e+03 1.2857e+03 4.3902e+00 --1.3500e+03 1.3143e+03 4.4758e+00 --1.3500e+03 1.3429e+03 4.5599e+00 --1.3500e+03 1.3714e+03 4.6423e+00 --1.3500e+03 1.4000e+03 4.7231e+00 --1.3500e+03 1.4286e+03 4.8022e+00 --1.3500e+03 1.4571e+03 4.8797e+00 --1.3500e+03 1.4857e+03 4.9556e+00 --1.3500e+03 1.5143e+03 5.0300e+00 --1.3500e+03 1.5429e+03 5.1028e+00 --1.3500e+03 1.5714e+03 5.1741e+00 --1.3500e+03 1.6000e+03 5.2438e+00 --1.3500e+03 1.6286e+03 5.3121e+00 --1.3500e+03 1.6571e+03 5.3789e+00 --1.3500e+03 1.6857e+03 5.4443e+00 --1.3500e+03 1.7143e+03 5.5083e+00 --1.3500e+03 1.7429e+03 5.5709e+00 --1.3500e+03 1.7714e+03 5.6322e+00 --1.3500e+03 1.8000e+03 5.6922e+00 --1.3500e+03 1.8286e+03 5.7508e+00 --1.3500e+03 1.8571e+03 5.8082e+00 --1.3500e+03 1.8857e+03 5.8644e+00 --1.3500e+03 1.9143e+03 5.9194e+00 --1.3500e+03 1.9429e+03 5.9732e+00 --1.3500e+03 1.9714e+03 6.0258e+00 --1.3500e+03 2.0000e+03 6.0773e+00 --1.3200e+03 -2.0000e+03 6.0412e+00 --1.3200e+03 -1.9714e+03 5.9883e+00 --1.3200e+03 -1.9429e+03 5.9343e+00 --1.3200e+03 -1.9143e+03 5.8790e+00 --1.3200e+03 -1.8857e+03 5.8225e+00 --1.3200e+03 -1.8571e+03 5.7648e+00 --1.3200e+03 -1.8286e+03 5.7057e+00 --1.3200e+03 -1.8000e+03 5.6453e+00 --1.3200e+03 -1.7714e+03 5.5835e+00 --1.3200e+03 -1.7429e+03 5.5204e+00 --1.3200e+03 -1.7143e+03 5.4557e+00 --1.3200e+03 -1.6857e+03 5.3897e+00 --1.3200e+03 -1.6571e+03 5.3221e+00 --1.3200e+03 -1.6286e+03 5.2530e+00 --1.3200e+03 -1.6000e+03 5.1823e+00 --1.3200e+03 -1.5714e+03 5.1100e+00 --1.3200e+03 -1.5429e+03 5.0362e+00 --1.3200e+03 -1.5143e+03 4.9606e+00 --1.3200e+03 -1.4857e+03 4.8834e+00 --1.3200e+03 -1.4571e+03 4.8044e+00 --1.3200e+03 -1.4286e+03 4.7238e+00 --1.3200e+03 -1.4000e+03 4.6413e+00 --1.3200e+03 -1.3714e+03 4.5571e+00 --1.3200e+03 -1.3429e+03 4.4711e+00 --1.3200e+03 -1.3143e+03 4.3833e+00 --1.3200e+03 -1.2857e+03 4.2937e+00 --1.3200e+03 -1.2571e+03 4.2022e+00 --1.3200e+03 -1.2286e+03 4.1089e+00 --1.3200e+03 -1.2000e+03 4.0138e+00 --1.3200e+03 -1.1714e+03 3.9169e+00 --1.3200e+03 -1.1429e+03 3.8182e+00 --1.3200e+03 -1.1143e+03 3.7177e+00 --1.3200e+03 -1.0857e+03 3.6155e+00 --1.3200e+03 -1.0571e+03 3.5117e+00 --1.3200e+03 -1.0286e+03 3.4061e+00 --1.3200e+03 -1.0000e+03 3.2991e+00 --1.3200e+03 -9.7143e+02 3.1905e+00 --1.3200e+03 -9.4286e+02 3.0805e+00 --1.3200e+03 -9.1429e+02 2.9693e+00 --1.3200e+03 -8.8571e+02 2.8569e+00 --1.3200e+03 -8.5714e+02 2.7434e+00 --1.3200e+03 -8.2857e+02 2.6291e+00 --1.3200e+03 -8.0000e+02 2.5141e+00 --1.3200e+03 -7.7143e+02 2.3986e+00 --1.3200e+03 -7.4286e+02 2.2828e+00 --1.3200e+03 -7.1429e+02 2.1669e+00 --1.3200e+03 -6.8571e+02 2.0513e+00 --1.3200e+03 -6.5714e+02 1.9361e+00 --1.3200e+03 -6.2857e+02 1.8216e+00 --1.3200e+03 -6.0000e+02 1.7083e+00 --1.3200e+03 -5.7143e+02 1.5964e+00 --1.3200e+03 -5.4286e+02 1.4862e+00 --1.3200e+03 -5.1429e+02 1.3782e+00 --1.3200e+03 -4.8571e+02 1.2728e+00 --1.3200e+03 -4.5714e+02 1.1702e+00 --1.3200e+03 -4.2857e+02 1.0711e+00 --1.3200e+03 -4.0000e+02 9.7570e-01 --1.3200e+03 -3.7143e+02 8.8452e-01 --1.3200e+03 -3.4286e+02 7.9797e-01 --1.3200e+03 -3.1429e+02 7.1647e-01 --1.3200e+03 -2.8571e+02 6.4043e-01 --1.3200e+03 -2.5714e+02 5.7025e-01 --1.3200e+03 -2.2857e+02 5.0631e-01 --1.3200e+03 -2.0000e+02 4.4897e-01 --1.3200e+03 -1.7143e+02 3.9856e-01 --1.3200e+03 -1.4286e+02 3.5538e-01 --1.3200e+03 -1.1429e+02 3.1968e-01 --1.3200e+03 -8.5714e+01 2.9168e-01 --1.3200e+03 -5.7143e+01 2.7155e-01 --1.3200e+03 -2.8571e+01 2.5942e-01 --1.3200e+03 0.0000e+00 2.5537e-01 --1.3200e+03 2.8571e+01 2.5942e-01 --1.3200e+03 5.7143e+01 2.7155e-01 --1.3200e+03 8.5714e+01 2.9168e-01 --1.3200e+03 1.1429e+02 3.1968e-01 --1.3200e+03 1.4286e+02 3.5538e-01 --1.3200e+03 1.7143e+02 3.9856e-01 --1.3200e+03 2.0000e+02 4.4897e-01 --1.3200e+03 2.2857e+02 5.0631e-01 --1.3200e+03 2.5714e+02 5.7025e-01 --1.3200e+03 2.8571e+02 6.4043e-01 --1.3200e+03 3.1429e+02 7.1647e-01 --1.3200e+03 3.4286e+02 7.9797e-01 --1.3200e+03 3.7143e+02 8.8452e-01 --1.3200e+03 4.0000e+02 9.7570e-01 --1.3200e+03 4.2857e+02 1.0711e+00 --1.3200e+03 4.5714e+02 1.1702e+00 --1.3200e+03 4.8571e+02 1.2728e+00 --1.3200e+03 5.1429e+02 1.3782e+00 --1.3200e+03 5.4286e+02 1.4862e+00 --1.3200e+03 5.7143e+02 1.5964e+00 --1.3200e+03 6.0000e+02 1.7083e+00 --1.3200e+03 6.2857e+02 1.8216e+00 --1.3200e+03 6.5714e+02 1.9361e+00 --1.3200e+03 6.8571e+02 2.0513e+00 --1.3200e+03 7.1429e+02 2.1669e+00 --1.3200e+03 7.4286e+02 2.2828e+00 --1.3200e+03 7.7143e+02 2.3986e+00 --1.3200e+03 8.0000e+02 2.5141e+00 --1.3200e+03 8.2857e+02 2.6291e+00 --1.3200e+03 8.5714e+02 2.7434e+00 --1.3200e+03 8.8571e+02 2.8569e+00 --1.3200e+03 9.1429e+02 2.9693e+00 --1.3200e+03 9.4286e+02 3.0805e+00 --1.3200e+03 9.7143e+02 3.1905e+00 --1.3200e+03 1.0000e+03 3.2991e+00 --1.3200e+03 1.0286e+03 3.4061e+00 --1.3200e+03 1.0571e+03 3.5117e+00 --1.3200e+03 1.0857e+03 3.6155e+00 --1.3200e+03 1.1143e+03 3.7177e+00 --1.3200e+03 1.1429e+03 3.8182e+00 --1.3200e+03 1.1714e+03 3.9169e+00 --1.3200e+03 1.2000e+03 4.0138e+00 --1.3200e+03 1.2286e+03 4.1089e+00 --1.3200e+03 1.2571e+03 4.2022e+00 --1.3200e+03 1.2857e+03 4.2937e+00 --1.3200e+03 1.3143e+03 4.3833e+00 --1.3200e+03 1.3429e+03 4.4711e+00 --1.3200e+03 1.3714e+03 4.5571e+00 --1.3200e+03 1.4000e+03 4.6413e+00 --1.3200e+03 1.4286e+03 4.7238e+00 --1.3200e+03 1.4571e+03 4.8044e+00 --1.3200e+03 1.4857e+03 4.8834e+00 --1.3200e+03 1.5143e+03 4.9606e+00 --1.3200e+03 1.5429e+03 5.0362e+00 --1.3200e+03 1.5714e+03 5.1100e+00 --1.3200e+03 1.6000e+03 5.1823e+00 --1.3200e+03 1.6286e+03 5.2530e+00 --1.3200e+03 1.6571e+03 5.3221e+00 --1.3200e+03 1.6857e+03 5.3897e+00 --1.3200e+03 1.7143e+03 5.4557e+00 --1.3200e+03 1.7429e+03 5.5204e+00 --1.3200e+03 1.7714e+03 5.5835e+00 --1.3200e+03 1.8000e+03 5.6453e+00 --1.3200e+03 1.8286e+03 5.7057e+00 --1.3200e+03 1.8571e+03 5.7648e+00 --1.3200e+03 1.8857e+03 5.8225e+00 --1.3200e+03 1.9143e+03 5.8790e+00 --1.3200e+03 1.9429e+03 5.9343e+00 --1.3200e+03 1.9714e+03 5.9883e+00 --1.3200e+03 2.0000e+03 6.0412e+00 --1.2900e+03 -2.0000e+03 6.0049e+00 --1.2900e+03 -1.9714e+03 5.9507e+00 --1.2900e+03 -1.9429e+03 5.8952e+00 --1.2900e+03 -1.9143e+03 5.8385e+00 --1.2900e+03 -1.8857e+03 5.7805e+00 --1.2900e+03 -1.8571e+03 5.7211e+00 --1.2900e+03 -1.8286e+03 5.6603e+00 --1.2900e+03 -1.8000e+03 5.5981e+00 --1.2900e+03 -1.7714e+03 5.5345e+00 --1.2900e+03 -1.7429e+03 5.4693e+00 --1.2900e+03 -1.7143e+03 5.4027e+00 --1.2900e+03 -1.6857e+03 5.3345e+00 --1.2900e+03 -1.6571e+03 5.2646e+00 --1.2900e+03 -1.6286e+03 5.1932e+00 --1.2900e+03 -1.6000e+03 5.1200e+00 --1.2900e+03 -1.5714e+03 5.0452e+00 --1.2900e+03 -1.5429e+03 4.9686e+00 --1.2900e+03 -1.5143e+03 4.8902e+00 --1.2900e+03 -1.4857e+03 4.8100e+00 --1.2900e+03 -1.4571e+03 4.7279e+00 --1.2900e+03 -1.4286e+03 4.6440e+00 --1.2900e+03 -1.4000e+03 4.5581e+00 --1.2900e+03 -1.3714e+03 4.4703e+00 --1.2900e+03 -1.3429e+03 4.3805e+00 --1.2900e+03 -1.3143e+03 4.2887e+00 --1.2900e+03 -1.2857e+03 4.1949e+00 --1.2900e+03 -1.2571e+03 4.0991e+00 --1.2900e+03 -1.2286e+03 4.0013e+00 --1.2900e+03 -1.2000e+03 3.9014e+00 --1.2900e+03 -1.1714e+03 3.7996e+00 --1.2900e+03 -1.1429e+03 3.6957e+00 --1.2900e+03 -1.1143e+03 3.5898e+00 --1.2900e+03 -1.0857e+03 3.4819e+00 --1.2900e+03 -1.0571e+03 3.3721e+00 --1.2900e+03 -1.0286e+03 3.2604e+00 --1.2900e+03 -1.0000e+03 3.1469e+00 --1.2900e+03 -9.7143e+02 3.0316e+00 --1.2900e+03 -9.4286e+02 2.9147e+00 --1.2900e+03 -9.1429e+02 2.7962e+00 --1.2900e+03 -8.8571e+02 2.6764e+00 --1.2900e+03 -8.5714e+02 2.5552e+00 --1.2900e+03 -8.2857e+02 2.4329e+00 --1.2900e+03 -8.0000e+02 2.3096e+00 --1.2900e+03 -7.7143e+02 2.1856e+00 --1.2900e+03 -7.4286e+02 2.0611e+00 --1.2900e+03 -7.1429e+02 1.9363e+00 --1.2900e+03 -6.8571e+02 1.8115e+00 --1.2900e+03 -6.5714e+02 1.6870e+00 --1.2900e+03 -6.2857e+02 1.5631e+00 --1.2900e+03 -6.0000e+02 1.4402e+00 --1.2900e+03 -5.7143e+02 1.3186e+00 --1.2900e+03 -5.4286e+02 1.1988e+00 --1.2900e+03 -5.1429e+02 1.0811e+00 --1.2900e+03 -4.8571e+02 9.6596e-01 --1.2900e+03 -4.5714e+02 8.5389e-01 --1.2900e+03 -4.2857e+02 7.4532e-01 --1.2900e+03 -4.0000e+02 6.4073e-01 --1.2900e+03 -3.7143e+02 5.4061e-01 --1.2900e+03 -3.4286e+02 4.4544e-01 --1.2900e+03 -3.1429e+02 3.5570e-01 --1.2900e+03 -2.8571e+02 2.7188e-01 --1.2900e+03 -2.5714e+02 1.9443e-01 --1.2900e+03 -2.2857e+02 1.2380e-01 --1.2900e+03 -2.0000e+02 6.0403e-02 --1.2900e+03 -1.7143e+02 4.6172e-03 --1.2900e+03 -1.4286e+02 -4.3208e-02 --1.2900e+03 -1.1429e+02 -8.2769e-02 --1.2900e+03 -8.5714e+01 -1.1381e-01 --1.2900e+03 -5.7143e+01 -1.3613e-01 --1.2900e+03 -2.8571e+01 -1.4959e-01 --1.2900e+03 0.0000e+00 -1.5408e-01 --1.2900e+03 2.8571e+01 -1.4959e-01 --1.2900e+03 5.7143e+01 -1.3613e-01 --1.2900e+03 8.5714e+01 -1.1381e-01 --1.2900e+03 1.1429e+02 -8.2769e-02 --1.2900e+03 1.4286e+02 -4.3208e-02 --1.2900e+03 1.7143e+02 4.6172e-03 --1.2900e+03 2.0000e+02 6.0403e-02 --1.2900e+03 2.2857e+02 1.2380e-01 --1.2900e+03 2.5714e+02 1.9443e-01 --1.2900e+03 2.8571e+02 2.7188e-01 --1.2900e+03 3.1429e+02 3.5570e-01 --1.2900e+03 3.4286e+02 4.4544e-01 --1.2900e+03 3.7143e+02 5.4061e-01 --1.2900e+03 4.0000e+02 6.4073e-01 --1.2900e+03 4.2857e+02 7.4532e-01 --1.2900e+03 4.5714e+02 8.5389e-01 --1.2900e+03 4.8571e+02 9.6596e-01 --1.2900e+03 5.1429e+02 1.0811e+00 --1.2900e+03 5.4286e+02 1.1988e+00 --1.2900e+03 5.7143e+02 1.3186e+00 --1.2900e+03 6.0000e+02 1.4402e+00 --1.2900e+03 6.2857e+02 1.5631e+00 --1.2900e+03 6.5714e+02 1.6870e+00 --1.2900e+03 6.8571e+02 1.8115e+00 --1.2900e+03 7.1429e+02 1.9363e+00 --1.2900e+03 7.4286e+02 2.0611e+00 --1.2900e+03 7.7143e+02 2.1856e+00 --1.2900e+03 8.0000e+02 2.3096e+00 --1.2900e+03 8.2857e+02 2.4329e+00 --1.2900e+03 8.5714e+02 2.5552e+00 --1.2900e+03 8.8571e+02 2.6764e+00 --1.2900e+03 9.1429e+02 2.7962e+00 --1.2900e+03 9.4286e+02 2.9147e+00 --1.2900e+03 9.7143e+02 3.0316e+00 --1.2900e+03 1.0000e+03 3.1469e+00 --1.2900e+03 1.0286e+03 3.2604e+00 --1.2900e+03 1.0571e+03 3.3721e+00 --1.2900e+03 1.0857e+03 3.4819e+00 --1.2900e+03 1.1143e+03 3.5898e+00 --1.2900e+03 1.1429e+03 3.6957e+00 --1.2900e+03 1.1714e+03 3.7996e+00 --1.2900e+03 1.2000e+03 3.9014e+00 --1.2900e+03 1.2286e+03 4.0013e+00 --1.2900e+03 1.2571e+03 4.0991e+00 --1.2900e+03 1.2857e+03 4.1949e+00 --1.2900e+03 1.3143e+03 4.2887e+00 --1.2900e+03 1.3429e+03 4.3805e+00 --1.2900e+03 1.3714e+03 4.4703e+00 --1.2900e+03 1.4000e+03 4.5581e+00 --1.2900e+03 1.4286e+03 4.6440e+00 --1.2900e+03 1.4571e+03 4.7279e+00 --1.2900e+03 1.4857e+03 4.8100e+00 --1.2900e+03 1.5143e+03 4.8902e+00 --1.2900e+03 1.5429e+03 4.9686e+00 --1.2900e+03 1.5714e+03 5.0452e+00 --1.2900e+03 1.6000e+03 5.1200e+00 --1.2900e+03 1.6286e+03 5.1932e+00 --1.2900e+03 1.6571e+03 5.2646e+00 --1.2900e+03 1.6857e+03 5.3345e+00 --1.2900e+03 1.7143e+03 5.4027e+00 --1.2900e+03 1.7429e+03 5.4693e+00 --1.2900e+03 1.7714e+03 5.5345e+00 --1.2900e+03 1.8000e+03 5.5981e+00 --1.2900e+03 1.8286e+03 5.6603e+00 --1.2900e+03 1.8571e+03 5.7211e+00 --1.2900e+03 1.8857e+03 5.7805e+00 --1.2900e+03 1.9143e+03 5.8385e+00 --1.2900e+03 1.9429e+03 5.8952e+00 --1.2900e+03 1.9714e+03 5.9507e+00 --1.2900e+03 2.0000e+03 6.0049e+00 --1.2600e+03 -2.0000e+03 5.9686e+00 --1.2600e+03 -1.9714e+03 5.9130e+00 --1.2600e+03 -1.9429e+03 5.8561e+00 --1.2600e+03 -1.9143e+03 5.7978e+00 --1.2600e+03 -1.8857e+03 5.7382e+00 --1.2600e+03 -1.8571e+03 5.6772e+00 --1.2600e+03 -1.8286e+03 5.6146e+00 --1.2600e+03 -1.8000e+03 5.5506e+00 --1.2600e+03 -1.7714e+03 5.4851e+00 --1.2600e+03 -1.7429e+03 5.4180e+00 --1.2600e+03 -1.7143e+03 5.3492e+00 --1.2600e+03 -1.6857e+03 5.2788e+00 --1.2600e+03 -1.6571e+03 5.2066e+00 --1.2600e+03 -1.6286e+03 5.1327e+00 --1.2600e+03 -1.6000e+03 5.0570e+00 --1.2600e+03 -1.5714e+03 4.9795e+00 --1.2600e+03 -1.5429e+03 4.9001e+00 --1.2600e+03 -1.5143e+03 4.8188e+00 --1.2600e+03 -1.4857e+03 4.7355e+00 --1.2600e+03 -1.4571e+03 4.6501e+00 --1.2600e+03 -1.4286e+03 4.5628e+00 --1.2600e+03 -1.4000e+03 4.4733e+00 --1.2600e+03 -1.3714e+03 4.3817e+00 --1.2600e+03 -1.3429e+03 4.2880e+00 --1.2600e+03 -1.3143e+03 4.1921e+00 --1.2600e+03 -1.2857e+03 4.0939e+00 --1.2600e+03 -1.2571e+03 3.9936e+00 --1.2600e+03 -1.2286e+03 3.8910e+00 --1.2600e+03 -1.2000e+03 3.7861e+00 --1.2600e+03 -1.1714e+03 3.6789e+00 --1.2600e+03 -1.1429e+03 3.5695e+00 --1.2600e+03 -1.1143e+03 3.4578e+00 --1.2600e+03 -1.0857e+03 3.3439e+00 --1.2600e+03 -1.0571e+03 3.2278e+00 --1.2600e+03 -1.0286e+03 3.1095e+00 --1.2600e+03 -1.0000e+03 2.9891e+00 --1.2600e+03 -9.7143e+02 2.8666e+00 --1.2600e+03 -9.4286e+02 2.7422e+00 --1.2600e+03 -9.1429e+02 2.6160e+00 --1.2600e+03 -8.8571e+02 2.4880e+00 --1.2600e+03 -8.5714e+02 2.3584e+00 --1.2600e+03 -8.2857e+02 2.2274e+00 --1.2600e+03 -8.0000e+02 2.0951e+00 --1.2600e+03 -7.7143e+02 1.9619e+00 --1.2600e+03 -7.4286e+02 1.8278e+00 --1.2600e+03 -7.1429e+02 1.6931e+00 --1.2600e+03 -6.8571e+02 1.5583e+00 --1.2600e+03 -6.5714e+02 1.4235e+00 --1.2600e+03 -6.2857e+02 1.2892e+00 --1.2600e+03 -6.0000e+02 1.1556e+00 --1.2600e+03 -5.7143e+02 1.0233e+00 --1.2600e+03 -5.4286e+02 8.9262e-01 --1.2600e+03 -5.1429e+02 7.6407e-01 --1.2600e+03 -4.8571e+02 6.3812e-01 --1.2600e+03 -4.5714e+02 5.1529e-01 --1.2600e+03 -4.2857e+02 3.9610e-01 --1.2600e+03 -4.0000e+02 2.8110e-01 --1.2600e+03 -3.7143e+02 1.7084e-01 --1.2600e+03 -3.4286e+02 6.5885e-02 --1.2600e+03 -3.1429e+02 -3.3215e-02 --1.2600e+03 -2.8571e+02 -1.2591e-01 --1.2600e+03 -2.5714e+02 -2.1165e-01 --1.2600e+03 -2.2857e+02 -2.8994e-01 --1.2600e+03 -2.0000e+02 -3.6029e-01 --1.2600e+03 -1.7143e+02 -4.2224e-01 --1.2600e+03 -1.4286e+02 -4.7540e-01 --1.2600e+03 -1.1429e+02 -5.1940e-01 --1.2600e+03 -8.5714e+01 -5.5394e-01 --1.2600e+03 -5.7143e+01 -5.7879e-01 --1.2600e+03 -2.8571e+01 -5.9377e-01 --1.2600e+03 0.0000e+00 -5.9877e-01 --1.2600e+03 2.8571e+01 -5.9377e-01 --1.2600e+03 5.7143e+01 -5.7879e-01 --1.2600e+03 8.5714e+01 -5.5394e-01 --1.2600e+03 1.1429e+02 -5.1940e-01 --1.2600e+03 1.4286e+02 -4.7540e-01 --1.2600e+03 1.7143e+02 -4.2224e-01 --1.2600e+03 2.0000e+02 -3.6029e-01 --1.2600e+03 2.2857e+02 -2.8994e-01 --1.2600e+03 2.5714e+02 -2.1165e-01 --1.2600e+03 2.8571e+02 -1.2591e-01 --1.2600e+03 3.1429e+02 -3.3215e-02 --1.2600e+03 3.4286e+02 6.5885e-02 --1.2600e+03 3.7143e+02 1.7084e-01 --1.2600e+03 4.0000e+02 2.8110e-01 --1.2600e+03 4.2857e+02 3.9610e-01 --1.2600e+03 4.5714e+02 5.1529e-01 --1.2600e+03 4.8571e+02 6.3812e-01 --1.2600e+03 5.1429e+02 7.6407e-01 --1.2600e+03 5.4286e+02 8.9262e-01 --1.2600e+03 5.7143e+02 1.0233e+00 --1.2600e+03 6.0000e+02 1.1556e+00 --1.2600e+03 6.2857e+02 1.2892e+00 --1.2600e+03 6.5714e+02 1.4235e+00 --1.2600e+03 6.8571e+02 1.5583e+00 --1.2600e+03 7.1429e+02 1.6931e+00 --1.2600e+03 7.4286e+02 1.8278e+00 --1.2600e+03 7.7143e+02 1.9619e+00 --1.2600e+03 8.0000e+02 2.0951e+00 --1.2600e+03 8.2857e+02 2.2274e+00 --1.2600e+03 8.5714e+02 2.3584e+00 --1.2600e+03 8.8571e+02 2.4880e+00 --1.2600e+03 9.1429e+02 2.6160e+00 --1.2600e+03 9.4286e+02 2.7422e+00 --1.2600e+03 9.7143e+02 2.8666e+00 --1.2600e+03 1.0000e+03 2.9891e+00 --1.2600e+03 1.0286e+03 3.1095e+00 --1.2600e+03 1.0571e+03 3.2278e+00 --1.2600e+03 1.0857e+03 3.3439e+00 --1.2600e+03 1.1143e+03 3.4578e+00 --1.2600e+03 1.1429e+03 3.5695e+00 --1.2600e+03 1.1714e+03 3.6789e+00 --1.2600e+03 1.2000e+03 3.7861e+00 --1.2600e+03 1.2286e+03 3.8910e+00 --1.2600e+03 1.2571e+03 3.9936e+00 --1.2600e+03 1.2857e+03 4.0939e+00 --1.2600e+03 1.3143e+03 4.1921e+00 --1.2600e+03 1.3429e+03 4.2880e+00 --1.2600e+03 1.3714e+03 4.3817e+00 --1.2600e+03 1.4000e+03 4.4733e+00 --1.2600e+03 1.4286e+03 4.5628e+00 --1.2600e+03 1.4571e+03 4.6501e+00 --1.2600e+03 1.4857e+03 4.7355e+00 --1.2600e+03 1.5143e+03 4.8188e+00 --1.2600e+03 1.5429e+03 4.9001e+00 --1.2600e+03 1.5714e+03 4.9795e+00 --1.2600e+03 1.6000e+03 5.0570e+00 --1.2600e+03 1.6286e+03 5.1327e+00 --1.2600e+03 1.6571e+03 5.2066e+00 --1.2600e+03 1.6857e+03 5.2788e+00 --1.2600e+03 1.7143e+03 5.3492e+00 --1.2600e+03 1.7429e+03 5.4180e+00 --1.2600e+03 1.7714e+03 5.4851e+00 --1.2600e+03 1.8000e+03 5.5506e+00 --1.2600e+03 1.8286e+03 5.6146e+00 --1.2600e+03 1.8571e+03 5.6772e+00 --1.2600e+03 1.8857e+03 5.7382e+00 --1.2600e+03 1.9143e+03 5.7978e+00 --1.2600e+03 1.9429e+03 5.8561e+00 --1.2600e+03 1.9714e+03 5.9130e+00 --1.2600e+03 2.0000e+03 5.9686e+00 --1.2300e+03 -2.0000e+03 5.9322e+00 --1.2300e+03 -1.9714e+03 5.8752e+00 --1.2300e+03 -1.9429e+03 5.8168e+00 --1.2300e+03 -1.9143e+03 5.7571e+00 --1.2300e+03 -1.8857e+03 5.6958e+00 --1.2300e+03 -1.8571e+03 5.6331e+00 --1.2300e+03 -1.8286e+03 5.5688e+00 --1.2300e+03 -1.8000e+03 5.5029e+00 --1.2300e+03 -1.7714e+03 5.4354e+00 --1.2300e+03 -1.7429e+03 5.3662e+00 --1.2300e+03 -1.7143e+03 5.2953e+00 --1.2300e+03 -1.6857e+03 5.2226e+00 --1.2300e+03 -1.6571e+03 5.1481e+00 --1.2300e+03 -1.6286e+03 5.0717e+00 --1.2300e+03 -1.6000e+03 4.9934e+00 --1.2300e+03 -1.5714e+03 4.9131e+00 --1.2300e+03 -1.5429e+03 4.8308e+00 --1.2300e+03 -1.5143e+03 4.7464e+00 --1.2300e+03 -1.4857e+03 4.6598e+00 --1.2300e+03 -1.4571e+03 4.5711e+00 --1.2300e+03 -1.4286e+03 4.4802e+00 --1.2300e+03 -1.4000e+03 4.3870e+00 --1.2300e+03 -1.3714e+03 4.2915e+00 --1.2300e+03 -1.3429e+03 4.1937e+00 --1.2300e+03 -1.3143e+03 4.0934e+00 --1.2300e+03 -1.2857e+03 3.9907e+00 --1.2300e+03 -1.2571e+03 3.8855e+00 --1.2300e+03 -1.2286e+03 3.7779e+00 --1.2300e+03 -1.2000e+03 3.6677e+00 --1.2300e+03 -1.1714e+03 3.5549e+00 --1.2300e+03 -1.1429e+03 3.4397e+00 --1.2300e+03 -1.1143e+03 3.3219e+00 --1.2300e+03 -1.0857e+03 3.2015e+00 --1.2300e+03 -1.0571e+03 3.0786e+00 --1.2300e+03 -1.0286e+03 2.9533e+00 --1.2300e+03 -1.0000e+03 2.8255e+00 --1.2300e+03 -9.7143e+02 2.6953e+00 --1.2300e+03 -9.4286e+02 2.5628e+00 --1.2300e+03 -9.1429e+02 2.4282e+00 --1.2300e+03 -8.8571e+02 2.2914e+00 --1.2300e+03 -8.5714e+02 2.1527e+00 --1.2300e+03 -8.2857e+02 2.0122e+00 --1.2300e+03 -8.0000e+02 1.8701e+00 --1.2300e+03 -7.7143e+02 1.7267e+00 --1.2300e+03 -7.4286e+02 1.5821e+00 --1.2300e+03 -7.1429e+02 1.4366e+00 --1.2300e+03 -6.8571e+02 1.2907e+00 --1.2300e+03 -6.5714e+02 1.1445e+00 --1.2300e+03 -6.2857e+02 9.9851e-01 --1.2300e+03 -6.0000e+02 8.5313e-01 --1.2300e+03 -5.7143e+02 7.0880e-01 --1.2300e+03 -5.4286e+02 5.6600e-01 --1.2300e+03 -5.1429e+02 4.2526e-01 --1.2300e+03 -4.8571e+02 2.8711e-01 --1.2300e+03 -4.5714e+02 1.5213e-01 --1.2300e+03 -4.2857e+02 2.0919e-02 --1.2300e+03 -4.0000e+02 -1.0590e-01 --1.2300e+03 -3.7143e+02 -2.2768e-01 --1.2300e+03 -3.4286e+02 -3.4380e-01 --1.2300e+03 -3.1429e+02 -4.5361e-01 --1.2300e+03 -2.8571e+02 -5.5646e-01 --1.2300e+03 -2.5714e+02 -6.5173e-01 --1.2300e+03 -2.2857e+02 -7.3882e-01 --1.2300e+03 -2.0000e+02 -8.1716e-01 --1.2300e+03 -1.7143e+02 -8.8622e-01 --1.2300e+03 -1.4286e+02 -9.4552e-01 --1.2300e+03 -1.1429e+02 -9.9465e-01 --1.2300e+03 -8.5714e+01 -1.0332e+00 --1.2300e+03 -5.7143e+01 -1.0610e+00 --1.2300e+03 -2.8571e+01 -1.0778e+00 --1.2300e+03 0.0000e+00 -1.0834e+00 --1.2300e+03 2.8571e+01 -1.0778e+00 --1.2300e+03 5.7143e+01 -1.0610e+00 --1.2300e+03 8.5714e+01 -1.0332e+00 --1.2300e+03 1.1429e+02 -9.9465e-01 --1.2300e+03 1.4286e+02 -9.4552e-01 --1.2300e+03 1.7143e+02 -8.8622e-01 --1.2300e+03 2.0000e+02 -8.1716e-01 --1.2300e+03 2.2857e+02 -7.3882e-01 --1.2300e+03 2.5714e+02 -6.5173e-01 --1.2300e+03 2.8571e+02 -5.5646e-01 --1.2300e+03 3.1429e+02 -4.5361e-01 --1.2300e+03 3.4286e+02 -3.4380e-01 --1.2300e+03 3.7143e+02 -2.2768e-01 --1.2300e+03 4.0000e+02 -1.0590e-01 --1.2300e+03 4.2857e+02 2.0919e-02 --1.2300e+03 4.5714e+02 1.5213e-01 --1.2300e+03 4.8571e+02 2.8711e-01 --1.2300e+03 5.1429e+02 4.2526e-01 --1.2300e+03 5.4286e+02 5.6600e-01 --1.2300e+03 5.7143e+02 7.0880e-01 --1.2300e+03 6.0000e+02 8.5313e-01 --1.2300e+03 6.2857e+02 9.9851e-01 --1.2300e+03 6.5714e+02 1.1445e+00 --1.2300e+03 6.8571e+02 1.2907e+00 --1.2300e+03 7.1429e+02 1.4366e+00 --1.2300e+03 7.4286e+02 1.5821e+00 --1.2300e+03 7.7143e+02 1.7267e+00 --1.2300e+03 8.0000e+02 1.8701e+00 --1.2300e+03 8.2857e+02 2.0122e+00 --1.2300e+03 8.5714e+02 2.1527e+00 --1.2300e+03 8.8571e+02 2.2914e+00 --1.2300e+03 9.1429e+02 2.4282e+00 --1.2300e+03 9.4286e+02 2.5628e+00 --1.2300e+03 9.7143e+02 2.6953e+00 --1.2300e+03 1.0000e+03 2.8255e+00 --1.2300e+03 1.0286e+03 2.9533e+00 --1.2300e+03 1.0571e+03 3.0786e+00 --1.2300e+03 1.0857e+03 3.2015e+00 --1.2300e+03 1.1143e+03 3.3219e+00 --1.2300e+03 1.1429e+03 3.4397e+00 --1.2300e+03 1.1714e+03 3.5549e+00 --1.2300e+03 1.2000e+03 3.6677e+00 --1.2300e+03 1.2286e+03 3.7779e+00 --1.2300e+03 1.2571e+03 3.8855e+00 --1.2300e+03 1.2857e+03 3.9907e+00 --1.2300e+03 1.3143e+03 4.0934e+00 --1.2300e+03 1.3429e+03 4.1937e+00 --1.2300e+03 1.3714e+03 4.2915e+00 --1.2300e+03 1.4000e+03 4.3870e+00 --1.2300e+03 1.4286e+03 4.4802e+00 --1.2300e+03 1.4571e+03 4.5711e+00 --1.2300e+03 1.4857e+03 4.6598e+00 --1.2300e+03 1.5143e+03 4.7464e+00 --1.2300e+03 1.5429e+03 4.8308e+00 --1.2300e+03 1.5714e+03 4.9131e+00 --1.2300e+03 1.6000e+03 4.9934e+00 --1.2300e+03 1.6286e+03 5.0717e+00 --1.2300e+03 1.6571e+03 5.1481e+00 --1.2300e+03 1.6857e+03 5.2226e+00 --1.2300e+03 1.7143e+03 5.2953e+00 --1.2300e+03 1.7429e+03 5.3662e+00 --1.2300e+03 1.7714e+03 5.4354e+00 --1.2300e+03 1.8000e+03 5.5029e+00 --1.2300e+03 1.8286e+03 5.5688e+00 --1.2300e+03 1.8571e+03 5.6331e+00 --1.2300e+03 1.8857e+03 5.6958e+00 --1.2300e+03 1.9143e+03 5.7571e+00 --1.2300e+03 1.9429e+03 5.8168e+00 --1.2300e+03 1.9714e+03 5.8752e+00 --1.2300e+03 2.0000e+03 5.9322e+00 --1.2000e+03 -2.0000e+03 5.8958e+00 --1.2000e+03 -1.9714e+03 5.8374e+00 --1.2000e+03 -1.9429e+03 5.7776e+00 --1.2000e+03 -1.9143e+03 5.7162e+00 --1.2000e+03 -1.8857e+03 5.6533e+00 --1.2000e+03 -1.8571e+03 5.5888e+00 --1.2000e+03 -1.8286e+03 5.5227e+00 --1.2000e+03 -1.8000e+03 5.4550e+00 --1.2000e+03 -1.7714e+03 5.3854e+00 --1.2000e+03 -1.7429e+03 5.3142e+00 --1.2000e+03 -1.7143e+03 5.2410e+00 --1.2000e+03 -1.6857e+03 5.1660e+00 --1.2000e+03 -1.6571e+03 5.0890e+00 --1.2000e+03 -1.6286e+03 5.0101e+00 --1.2000e+03 -1.6000e+03 4.9290e+00 --1.2000e+03 -1.5714e+03 4.8459e+00 --1.2000e+03 -1.5429e+03 4.7606e+00 --1.2000e+03 -1.5143e+03 4.6730e+00 --1.2000e+03 -1.4857e+03 4.5832e+00 --1.2000e+03 -1.4571e+03 4.4910e+00 --1.2000e+03 -1.4286e+03 4.3963e+00 --1.2000e+03 -1.4000e+03 4.2993e+00 --1.2000e+03 -1.3714e+03 4.1996e+00 --1.2000e+03 -1.3429e+03 4.0975e+00 --1.2000e+03 -1.3143e+03 3.9926e+00 --1.2000e+03 -1.2857e+03 3.8852e+00 --1.2000e+03 -1.2571e+03 3.7749e+00 --1.2000e+03 -1.2286e+03 3.6619e+00 --1.2000e+03 -1.2000e+03 3.5462e+00 --1.2000e+03 -1.1714e+03 3.4275e+00 --1.2000e+03 -1.1429e+03 3.3061e+00 --1.2000e+03 -1.1143e+03 3.1817e+00 --1.2000e+03 -1.0857e+03 3.0545e+00 --1.2000e+03 -1.0571e+03 2.9245e+00 --1.2000e+03 -1.0286e+03 2.7915e+00 --1.2000e+03 -1.0000e+03 2.6558e+00 --1.2000e+03 -9.7143e+02 2.5173e+00 --1.2000e+03 -9.4286e+02 2.3761e+00 --1.2000e+03 -9.1429e+02 2.2324e+00 --1.2000e+03 -8.8571e+02 2.0861e+00 --1.2000e+03 -8.5714e+02 1.9375e+00 --1.2000e+03 -8.2857e+02 1.7866e+00 --1.2000e+03 -8.0000e+02 1.6338e+00 --1.2000e+03 -7.7143e+02 1.4792e+00 --1.2000e+03 -7.4286e+02 1.3231e+00 --1.2000e+03 -7.1429e+02 1.1657e+00 --1.2000e+03 -6.8571e+02 1.0074e+00 --1.2000e+03 -6.5714e+02 8.4863e-01 --1.2000e+03 -6.2857e+02 6.8971e-01 --1.2000e+03 -6.0000e+02 5.3111e-01 --1.2000e+03 -5.7143e+02 3.7334e-01 --1.2000e+03 -5.4286e+02 2.1692e-01 --1.2000e+03 -5.1429e+02 6.2437e-02 --1.2000e+03 -4.8571e+02 -8.9501e-02 --1.2000e+03 -4.5714e+02 -2.3824e-01 --1.2000e+03 -4.2857e+02 -3.8310e-01 --1.2000e+03 -4.0000e+02 -5.2338e-01 --1.2000e+03 -3.7143e+02 -6.5834e-01 --1.2000e+03 -3.4286e+02 -7.8723e-01 --1.2000e+03 -3.1429e+02 -9.0932e-01 --1.2000e+03 -2.8571e+02 -1.0239e+00 --1.2000e+03 -2.5714e+02 -1.1301e+00 --1.2000e+03 -2.2857e+02 -1.2274e+00 --1.2000e+03 -2.0000e+02 -1.3149e+00 --1.2000e+03 -1.7143e+02 -1.3922e+00 --1.2000e+03 -1.4286e+02 -1.4587e+00 --1.2000e+03 -1.1429e+02 -1.5138e+00 --1.2000e+03 -8.5714e+01 -1.5571e+00 --1.2000e+03 -5.7143e+01 -1.5882e+00 --1.2000e+03 -2.8571e+01 -1.6070e+00 --1.2000e+03 0.0000e+00 -1.6133e+00 --1.2000e+03 2.8571e+01 -1.6070e+00 --1.2000e+03 5.7143e+01 -1.5882e+00 --1.2000e+03 8.5714e+01 -1.5571e+00 --1.2000e+03 1.1429e+02 -1.5138e+00 --1.2000e+03 1.4286e+02 -1.4587e+00 --1.2000e+03 1.7143e+02 -1.3922e+00 --1.2000e+03 2.0000e+02 -1.3149e+00 --1.2000e+03 2.2857e+02 -1.2274e+00 --1.2000e+03 2.5714e+02 -1.1301e+00 --1.2000e+03 2.8571e+02 -1.0239e+00 --1.2000e+03 3.1429e+02 -9.0932e-01 --1.2000e+03 3.4286e+02 -7.8723e-01 --1.2000e+03 3.7143e+02 -6.5834e-01 --1.2000e+03 4.0000e+02 -5.2338e-01 --1.2000e+03 4.2857e+02 -3.8310e-01 --1.2000e+03 4.5714e+02 -2.3824e-01 --1.2000e+03 4.8571e+02 -8.9501e-02 --1.2000e+03 5.1429e+02 6.2437e-02 --1.2000e+03 5.4286e+02 2.1692e-01 --1.2000e+03 5.7143e+02 3.7334e-01 --1.2000e+03 6.0000e+02 5.3111e-01 --1.2000e+03 6.2857e+02 6.8971e-01 --1.2000e+03 6.5714e+02 8.4863e-01 --1.2000e+03 6.8571e+02 1.0074e+00 --1.2000e+03 7.1429e+02 1.1657e+00 --1.2000e+03 7.4286e+02 1.3231e+00 --1.2000e+03 7.7143e+02 1.4792e+00 --1.2000e+03 8.0000e+02 1.6338e+00 --1.2000e+03 8.2857e+02 1.7866e+00 --1.2000e+03 8.5714e+02 1.9375e+00 --1.2000e+03 8.8571e+02 2.0861e+00 --1.2000e+03 9.1429e+02 2.2324e+00 --1.2000e+03 9.4286e+02 2.3761e+00 --1.2000e+03 9.7143e+02 2.5173e+00 --1.2000e+03 1.0000e+03 2.6558e+00 --1.2000e+03 1.0286e+03 2.7915e+00 --1.2000e+03 1.0571e+03 2.9245e+00 --1.2000e+03 1.0857e+03 3.0545e+00 --1.2000e+03 1.1143e+03 3.1817e+00 --1.2000e+03 1.1429e+03 3.3061e+00 --1.2000e+03 1.1714e+03 3.4275e+00 --1.2000e+03 1.2000e+03 3.5462e+00 --1.2000e+03 1.2286e+03 3.6619e+00 --1.2000e+03 1.2571e+03 3.7749e+00 --1.2000e+03 1.2857e+03 3.8852e+00 --1.2000e+03 1.3143e+03 3.9926e+00 --1.2000e+03 1.3429e+03 4.0975e+00 --1.2000e+03 1.3714e+03 4.1996e+00 --1.2000e+03 1.4000e+03 4.2993e+00 --1.2000e+03 1.4286e+03 4.3963e+00 --1.2000e+03 1.4571e+03 4.4910e+00 --1.2000e+03 1.4857e+03 4.5832e+00 --1.2000e+03 1.5143e+03 4.6730e+00 --1.2000e+03 1.5429e+03 4.7606e+00 --1.2000e+03 1.5714e+03 4.8459e+00 --1.2000e+03 1.6000e+03 4.9290e+00 --1.2000e+03 1.6286e+03 5.0101e+00 --1.2000e+03 1.6571e+03 5.0890e+00 --1.2000e+03 1.6857e+03 5.1660e+00 --1.2000e+03 1.7143e+03 5.2410e+00 --1.2000e+03 1.7429e+03 5.3142e+00 --1.2000e+03 1.7714e+03 5.3854e+00 --1.2000e+03 1.8000e+03 5.4550e+00 --1.2000e+03 1.8286e+03 5.5227e+00 --1.2000e+03 1.8571e+03 5.5888e+00 --1.2000e+03 1.8857e+03 5.6533e+00 --1.2000e+03 1.9143e+03 5.7162e+00 --1.2000e+03 1.9429e+03 5.7776e+00 --1.2000e+03 1.9714e+03 5.8374e+00 --1.2000e+03 2.0000e+03 5.8958e+00 --1.1700e+03 -2.0000e+03 5.8595e+00 --1.1700e+03 -1.9714e+03 5.7996e+00 --1.1700e+03 -1.9429e+03 5.7382e+00 --1.1700e+03 -1.9143e+03 5.6753e+00 --1.1700e+03 -1.8857e+03 5.6107e+00 --1.1700e+03 -1.8571e+03 5.5445e+00 --1.1700e+03 -1.8286e+03 5.4766e+00 --1.1700e+03 -1.8000e+03 5.4068e+00 --1.1700e+03 -1.7714e+03 5.3353e+00 --1.1700e+03 -1.7429e+03 5.2618e+00 --1.1700e+03 -1.7143e+03 5.1864e+00 --1.1700e+03 -1.6857e+03 5.1090e+00 --1.1700e+03 -1.6571e+03 5.0295e+00 --1.1700e+03 -1.6286e+03 4.9479e+00 --1.1700e+03 -1.6000e+03 4.8641e+00 --1.1700e+03 -1.5714e+03 4.7780e+00 --1.1700e+03 -1.5429e+03 4.6896e+00 --1.1700e+03 -1.5143e+03 4.5988e+00 --1.1700e+03 -1.4857e+03 4.5055e+00 --1.1700e+03 -1.4571e+03 4.4096e+00 --1.1700e+03 -1.4286e+03 4.3112e+00 --1.1700e+03 -1.4000e+03 4.2100e+00 --1.1700e+03 -1.3714e+03 4.1061e+00 --1.1700e+03 -1.3429e+03 3.9994e+00 --1.1700e+03 -1.3143e+03 3.8899e+00 --1.1700e+03 -1.2857e+03 3.7773e+00 --1.1700e+03 -1.2571e+03 3.6618e+00 --1.1700e+03 -1.2286e+03 3.5432e+00 --1.1700e+03 -1.2000e+03 3.4215e+00 --1.1700e+03 -1.1714e+03 3.2967e+00 --1.1700e+03 -1.1429e+03 3.1686e+00 --1.1700e+03 -1.1143e+03 3.0374e+00 --1.1700e+03 -1.0857e+03 2.9029e+00 --1.1700e+03 -1.0571e+03 2.7651e+00 --1.1700e+03 -1.0286e+03 2.6241e+00 --1.1700e+03 -1.0000e+03 2.4799e+00 --1.1700e+03 -9.7143e+02 2.3324e+00 --1.1700e+03 -9.4286e+02 2.1819e+00 --1.1700e+03 -9.1429e+02 2.0282e+00 --1.1700e+03 -8.8571e+02 1.8716e+00 --1.1700e+03 -8.5714e+02 1.7122e+00 --1.1700e+03 -8.2857e+02 1.5501e+00 --1.1700e+03 -8.0000e+02 1.3855e+00 --1.1700e+03 -7.7143e+02 1.2187e+00 --1.1700e+03 -7.4286e+02 1.0498e+00 --1.1700e+03 -7.1429e+02 8.7926e-01 --1.1700e+03 -6.8571e+02 7.0736e-01 --1.1700e+03 -6.5714e+02 5.3451e-01 --1.1700e+03 -6.2857e+02 3.6115e-01 --1.1700e+03 -6.0000e+02 1.8776e-01 --1.1700e+03 -5.7143e+02 1.4889e-02 --1.1700e+03 -5.4286e+02 -1.5687e-01 --1.1700e+03 -5.1429e+02 -3.2688e-01 --1.1700e+03 -4.8571e+02 -4.9444e-01 --1.1700e+03 -4.5714e+02 -6.5883e-01 --1.1700e+03 -4.2857e+02 -8.1927e-01 --1.1700e+03 -4.0000e+02 -9.7493e-01 --1.1700e+03 -3.7143e+02 -1.1250e+00 --1.1700e+03 -3.4286e+02 -1.2686e+00 --1.1700e+03 -3.1429e+02 -1.4048e+00 --1.1700e+03 -2.8571e+02 -1.5329e+00 --1.1700e+03 -2.5714e+02 -1.6518e+00 --1.1700e+03 -2.2857e+02 -1.7609e+00 --1.1700e+03 -2.0000e+02 -1.8592e+00 --1.1700e+03 -1.7143e+02 -1.9461e+00 --1.1700e+03 -1.4286e+02 -2.0209e+00 --1.1700e+03 -1.1429e+02 -2.0829e+00 --1.1700e+03 -8.5714e+01 -2.1317e+00 --1.1700e+03 -5.7143e+01 -2.1669e+00 --1.1700e+03 -2.8571e+01 -2.1881e+00 --1.1700e+03 0.0000e+00 -2.1952e+00 --1.1700e+03 2.8571e+01 -2.1881e+00 --1.1700e+03 5.7143e+01 -2.1669e+00 --1.1700e+03 8.5714e+01 -2.1317e+00 --1.1700e+03 1.1429e+02 -2.0829e+00 --1.1700e+03 1.4286e+02 -2.0209e+00 --1.1700e+03 1.7143e+02 -1.9461e+00 --1.1700e+03 2.0000e+02 -1.8592e+00 --1.1700e+03 2.2857e+02 -1.7609e+00 --1.1700e+03 2.5714e+02 -1.6518e+00 --1.1700e+03 2.8571e+02 -1.5329e+00 --1.1700e+03 3.1429e+02 -1.4048e+00 --1.1700e+03 3.4286e+02 -1.2686e+00 --1.1700e+03 3.7143e+02 -1.1250e+00 --1.1700e+03 4.0000e+02 -9.7493e-01 --1.1700e+03 4.2857e+02 -8.1927e-01 --1.1700e+03 4.5714e+02 -6.5883e-01 --1.1700e+03 4.8571e+02 -4.9444e-01 --1.1700e+03 5.1429e+02 -3.2688e-01 --1.1700e+03 5.4286e+02 -1.5687e-01 --1.1700e+03 5.7143e+02 1.4889e-02 --1.1700e+03 6.0000e+02 1.8776e-01 --1.1700e+03 6.2857e+02 3.6115e-01 --1.1700e+03 6.5714e+02 5.3451e-01 --1.1700e+03 6.8571e+02 7.0736e-01 --1.1700e+03 7.1429e+02 8.7926e-01 --1.1700e+03 7.4286e+02 1.0498e+00 --1.1700e+03 7.7143e+02 1.2187e+00 --1.1700e+03 8.0000e+02 1.3855e+00 --1.1700e+03 8.2857e+02 1.5501e+00 --1.1700e+03 8.5714e+02 1.7122e+00 --1.1700e+03 8.8571e+02 1.8716e+00 --1.1700e+03 9.1429e+02 2.0282e+00 --1.1700e+03 9.4286e+02 2.1819e+00 --1.1700e+03 9.7143e+02 2.3324e+00 --1.1700e+03 1.0000e+03 2.4799e+00 --1.1700e+03 1.0286e+03 2.6241e+00 --1.1700e+03 1.0571e+03 2.7651e+00 --1.1700e+03 1.0857e+03 2.9029e+00 --1.1700e+03 1.1143e+03 3.0374e+00 --1.1700e+03 1.1429e+03 3.1686e+00 --1.1700e+03 1.1714e+03 3.2967e+00 --1.1700e+03 1.2000e+03 3.4215e+00 --1.1700e+03 1.2286e+03 3.5432e+00 --1.1700e+03 1.2571e+03 3.6618e+00 --1.1700e+03 1.2857e+03 3.7773e+00 --1.1700e+03 1.3143e+03 3.8899e+00 --1.1700e+03 1.3429e+03 3.9994e+00 --1.1700e+03 1.3714e+03 4.1061e+00 --1.1700e+03 1.4000e+03 4.2100e+00 --1.1700e+03 1.4286e+03 4.3112e+00 --1.1700e+03 1.4571e+03 4.4096e+00 --1.1700e+03 1.4857e+03 4.5055e+00 --1.1700e+03 1.5143e+03 4.5988e+00 --1.1700e+03 1.5429e+03 4.6896e+00 --1.1700e+03 1.5714e+03 4.7780e+00 --1.1700e+03 1.6000e+03 4.8641e+00 --1.1700e+03 1.6286e+03 4.9479e+00 --1.1700e+03 1.6571e+03 5.0295e+00 --1.1700e+03 1.6857e+03 5.1090e+00 --1.1700e+03 1.7143e+03 5.1864e+00 --1.1700e+03 1.7429e+03 5.2618e+00 --1.1700e+03 1.7714e+03 5.3353e+00 --1.1700e+03 1.8000e+03 5.4068e+00 --1.1700e+03 1.8286e+03 5.4766e+00 --1.1700e+03 1.8571e+03 5.5445e+00 --1.1700e+03 1.8857e+03 5.6107e+00 --1.1700e+03 1.9143e+03 5.6753e+00 --1.1700e+03 1.9429e+03 5.7382e+00 --1.1700e+03 1.9714e+03 5.7996e+00 --1.1700e+03 2.0000e+03 5.8595e+00 --1.1400e+03 -2.0000e+03 5.8232e+00 --1.1400e+03 -1.9714e+03 5.7619e+00 --1.1400e+03 -1.9429e+03 5.6990e+00 --1.1400e+03 -1.9143e+03 5.6344e+00 --1.1400e+03 -1.8857e+03 5.5681e+00 --1.1400e+03 -1.8571e+03 5.5001e+00 --1.1400e+03 -1.8286e+03 5.4303e+00 --1.1400e+03 -1.8000e+03 5.3586e+00 --1.1400e+03 -1.7714e+03 5.2849e+00 --1.1400e+03 -1.7429e+03 5.2093e+00 --1.1400e+03 -1.7143e+03 5.1316e+00 --1.1400e+03 -1.6857e+03 5.0517e+00 --1.1400e+03 -1.6571e+03 4.9696e+00 --1.1400e+03 -1.6286e+03 4.8853e+00 --1.1400e+03 -1.6000e+03 4.7986e+00 --1.1400e+03 -1.5714e+03 4.7095e+00 --1.1400e+03 -1.5429e+03 4.6179e+00 --1.1400e+03 -1.5143e+03 4.5237e+00 --1.1400e+03 -1.4857e+03 4.4268e+00 --1.1400e+03 -1.4571e+03 4.3272e+00 --1.1400e+03 -1.4286e+03 4.2247e+00 --1.1400e+03 -1.4000e+03 4.1194e+00 --1.1400e+03 -1.3714e+03 4.0110e+00 --1.1400e+03 -1.3429e+03 3.8996e+00 --1.1400e+03 -1.3143e+03 3.7851e+00 --1.1400e+03 -1.2857e+03 3.6673e+00 --1.1400e+03 -1.2571e+03 3.5462e+00 --1.1400e+03 -1.2286e+03 3.4217e+00 --1.1400e+03 -1.2000e+03 3.2938e+00 --1.1400e+03 -1.1714e+03 3.1623e+00 --1.1400e+03 -1.1429e+03 3.0273e+00 --1.1400e+03 -1.1143e+03 2.8887e+00 --1.1400e+03 -1.0857e+03 2.7464e+00 --1.1400e+03 -1.0571e+03 2.6004e+00 --1.1400e+03 -1.0286e+03 2.4508e+00 --1.1400e+03 -1.0000e+03 2.2974e+00 --1.1400e+03 -9.7143e+02 2.1403e+00 --1.1400e+03 -9.4286e+02 1.9796e+00 --1.1400e+03 -9.1429e+02 1.8153e+00 --1.1400e+03 -8.8571e+02 1.6475e+00 --1.1400e+03 -8.5714e+02 1.4764e+00 --1.1400e+03 -8.2857e+02 1.3019e+00 --1.1400e+03 -8.0000e+02 1.1244e+00 --1.1400e+03 -7.7143e+02 9.4412e-01 --1.1400e+03 -7.4286e+02 7.6124e-01 --1.1400e+03 -7.1429e+02 5.7610e-01 --1.1400e+03 -6.8571e+02 3.8906e-01 --1.1400e+03 -6.5714e+02 2.0055e-01 --1.1400e+03 -6.2857e+02 1.1040e-02 --1.1400e+03 -6.0000e+02 -1.7895e-01 --1.1400e+03 -5.7143e+02 -3.6881e-01 --1.1400e+03 -5.4286e+02 -5.5791e-01 --1.1400e+03 -5.1429e+02 -7.4551e-01 --1.1400e+03 -4.8571e+02 -9.3085e-01 --1.1400e+03 -4.5714e+02 -1.1131e+00 --1.1400e+03 -4.2857e+02 -1.2914e+00 --1.1400e+03 -4.0000e+02 -1.4647e+00 --1.1400e+03 -3.7143e+02 -1.6322e+00 --1.1400e+03 -3.4286e+02 -1.7927e+00 --1.1400e+03 -3.1429e+02 -1.9454e+00 --1.1400e+03 -2.8571e+02 -2.0891e+00 --1.1400e+03 -2.5714e+02 -2.2229e+00 --1.1400e+03 -2.2857e+02 -2.3457e+00 --1.1400e+03 -2.0000e+02 -2.4566e+00 --1.1400e+03 -1.7143e+02 -2.5548e+00 --1.1400e+03 -1.4286e+02 -2.6393e+00 --1.1400e+03 -1.1429e+02 -2.7095e+00 --1.1400e+03 -8.5714e+01 -2.7648e+00 --1.1400e+03 -5.7143e+01 -2.8046e+00 --1.1400e+03 -2.8571e+01 -2.8287e+00 --1.1400e+03 0.0000e+00 -2.8367e+00 --1.1400e+03 2.8571e+01 -2.8287e+00 --1.1400e+03 5.7143e+01 -2.8046e+00 --1.1400e+03 8.5714e+01 -2.7648e+00 --1.1400e+03 1.1429e+02 -2.7095e+00 --1.1400e+03 1.4286e+02 -2.6393e+00 --1.1400e+03 1.7143e+02 -2.5548e+00 --1.1400e+03 2.0000e+02 -2.4566e+00 --1.1400e+03 2.2857e+02 -2.3457e+00 --1.1400e+03 2.5714e+02 -2.2229e+00 --1.1400e+03 2.8571e+02 -2.0891e+00 --1.1400e+03 3.1429e+02 -1.9454e+00 --1.1400e+03 3.4286e+02 -1.7927e+00 --1.1400e+03 3.7143e+02 -1.6322e+00 --1.1400e+03 4.0000e+02 -1.4647e+00 --1.1400e+03 4.2857e+02 -1.2914e+00 --1.1400e+03 4.5714e+02 -1.1131e+00 --1.1400e+03 4.8571e+02 -9.3085e-01 --1.1400e+03 5.1429e+02 -7.4551e-01 --1.1400e+03 5.4286e+02 -5.5791e-01 --1.1400e+03 5.7143e+02 -3.6881e-01 --1.1400e+03 6.0000e+02 -1.7895e-01 --1.1400e+03 6.2857e+02 1.1040e-02 --1.1400e+03 6.5714e+02 2.0055e-01 --1.1400e+03 6.8571e+02 3.8906e-01 --1.1400e+03 7.1429e+02 5.7610e-01 --1.1400e+03 7.4286e+02 7.6124e-01 --1.1400e+03 7.7143e+02 9.4412e-01 --1.1400e+03 8.0000e+02 1.1244e+00 --1.1400e+03 8.2857e+02 1.3019e+00 --1.1400e+03 8.5714e+02 1.4764e+00 --1.1400e+03 8.8571e+02 1.6475e+00 --1.1400e+03 9.1429e+02 1.8153e+00 --1.1400e+03 9.4286e+02 1.9796e+00 --1.1400e+03 9.7143e+02 2.1403e+00 --1.1400e+03 1.0000e+03 2.2974e+00 --1.1400e+03 1.0286e+03 2.4508e+00 --1.1400e+03 1.0571e+03 2.6004e+00 --1.1400e+03 1.0857e+03 2.7464e+00 --1.1400e+03 1.1143e+03 2.8887e+00 --1.1400e+03 1.1429e+03 3.0273e+00 --1.1400e+03 1.1714e+03 3.1623e+00 --1.1400e+03 1.2000e+03 3.2938e+00 --1.1400e+03 1.2286e+03 3.4217e+00 --1.1400e+03 1.2571e+03 3.5462e+00 --1.1400e+03 1.2857e+03 3.6673e+00 --1.1400e+03 1.3143e+03 3.7851e+00 --1.1400e+03 1.3429e+03 3.8996e+00 --1.1400e+03 1.3714e+03 4.0110e+00 --1.1400e+03 1.4000e+03 4.1194e+00 --1.1400e+03 1.4286e+03 4.2247e+00 --1.1400e+03 1.4571e+03 4.3272e+00 --1.1400e+03 1.4857e+03 4.4268e+00 --1.1400e+03 1.5143e+03 4.5237e+00 --1.1400e+03 1.5429e+03 4.6179e+00 --1.1400e+03 1.5714e+03 4.7095e+00 --1.1400e+03 1.6000e+03 4.7986e+00 --1.1400e+03 1.6286e+03 4.8853e+00 --1.1400e+03 1.6571e+03 4.9696e+00 --1.1400e+03 1.6857e+03 5.0517e+00 --1.1400e+03 1.7143e+03 5.1316e+00 --1.1400e+03 1.7429e+03 5.2093e+00 --1.1400e+03 1.7714e+03 5.2849e+00 --1.1400e+03 1.8000e+03 5.3586e+00 --1.1400e+03 1.8286e+03 5.4303e+00 --1.1400e+03 1.8571e+03 5.5001e+00 --1.1400e+03 1.8857e+03 5.5681e+00 --1.1400e+03 1.9143e+03 5.6344e+00 --1.1400e+03 1.9429e+03 5.6990e+00 --1.1400e+03 1.9714e+03 5.7619e+00 --1.1400e+03 2.0000e+03 5.8232e+00 --1.1100e+03 -2.0000e+03 5.7870e+00 --1.1100e+03 -1.9714e+03 5.7242e+00 --1.1100e+03 -1.9429e+03 5.6597e+00 --1.1100e+03 -1.9143e+03 5.5935e+00 --1.1100e+03 -1.8857e+03 5.5255e+00 --1.1100e+03 -1.8571e+03 5.4557e+00 --1.1100e+03 -1.8286e+03 5.3839e+00 --1.1100e+03 -1.8000e+03 5.3102e+00 --1.1100e+03 -1.7714e+03 5.2344e+00 --1.1100e+03 -1.7429e+03 5.1565e+00 --1.1100e+03 -1.7143e+03 5.0764e+00 --1.1100e+03 -1.6857e+03 4.9941e+00 --1.1100e+03 -1.6571e+03 4.9094e+00 --1.1100e+03 -1.6286e+03 4.8223e+00 --1.1100e+03 -1.6000e+03 4.7326e+00 --1.1100e+03 -1.5714e+03 4.6404e+00 --1.1100e+03 -1.5429e+03 4.5455e+00 --1.1100e+03 -1.5143e+03 4.4478e+00 --1.1100e+03 -1.4857e+03 4.3472e+00 --1.1100e+03 -1.4571e+03 4.2437e+00 --1.1100e+03 -1.4286e+03 4.1371e+00 --1.1100e+03 -1.4000e+03 4.0274e+00 --1.1100e+03 -1.3714e+03 3.9144e+00 --1.1100e+03 -1.3429e+03 3.7981e+00 --1.1100e+03 -1.3143e+03 3.6783e+00 --1.1100e+03 -1.2857e+03 3.5550e+00 --1.1100e+03 -1.2571e+03 3.4280e+00 --1.1100e+03 -1.2286e+03 3.2973e+00 --1.1100e+03 -1.2000e+03 3.1628e+00 --1.1100e+03 -1.1714e+03 3.0244e+00 --1.1100e+03 -1.1429e+03 2.8821e+00 --1.1100e+03 -1.1143e+03 2.7356e+00 --1.1100e+03 -1.0857e+03 2.5851e+00 --1.1100e+03 -1.0571e+03 2.4303e+00 --1.1100e+03 -1.0286e+03 2.2714e+00 --1.1100e+03 -1.0000e+03 2.1082e+00 --1.1100e+03 -9.7143e+02 1.9408e+00 --1.1100e+03 -9.4286e+02 1.7691e+00 --1.1100e+03 -9.1429e+02 1.5933e+00 --1.1100e+03 -8.8571e+02 1.4133e+00 --1.1100e+03 -8.5714e+02 1.2293e+00 --1.1100e+03 -8.2857e+02 1.0414e+00 --1.1100e+03 -8.0000e+02 8.4975e-01 --1.1100e+03 -7.7143e+02 6.5461e-01 --1.1100e+03 -7.4286e+02 4.5622e-01 --1.1100e+03 -7.1429e+02 2.5490e-01 --1.1100e+03 -6.8571e+02 5.1018e-02 --1.1100e+03 -6.5714e+02 -1.5498e-01 --1.1100e+03 -6.2857e+02 -3.6260e-01 --1.1100e+03 -6.0000e+02 -5.7126e-01 --1.1100e+03 -5.7143e+02 -7.8032e-01 --1.1100e+03 -5.4286e+02 -9.8905e-01 --1.1100e+03 -5.1429e+02 -1.1967e+00 --1.1100e+03 -4.8571e+02 -1.4023e+00 --1.1100e+03 -4.5714e+02 -1.6050e+00 --1.1100e+03 -4.2857e+02 -1.8038e+00 --1.1100e+03 -4.0000e+02 -1.9975e+00 --1.1100e+03 -3.7143e+02 -2.1851e+00 --1.1100e+03 -3.4286e+02 -2.3654e+00 --1.1100e+03 -3.1429e+02 -2.5372e+00 --1.1100e+03 -2.8571e+02 -2.6992e+00 --1.1100e+03 -2.5714e+02 -2.8503e+00 --1.1100e+03 -2.2857e+02 -2.9893e+00 --1.1100e+03 -2.0000e+02 -3.1150e+00 --1.1100e+03 -1.7143e+02 -3.2264e+00 --1.1100e+03 -1.4286e+02 -3.3225e+00 --1.1100e+03 -1.1429e+02 -3.4024e+00 --1.1100e+03 -8.5714e+01 -3.4653e+00 --1.1100e+03 -5.7143e+01 -3.5107e+00 --1.1100e+03 -2.8571e+01 -3.5381e+00 --1.1100e+03 0.0000e+00 -3.5473e+00 --1.1100e+03 2.8571e+01 -3.5381e+00 --1.1100e+03 5.7143e+01 -3.5107e+00 --1.1100e+03 8.5714e+01 -3.4653e+00 --1.1100e+03 1.1429e+02 -3.4024e+00 --1.1100e+03 1.4286e+02 -3.3225e+00 --1.1100e+03 1.7143e+02 -3.2264e+00 --1.1100e+03 2.0000e+02 -3.1150e+00 --1.1100e+03 2.2857e+02 -2.9893e+00 --1.1100e+03 2.5714e+02 -2.8503e+00 --1.1100e+03 2.8571e+02 -2.6992e+00 --1.1100e+03 3.1429e+02 -2.5372e+00 --1.1100e+03 3.4286e+02 -2.3654e+00 --1.1100e+03 3.7143e+02 -2.1851e+00 --1.1100e+03 4.0000e+02 -1.9975e+00 --1.1100e+03 4.2857e+02 -1.8038e+00 --1.1100e+03 4.5714e+02 -1.6050e+00 --1.1100e+03 4.8571e+02 -1.4023e+00 --1.1100e+03 5.1429e+02 -1.1967e+00 --1.1100e+03 5.4286e+02 -9.8905e-01 --1.1100e+03 5.7143e+02 -7.8032e-01 --1.1100e+03 6.0000e+02 -5.7126e-01 --1.1100e+03 6.2857e+02 -3.6260e-01 --1.1100e+03 6.5714e+02 -1.5498e-01 --1.1100e+03 6.8571e+02 5.1018e-02 --1.1100e+03 7.1429e+02 2.5490e-01 --1.1100e+03 7.4286e+02 4.5622e-01 --1.1100e+03 7.7143e+02 6.5461e-01 --1.1100e+03 8.0000e+02 8.4975e-01 --1.1100e+03 8.2857e+02 1.0414e+00 --1.1100e+03 8.5714e+02 1.2293e+00 --1.1100e+03 8.8571e+02 1.4133e+00 --1.1100e+03 9.1429e+02 1.5933e+00 --1.1100e+03 9.4286e+02 1.7691e+00 --1.1100e+03 9.7143e+02 1.9408e+00 --1.1100e+03 1.0000e+03 2.1082e+00 --1.1100e+03 1.0286e+03 2.2714e+00 --1.1100e+03 1.0571e+03 2.4303e+00 --1.1100e+03 1.0857e+03 2.5851e+00 --1.1100e+03 1.1143e+03 2.7356e+00 --1.1100e+03 1.1429e+03 2.8821e+00 --1.1100e+03 1.1714e+03 3.0244e+00 --1.1100e+03 1.2000e+03 3.1628e+00 --1.1100e+03 1.2286e+03 3.2973e+00 --1.1100e+03 1.2571e+03 3.4280e+00 --1.1100e+03 1.2857e+03 3.5550e+00 --1.1100e+03 1.3143e+03 3.6783e+00 --1.1100e+03 1.3429e+03 3.7981e+00 --1.1100e+03 1.3714e+03 3.9144e+00 --1.1100e+03 1.4000e+03 4.0274e+00 --1.1100e+03 1.4286e+03 4.1371e+00 --1.1100e+03 1.4571e+03 4.2437e+00 --1.1100e+03 1.4857e+03 4.3472e+00 --1.1100e+03 1.5143e+03 4.4478e+00 --1.1100e+03 1.5429e+03 4.5455e+00 --1.1100e+03 1.5714e+03 4.6404e+00 --1.1100e+03 1.6000e+03 4.7326e+00 --1.1100e+03 1.6286e+03 4.8223e+00 --1.1100e+03 1.6571e+03 4.9094e+00 --1.1100e+03 1.6857e+03 4.9941e+00 --1.1100e+03 1.7143e+03 5.0764e+00 --1.1100e+03 1.7429e+03 5.1565e+00 --1.1100e+03 1.7714e+03 5.2344e+00 --1.1100e+03 1.8000e+03 5.3102e+00 --1.1100e+03 1.8286e+03 5.3839e+00 --1.1100e+03 1.8571e+03 5.4557e+00 --1.1100e+03 1.8857e+03 5.5255e+00 --1.1100e+03 1.9143e+03 5.5935e+00 --1.1100e+03 1.9429e+03 5.6597e+00 --1.1100e+03 1.9714e+03 5.7242e+00 --1.1100e+03 2.0000e+03 5.7870e+00 --1.0800e+03 -2.0000e+03 5.7510e+00 --1.0800e+03 -1.9714e+03 5.6866e+00 --1.0800e+03 -1.9429e+03 5.6206e+00 --1.0800e+03 -1.9143e+03 5.5527e+00 --1.0800e+03 -1.8857e+03 5.4830e+00 --1.0800e+03 -1.8571e+03 5.4113e+00 --1.0800e+03 -1.8286e+03 5.3376e+00 --1.0800e+03 -1.8000e+03 5.2618e+00 --1.0800e+03 -1.7714e+03 5.1838e+00 --1.0800e+03 -1.7429e+03 5.1037e+00 --1.0800e+03 -1.7143e+03 5.0212e+00 --1.0800e+03 -1.6857e+03 4.9362e+00 --1.0800e+03 -1.6571e+03 4.8488e+00 --1.0800e+03 -1.6286e+03 4.7588e+00 --1.0800e+03 -1.6000e+03 4.6662e+00 --1.0800e+03 -1.5714e+03 4.5707e+00 --1.0800e+03 -1.5429e+03 4.4724e+00 --1.0800e+03 -1.5143e+03 4.3711e+00 --1.0800e+03 -1.4857e+03 4.2667e+00 --1.0800e+03 -1.4571e+03 4.1592e+00 --1.0800e+03 -1.4286e+03 4.0483e+00 --1.0800e+03 -1.4000e+03 3.9340e+00 --1.0800e+03 -1.3714e+03 3.8162e+00 --1.0800e+03 -1.3429e+03 3.6948e+00 --1.0800e+03 -1.3143e+03 3.5695e+00 --1.0800e+03 -1.2857e+03 3.4405e+00 --1.0800e+03 -1.2571e+03 3.3074e+00 --1.0800e+03 -1.2286e+03 3.1702e+00 --1.0800e+03 -1.2000e+03 3.0287e+00 --1.0800e+03 -1.1714e+03 2.8830e+00 --1.0800e+03 -1.1429e+03 2.7328e+00 --1.0800e+03 -1.1143e+03 2.5780e+00 --1.0800e+03 -1.0857e+03 2.4187e+00 --1.0800e+03 -1.0571e+03 2.2546e+00 --1.0800e+03 -1.0286e+03 2.0857e+00 --1.0800e+03 -1.0000e+03 1.9120e+00 --1.0800e+03 -9.7143e+02 1.7334e+00 --1.0800e+03 -9.4286e+02 1.5499e+00 --1.0800e+03 -9.1429e+02 1.3616e+00 --1.0800e+03 -8.8571e+02 1.1684e+00 --1.0800e+03 -8.5714e+02 9.7037e-01 --1.0800e+03 -8.2857e+02 7.6771e-01 --1.0800e+03 -8.0000e+02 5.6054e-01 --1.0800e+03 -7.7143e+02 3.4905e-01 --1.0800e+03 -7.4286e+02 1.3351e-01 --1.0800e+03 -7.1429e+02 -8.5786e-02 --1.0800e+03 -6.8571e+02 -3.0845e-01 --1.0800e+03 -6.5714e+02 -5.3402e-01 --1.0800e+03 -6.2857e+02 -7.6197e-01 --1.0800e+03 -6.0000e+02 -9.9170e-01 --1.0800e+03 -5.7143e+02 -1.2225e+00 --1.0800e+03 -5.4286e+02 -1.4536e+00 --1.0800e+03 -5.1429e+02 -1.6840e+00 --1.0800e+03 -4.8571e+02 -1.9129e+00 --1.0800e+03 -4.5714e+02 -2.1392e+00 --1.0800e+03 -4.2857e+02 -2.3616e+00 --1.0800e+03 -4.0000e+02 -2.5790e+00 --1.0800e+03 -3.7143e+02 -2.7900e+00 --1.0800e+03 -3.4286e+02 -2.9933e+00 --1.0800e+03 -3.1429e+02 -3.1875e+00 --1.0800e+03 -2.8571e+02 -3.3710e+00 --1.0800e+03 -2.5714e+02 -3.5426e+00 --1.0800e+03 -2.2857e+02 -3.7006e+00 --1.0800e+03 -2.0000e+02 -3.8439e+00 --1.0800e+03 -1.7143e+02 -3.9710e+00 --1.0800e+03 -1.4286e+02 -4.0808e+00 --1.0800e+03 -1.1429e+02 -4.1722e+00 --1.0800e+03 -8.5714e+01 -4.2443e+00 --1.0800e+03 -5.7143e+01 -4.2963e+00 --1.0800e+03 -2.8571e+01 -4.3278e+00 --1.0800e+03 0.0000e+00 -4.3383e+00 --1.0800e+03 2.8571e+01 -4.3278e+00 --1.0800e+03 5.7143e+01 -4.2963e+00 --1.0800e+03 8.5714e+01 -4.2443e+00 --1.0800e+03 1.1429e+02 -4.1722e+00 --1.0800e+03 1.4286e+02 -4.0808e+00 --1.0800e+03 1.7143e+02 -3.9710e+00 --1.0800e+03 2.0000e+02 -3.8439e+00 --1.0800e+03 2.2857e+02 -3.7006e+00 --1.0800e+03 2.5714e+02 -3.5426e+00 --1.0800e+03 2.8571e+02 -3.3710e+00 --1.0800e+03 3.1429e+02 -3.1875e+00 --1.0800e+03 3.4286e+02 -2.9933e+00 --1.0800e+03 3.7143e+02 -2.7900e+00 --1.0800e+03 4.0000e+02 -2.5790e+00 --1.0800e+03 4.2857e+02 -2.3616e+00 --1.0800e+03 4.5714e+02 -2.1392e+00 --1.0800e+03 4.8571e+02 -1.9129e+00 --1.0800e+03 5.1429e+02 -1.6840e+00 --1.0800e+03 5.4286e+02 -1.4536e+00 --1.0800e+03 5.7143e+02 -1.2225e+00 --1.0800e+03 6.0000e+02 -9.9170e-01 --1.0800e+03 6.2857e+02 -7.6197e-01 --1.0800e+03 6.5714e+02 -5.3402e-01 --1.0800e+03 6.8571e+02 -3.0845e-01 --1.0800e+03 7.1429e+02 -8.5786e-02 --1.0800e+03 7.4286e+02 1.3351e-01 --1.0800e+03 7.7143e+02 3.4905e-01 --1.0800e+03 8.0000e+02 5.6054e-01 --1.0800e+03 8.2857e+02 7.6771e-01 --1.0800e+03 8.5714e+02 9.7037e-01 --1.0800e+03 8.8571e+02 1.1684e+00 --1.0800e+03 9.1429e+02 1.3616e+00 --1.0800e+03 9.4286e+02 1.5499e+00 --1.0800e+03 9.7143e+02 1.7334e+00 --1.0800e+03 1.0000e+03 1.9120e+00 --1.0800e+03 1.0286e+03 2.0857e+00 --1.0800e+03 1.0571e+03 2.2546e+00 --1.0800e+03 1.0857e+03 2.4187e+00 --1.0800e+03 1.1143e+03 2.5780e+00 --1.0800e+03 1.1429e+03 2.7328e+00 --1.0800e+03 1.1714e+03 2.8830e+00 --1.0800e+03 1.2000e+03 3.0287e+00 --1.0800e+03 1.2286e+03 3.1702e+00 --1.0800e+03 1.2571e+03 3.3074e+00 --1.0800e+03 1.2857e+03 3.4405e+00 --1.0800e+03 1.3143e+03 3.5695e+00 --1.0800e+03 1.3429e+03 3.6948e+00 --1.0800e+03 1.3714e+03 3.8162e+00 --1.0800e+03 1.4000e+03 3.9340e+00 --1.0800e+03 1.4286e+03 4.0483e+00 --1.0800e+03 1.4571e+03 4.1592e+00 --1.0800e+03 1.4857e+03 4.2667e+00 --1.0800e+03 1.5143e+03 4.3711e+00 --1.0800e+03 1.5429e+03 4.4724e+00 --1.0800e+03 1.5714e+03 4.5707e+00 --1.0800e+03 1.6000e+03 4.6662e+00 --1.0800e+03 1.6286e+03 4.7588e+00 --1.0800e+03 1.6571e+03 4.8488e+00 --1.0800e+03 1.6857e+03 4.9362e+00 --1.0800e+03 1.7143e+03 5.0212e+00 --1.0800e+03 1.7429e+03 5.1037e+00 --1.0800e+03 1.7714e+03 5.1838e+00 --1.0800e+03 1.8000e+03 5.2618e+00 --1.0800e+03 1.8286e+03 5.3376e+00 --1.0800e+03 1.8571e+03 5.4113e+00 --1.0800e+03 1.8857e+03 5.4830e+00 --1.0800e+03 1.9143e+03 5.5527e+00 --1.0800e+03 1.9429e+03 5.6206e+00 --1.0800e+03 1.9714e+03 5.6866e+00 --1.0800e+03 2.0000e+03 5.7510e+00 --1.0500e+03 -2.0000e+03 5.7151e+00 --1.0500e+03 -1.9714e+03 5.6492e+00 --1.0500e+03 -1.9429e+03 5.5816e+00 --1.0500e+03 -1.9143e+03 5.5120e+00 --1.0500e+03 -1.8857e+03 5.4405e+00 --1.0500e+03 -1.8571e+03 5.3669e+00 --1.0500e+03 -1.8286e+03 5.2913e+00 --1.0500e+03 -1.8000e+03 5.2134e+00 --1.0500e+03 -1.7714e+03 5.1332e+00 --1.0500e+03 -1.7429e+03 5.0507e+00 --1.0500e+03 -1.7143e+03 4.9657e+00 --1.0500e+03 -1.6857e+03 4.8782e+00 --1.0500e+03 -1.6571e+03 4.7880e+00 --1.0500e+03 -1.6286e+03 4.6951e+00 --1.0500e+03 -1.6000e+03 4.5993e+00 --1.0500e+03 -1.5714e+03 4.5006e+00 --1.0500e+03 -1.5429e+03 4.3988e+00 --1.0500e+03 -1.5143e+03 4.2938e+00 --1.0500e+03 -1.4857e+03 4.1855e+00 --1.0500e+03 -1.4571e+03 4.0737e+00 --1.0500e+03 -1.4286e+03 3.9584e+00 --1.0500e+03 -1.4000e+03 3.8394e+00 --1.0500e+03 -1.3714e+03 3.7166e+00 --1.0500e+03 -1.3429e+03 3.5898e+00 --1.0500e+03 -1.3143e+03 3.4589e+00 --1.0500e+03 -1.2857e+03 3.3238e+00 --1.0500e+03 -1.2571e+03 3.1843e+00 --1.0500e+03 -1.2286e+03 3.0402e+00 --1.0500e+03 -1.2000e+03 2.8915e+00 --1.0500e+03 -1.1714e+03 2.7380e+00 --1.0500e+03 -1.1429e+03 2.5795e+00 --1.0500e+03 -1.1143e+03 2.4160e+00 --1.0500e+03 -1.0857e+03 2.2472e+00 --1.0500e+03 -1.0571e+03 2.0731e+00 --1.0500e+03 -1.0286e+03 1.8936e+00 --1.0500e+03 -1.0000e+03 1.7086e+00 --1.0500e+03 -9.7143e+02 1.5180e+00 --1.0500e+03 -9.4286e+02 1.3217e+00 --1.0500e+03 -9.1429e+02 1.1198e+00 --1.0500e+03 -8.8571e+02 9.1220e-01 --1.0500e+03 -8.5714e+02 6.9895e-01 --1.0500e+03 -8.2857e+02 4.8013e-01 --1.0500e+03 -8.0000e+02 2.5587e-01 --1.0500e+03 -7.7143e+02 2.6339e-02 --1.0500e+03 -7.4286e+02 -2.0822e-01 --1.0500e+03 -7.1429e+02 -4.4752e-01 --1.0500e+03 -6.8571e+02 -6.9116e-01 --1.0500e+03 -6.5714e+02 -9.3869e-01 --1.0500e+03 -6.2857e+02 -1.1896e+00 --1.0500e+03 -6.0000e+02 -1.4431e+00 --1.0500e+03 -5.7143e+02 -1.6986e+00 --1.0500e+03 -5.4286e+02 -1.9552e+00 --1.0500e+03 -5.1429e+02 -2.2118e+00 --1.0500e+03 -4.8571e+02 -2.4675e+00 --1.0500e+03 -4.5714e+02 -2.7209e+00 --1.0500e+03 -4.2857e+02 -2.9708e+00 --1.0500e+03 -4.0000e+02 -3.2157e+00 --1.0500e+03 -3.7143e+02 -3.4541e+00 --1.0500e+03 -3.4286e+02 -3.6844e+00 --1.0500e+03 -3.1429e+02 -3.9049e+00 --1.0500e+03 -2.8571e+02 -4.1139e+00 --1.0500e+03 -2.5714e+02 -4.3097e+00 --1.0500e+03 -2.2857e+02 -4.4905e+00 --1.0500e+03 -2.0000e+02 -4.6547e+00 --1.0500e+03 -1.7143e+02 -4.8006e+00 --1.0500e+03 -1.4286e+02 -4.9268e+00 --1.0500e+03 -1.1429e+02 -5.0320e+00 --1.0500e+03 -8.5714e+01 -5.1151e+00 --1.0500e+03 -5.7143e+01 -5.1751e+00 --1.0500e+03 -2.8571e+01 -5.2114e+00 --1.0500e+03 0.0000e+00 -5.2235e+00 --1.0500e+03 2.8571e+01 -5.2114e+00 --1.0500e+03 5.7143e+01 -5.1751e+00 --1.0500e+03 8.5714e+01 -5.1151e+00 --1.0500e+03 1.1429e+02 -5.0320e+00 --1.0500e+03 1.4286e+02 -4.9268e+00 --1.0500e+03 1.7143e+02 -4.8006e+00 --1.0500e+03 2.0000e+02 -4.6547e+00 --1.0500e+03 2.2857e+02 -4.4905e+00 --1.0500e+03 2.5714e+02 -4.3097e+00 --1.0500e+03 2.8571e+02 -4.1139e+00 --1.0500e+03 3.1429e+02 -3.9049e+00 --1.0500e+03 3.4286e+02 -3.6844e+00 --1.0500e+03 3.7143e+02 -3.4541e+00 --1.0500e+03 4.0000e+02 -3.2157e+00 --1.0500e+03 4.2857e+02 -2.9708e+00 --1.0500e+03 4.5714e+02 -2.7209e+00 --1.0500e+03 4.8571e+02 -2.4675e+00 --1.0500e+03 5.1429e+02 -2.2118e+00 --1.0500e+03 5.4286e+02 -1.9552e+00 --1.0500e+03 5.7143e+02 -1.6986e+00 --1.0500e+03 6.0000e+02 -1.4431e+00 --1.0500e+03 6.2857e+02 -1.1896e+00 --1.0500e+03 6.5714e+02 -9.3869e-01 --1.0500e+03 6.8571e+02 -6.9116e-01 --1.0500e+03 7.1429e+02 -4.4752e-01 --1.0500e+03 7.4286e+02 -2.0822e-01 --1.0500e+03 7.7143e+02 2.6339e-02 --1.0500e+03 8.0000e+02 2.5587e-01 --1.0500e+03 8.2857e+02 4.8013e-01 --1.0500e+03 8.5714e+02 6.9895e-01 --1.0500e+03 8.8571e+02 9.1220e-01 --1.0500e+03 9.1429e+02 1.1198e+00 --1.0500e+03 9.4286e+02 1.3217e+00 --1.0500e+03 9.7143e+02 1.5180e+00 --1.0500e+03 1.0000e+03 1.7086e+00 --1.0500e+03 1.0286e+03 1.8936e+00 --1.0500e+03 1.0571e+03 2.0731e+00 --1.0500e+03 1.0857e+03 2.2472e+00 --1.0500e+03 1.1143e+03 2.4160e+00 --1.0500e+03 1.1429e+03 2.5795e+00 --1.0500e+03 1.1714e+03 2.7380e+00 --1.0500e+03 1.2000e+03 2.8915e+00 --1.0500e+03 1.2286e+03 3.0402e+00 --1.0500e+03 1.2571e+03 3.1843e+00 --1.0500e+03 1.2857e+03 3.3238e+00 --1.0500e+03 1.3143e+03 3.4589e+00 --1.0500e+03 1.3429e+03 3.5898e+00 --1.0500e+03 1.3714e+03 3.7166e+00 --1.0500e+03 1.4000e+03 3.8394e+00 --1.0500e+03 1.4286e+03 3.9584e+00 --1.0500e+03 1.4571e+03 4.0737e+00 --1.0500e+03 1.4857e+03 4.1855e+00 --1.0500e+03 1.5143e+03 4.2938e+00 --1.0500e+03 1.5429e+03 4.3988e+00 --1.0500e+03 1.5714e+03 4.5006e+00 --1.0500e+03 1.6000e+03 4.5993e+00 --1.0500e+03 1.6286e+03 4.6951e+00 --1.0500e+03 1.6571e+03 4.7880e+00 --1.0500e+03 1.6857e+03 4.8782e+00 --1.0500e+03 1.7143e+03 4.9657e+00 --1.0500e+03 1.7429e+03 5.0507e+00 --1.0500e+03 1.7714e+03 5.1332e+00 --1.0500e+03 1.8000e+03 5.2134e+00 --1.0500e+03 1.8286e+03 5.2913e+00 --1.0500e+03 1.8571e+03 5.3669e+00 --1.0500e+03 1.8857e+03 5.4405e+00 --1.0500e+03 1.9143e+03 5.5120e+00 --1.0500e+03 1.9429e+03 5.5816e+00 --1.0500e+03 1.9714e+03 5.6492e+00 --1.0500e+03 2.0000e+03 5.7151e+00 --1.0200e+03 -2.0000e+03 5.6794e+00 --1.0200e+03 -1.9714e+03 5.6120e+00 --1.0200e+03 -1.9429e+03 5.5427e+00 --1.0200e+03 -1.9143e+03 5.4715e+00 --1.0200e+03 -1.8857e+03 5.3982e+00 --1.0200e+03 -1.8571e+03 5.3227e+00 --1.0200e+03 -1.8286e+03 5.2450e+00 --1.0200e+03 -1.8000e+03 5.1650e+00 --1.0200e+03 -1.7714e+03 5.0826e+00 --1.0200e+03 -1.7429e+03 4.9977e+00 --1.0200e+03 -1.7143e+03 4.9103e+00 --1.0200e+03 -1.6857e+03 4.8201e+00 --1.0200e+03 -1.6571e+03 4.7271e+00 --1.0200e+03 -1.6286e+03 4.6311e+00 --1.0200e+03 -1.6000e+03 4.5322e+00 --1.0200e+03 -1.5714e+03 4.4301e+00 --1.0200e+03 -1.5429e+03 4.3247e+00 --1.0200e+03 -1.5143e+03 4.2159e+00 --1.0200e+03 -1.4857e+03 4.1035e+00 --1.0200e+03 -1.4571e+03 3.9874e+00 --1.0200e+03 -1.4286e+03 3.8675e+00 --1.0200e+03 -1.4000e+03 3.7436e+00 --1.0200e+03 -1.3714e+03 3.6156e+00 --1.0200e+03 -1.3429e+03 3.4833e+00 --1.0200e+03 -1.3143e+03 3.3464e+00 --1.0200e+03 -1.2857e+03 3.2050e+00 --1.0200e+03 -1.2571e+03 3.0587e+00 --1.0200e+03 -1.2286e+03 2.9075e+00 --1.0200e+03 -1.2000e+03 2.7511e+00 --1.0200e+03 -1.1714e+03 2.5894e+00 --1.0200e+03 -1.1429e+03 2.4222e+00 --1.0200e+03 -1.1143e+03 2.2493e+00 --1.0200e+03 -1.0857e+03 2.0706e+00 --1.0200e+03 -1.0571e+03 1.8858e+00 --1.0200e+03 -1.0286e+03 1.6950e+00 --1.0200e+03 -1.0000e+03 1.4978e+00 --1.0200e+03 -9.7143e+02 1.2943e+00 --1.0200e+03 -9.4286e+02 1.0842e+00 --1.0200e+03 -9.1429e+02 8.6755e-01 --1.0200e+03 -8.8571e+02 6.4427e-01 --1.0200e+03 -8.5714e+02 4.1434e-01 --1.0200e+03 -8.2857e+02 1.7780e-01 --1.0200e+03 -8.0000e+02 -6.5281e-02 --1.0200e+03 -7.7143e+02 -3.1476e-01 --1.0200e+03 -7.4286e+02 -5.7042e-01 --1.0200e+03 -7.1429e+02 -8.3201e-01 --1.0200e+03 -6.8571e+02 -1.0991e+00 --1.0200e+03 -6.5714e+02 -1.3714e+00 --1.0200e+03 -6.2857e+02 -1.6481e+00 --1.0200e+03 -6.0000e+02 -1.9287e+00 --1.0200e+03 -5.7143e+02 -2.2123e+00 --1.0200e+03 -5.4286e+02 -2.4981e+00 --1.0200e+03 -5.1429e+02 -2.7848e+00 --1.0200e+03 -4.8571e+02 -3.0714e+00 --1.0200e+03 -4.5714e+02 -3.3564e+00 --1.0200e+03 -4.2857e+02 -3.6383e+00 --1.0200e+03 -4.0000e+02 -3.9154e+00 --1.0200e+03 -3.7143e+02 -4.1861e+00 --1.0200e+03 -3.4286e+02 -4.4482e+00 --1.0200e+03 -3.1429e+02 -4.7000e+00 --1.0200e+03 -2.8571e+02 -4.9393e+00 --1.0200e+03 -2.5714e+02 -5.1639e+00 --1.0200e+03 -2.2857e+02 -5.3719e+00 --1.0200e+03 -2.0000e+02 -5.5612e+00 --1.0200e+03 -1.7143e+02 -5.7298e+00 --1.0200e+03 -1.4286e+02 -5.8759e+00 --1.0200e+03 -1.1429e+02 -5.9978e+00 --1.0200e+03 -8.5714e+01 -6.0942e+00 --1.0200e+03 -5.7143e+01 -6.1639e+00 --1.0200e+03 -2.8571e+01 -6.2060e+00 --1.0200e+03 0.0000e+00 -6.2201e+00 --1.0200e+03 2.8571e+01 -6.2060e+00 --1.0200e+03 5.7143e+01 -6.1639e+00 --1.0200e+03 8.5714e+01 -6.0942e+00 --1.0200e+03 1.1429e+02 -5.9978e+00 --1.0200e+03 1.4286e+02 -5.8759e+00 --1.0200e+03 1.7143e+02 -5.7298e+00 --1.0200e+03 2.0000e+02 -5.5612e+00 --1.0200e+03 2.2857e+02 -5.3719e+00 --1.0200e+03 2.5714e+02 -5.1639e+00 --1.0200e+03 2.8571e+02 -4.9393e+00 --1.0200e+03 3.1429e+02 -4.7000e+00 --1.0200e+03 3.4286e+02 -4.4482e+00 --1.0200e+03 3.7143e+02 -4.1861e+00 --1.0200e+03 4.0000e+02 -3.9154e+00 --1.0200e+03 4.2857e+02 -3.6383e+00 --1.0200e+03 4.5714e+02 -3.3564e+00 --1.0200e+03 4.8571e+02 -3.0714e+00 --1.0200e+03 5.1429e+02 -2.7848e+00 --1.0200e+03 5.4286e+02 -2.4981e+00 --1.0200e+03 5.7143e+02 -2.2123e+00 --1.0200e+03 6.0000e+02 -1.9287e+00 --1.0200e+03 6.2857e+02 -1.6481e+00 --1.0200e+03 6.5714e+02 -1.3714e+00 --1.0200e+03 6.8571e+02 -1.0991e+00 --1.0200e+03 7.1429e+02 -8.3201e-01 --1.0200e+03 7.4286e+02 -5.7042e-01 --1.0200e+03 7.7143e+02 -3.1476e-01 --1.0200e+03 8.0000e+02 -6.5281e-02 --1.0200e+03 8.2857e+02 1.7780e-01 --1.0200e+03 8.5714e+02 4.1434e-01 --1.0200e+03 8.8571e+02 6.4427e-01 --1.0200e+03 9.1429e+02 8.6755e-01 --1.0200e+03 9.4286e+02 1.0842e+00 --1.0200e+03 9.7143e+02 1.2943e+00 --1.0200e+03 1.0000e+03 1.4978e+00 --1.0200e+03 1.0286e+03 1.6950e+00 --1.0200e+03 1.0571e+03 1.8858e+00 --1.0200e+03 1.0857e+03 2.0706e+00 --1.0200e+03 1.1143e+03 2.2493e+00 --1.0200e+03 1.1429e+03 2.4222e+00 --1.0200e+03 1.1714e+03 2.5894e+00 --1.0200e+03 1.2000e+03 2.7511e+00 --1.0200e+03 1.2286e+03 2.9075e+00 --1.0200e+03 1.2571e+03 3.0587e+00 --1.0200e+03 1.2857e+03 3.2050e+00 --1.0200e+03 1.3143e+03 3.3464e+00 --1.0200e+03 1.3429e+03 3.4833e+00 --1.0200e+03 1.3714e+03 3.6156e+00 --1.0200e+03 1.4000e+03 3.7436e+00 --1.0200e+03 1.4286e+03 3.8675e+00 --1.0200e+03 1.4571e+03 3.9874e+00 --1.0200e+03 1.4857e+03 4.1035e+00 --1.0200e+03 1.5143e+03 4.2159e+00 --1.0200e+03 1.5429e+03 4.3247e+00 --1.0200e+03 1.5714e+03 4.4301e+00 --1.0200e+03 1.6000e+03 4.5322e+00 --1.0200e+03 1.6286e+03 4.6311e+00 --1.0200e+03 1.6571e+03 4.7271e+00 --1.0200e+03 1.6857e+03 4.8201e+00 --1.0200e+03 1.7143e+03 4.9103e+00 --1.0200e+03 1.7429e+03 4.9977e+00 --1.0200e+03 1.7714e+03 5.0826e+00 --1.0200e+03 1.8000e+03 5.1650e+00 --1.0200e+03 1.8286e+03 5.2450e+00 --1.0200e+03 1.8571e+03 5.3227e+00 --1.0200e+03 1.8857e+03 5.3982e+00 --1.0200e+03 1.9143e+03 5.4715e+00 --1.0200e+03 1.9429e+03 5.5427e+00 --1.0200e+03 1.9714e+03 5.6120e+00 --1.0200e+03 2.0000e+03 5.6794e+00 --9.9000e+02 -2.0000e+03 5.6439e+00 --9.9000e+02 -1.9714e+03 5.5750e+00 --9.9000e+02 -1.9429e+03 5.5041e+00 --9.9000e+02 -1.9143e+03 5.4312e+00 --9.9000e+02 -1.8857e+03 5.3560e+00 --9.9000e+02 -1.8571e+03 5.2787e+00 --9.9000e+02 -1.8286e+03 5.1989e+00 --9.9000e+02 -1.8000e+03 5.1168e+00 --9.9000e+02 -1.7714e+03 5.0321e+00 --9.9000e+02 -1.7429e+03 4.9448e+00 --9.9000e+02 -1.7143e+03 4.8548e+00 --9.9000e+02 -1.6857e+03 4.7619e+00 --9.9000e+02 -1.6571e+03 4.6660e+00 --9.9000e+02 -1.6286e+03 4.5670e+00 --9.9000e+02 -1.6000e+03 4.4648e+00 --9.9000e+02 -1.5714e+03 4.3592e+00 --9.9000e+02 -1.5429e+03 4.2502e+00 --9.9000e+02 -1.5143e+03 4.1374e+00 --9.9000e+02 -1.4857e+03 4.0209e+00 --9.9000e+02 -1.4571e+03 3.9004e+00 --9.9000e+02 -1.4286e+03 3.7757e+00 --9.9000e+02 -1.4000e+03 3.6468e+00 --9.9000e+02 -1.3714e+03 3.5133e+00 --9.9000e+02 -1.3429e+03 3.3752e+00 --9.9000e+02 -1.3143e+03 3.2322e+00 --9.9000e+02 -1.2857e+03 3.0842e+00 --9.9000e+02 -1.2571e+03 2.9309e+00 --9.9000e+02 -1.2286e+03 2.7721e+00 --9.9000e+02 -1.2000e+03 2.6077e+00 --9.9000e+02 -1.1714e+03 2.4373e+00 --9.9000e+02 -1.1429e+03 2.2608e+00 --9.9000e+02 -1.1143e+03 2.0780e+00 --9.9000e+02 -1.0857e+03 1.8887e+00 --9.9000e+02 -1.0571e+03 1.6926e+00 --9.9000e+02 -1.0286e+03 1.4896e+00 --9.9000e+02 -1.0000e+03 1.2794e+00 --9.9000e+02 -9.7143e+02 1.0619e+00 --9.9000e+02 -9.4286e+02 8.3695e-01 --9.9000e+02 -9.1429e+02 6.0433e-01 --9.9000e+02 -8.8571e+02 3.6398e-01 --9.9000e+02 -8.5714e+02 1.1583e-01 --9.9000e+02 -8.2857e+02 -1.4017e-01 --9.9000e+02 -8.0000e+02 -4.0398e-01 --9.9000e+02 -7.7143e+02 -6.7552e-01 --9.9000e+02 -7.4286e+02 -9.5465e-01 --9.9000e+02 -7.1429e+02 -1.2411e+00 --9.9000e+02 -6.8571e+02 -1.5346e+00 --9.9000e+02 -6.5714e+02 -1.8346e+00 --9.9000e+02 -6.2857e+02 -2.1407e+00 --9.9000e+02 -6.0000e+02 -2.4521e+00 --9.9000e+02 -5.7143e+02 -2.7679e+00 --9.9000e+02 -5.4286e+02 -3.0871e+00 --9.9000e+02 -5.1429e+02 -3.4086e+00 --9.9000e+02 -4.8571e+02 -3.7311e+00 --9.9000e+02 -4.5714e+02 -4.0529e+00 --9.9000e+02 -4.2857e+02 -4.3723e+00 --9.9000e+02 -4.0000e+02 -4.6874e+00 --9.9000e+02 -3.7143e+02 -4.9961e+00 --9.9000e+02 -3.4286e+02 -5.2961e+00 --9.9000e+02 -3.1429e+02 -5.5852e+00 --9.9000e+02 -2.8571e+02 -5.8607e+00 --9.9000e+02 -2.5714e+02 -6.1201e+00 --9.9000e+02 -2.2857e+02 -6.3609e+00 --9.9000e+02 -2.0000e+02 -6.5806e+00 --9.9000e+02 -1.7143e+02 -6.7767e+00 --9.9000e+02 -1.4286e+02 -6.9469e+00 --9.9000e+02 -1.1429e+02 -7.0892e+00 --9.9000e+02 -8.5714e+01 -7.2019e+00 --9.9000e+02 -5.7143e+01 -7.2834e+00 --9.9000e+02 -2.8571e+01 -7.3327e+00 --9.9000e+02 0.0000e+00 -7.3493e+00 --9.9000e+02 2.8571e+01 -7.3327e+00 --9.9000e+02 5.7143e+01 -7.2834e+00 --9.9000e+02 8.5714e+01 -7.2019e+00 --9.9000e+02 1.1429e+02 -7.0892e+00 --9.9000e+02 1.4286e+02 -6.9469e+00 --9.9000e+02 1.7143e+02 -6.7767e+00 --9.9000e+02 2.0000e+02 -6.5806e+00 --9.9000e+02 2.2857e+02 -6.3609e+00 --9.9000e+02 2.5714e+02 -6.1201e+00 --9.9000e+02 2.8571e+02 -5.8607e+00 --9.9000e+02 3.1429e+02 -5.5852e+00 --9.9000e+02 3.4286e+02 -5.2961e+00 --9.9000e+02 3.7143e+02 -4.9961e+00 --9.9000e+02 4.0000e+02 -4.6874e+00 --9.9000e+02 4.2857e+02 -4.3723e+00 --9.9000e+02 4.5714e+02 -4.0529e+00 --9.9000e+02 4.8571e+02 -3.7311e+00 --9.9000e+02 5.1429e+02 -3.4086e+00 --9.9000e+02 5.4286e+02 -3.0871e+00 --9.9000e+02 5.7143e+02 -2.7679e+00 --9.9000e+02 6.0000e+02 -2.4521e+00 --9.9000e+02 6.2857e+02 -2.1407e+00 --9.9000e+02 6.5714e+02 -1.8346e+00 --9.9000e+02 6.8571e+02 -1.5346e+00 --9.9000e+02 7.1429e+02 -1.2411e+00 --9.9000e+02 7.4286e+02 -9.5465e-01 --9.9000e+02 7.7143e+02 -6.7552e-01 --9.9000e+02 8.0000e+02 -4.0398e-01 --9.9000e+02 8.2857e+02 -1.4017e-01 --9.9000e+02 8.5714e+02 1.1583e-01 --9.9000e+02 8.8571e+02 3.6398e-01 --9.9000e+02 9.1429e+02 6.0433e-01 --9.9000e+02 9.4286e+02 8.3695e-01 --9.9000e+02 9.7143e+02 1.0619e+00 --9.9000e+02 1.0000e+03 1.2794e+00 --9.9000e+02 1.0286e+03 1.4896e+00 --9.9000e+02 1.0571e+03 1.6926e+00 --9.9000e+02 1.0857e+03 1.8887e+00 --9.9000e+02 1.1143e+03 2.0780e+00 --9.9000e+02 1.1429e+03 2.2608e+00 --9.9000e+02 1.1714e+03 2.4373e+00 --9.9000e+02 1.2000e+03 2.6077e+00 --9.9000e+02 1.2286e+03 2.7721e+00 --9.9000e+02 1.2571e+03 2.9309e+00 --9.9000e+02 1.2857e+03 3.0842e+00 --9.9000e+02 1.3143e+03 3.2322e+00 --9.9000e+02 1.3429e+03 3.3752e+00 --9.9000e+02 1.3714e+03 3.5133e+00 --9.9000e+02 1.4000e+03 3.6468e+00 --9.9000e+02 1.4286e+03 3.7757e+00 --9.9000e+02 1.4571e+03 3.9004e+00 --9.9000e+02 1.4857e+03 4.0209e+00 --9.9000e+02 1.5143e+03 4.1374e+00 --9.9000e+02 1.5429e+03 4.2502e+00 --9.9000e+02 1.5714e+03 4.3592e+00 --9.9000e+02 1.6000e+03 4.4648e+00 --9.9000e+02 1.6286e+03 4.5670e+00 --9.9000e+02 1.6571e+03 4.6660e+00 --9.9000e+02 1.6857e+03 4.7619e+00 --9.9000e+02 1.7143e+03 4.8548e+00 --9.9000e+02 1.7429e+03 4.9448e+00 --9.9000e+02 1.7714e+03 5.0321e+00 --9.9000e+02 1.8000e+03 5.1168e+00 --9.9000e+02 1.8286e+03 5.1989e+00 --9.9000e+02 1.8571e+03 5.2787e+00 --9.9000e+02 1.8857e+03 5.3560e+00 --9.9000e+02 1.9143e+03 5.4312e+00 --9.9000e+02 1.9429e+03 5.5041e+00 --9.9000e+02 1.9714e+03 5.5750e+00 --9.9000e+02 2.0000e+03 5.6439e+00 --9.6000e+02 -2.0000e+03 5.6088e+00 --9.6000e+02 -1.9714e+03 5.5383e+00 --9.6000e+02 -1.9429e+03 5.4658e+00 --9.6000e+02 -1.9143e+03 5.3911e+00 --9.6000e+02 -1.8857e+03 5.3141e+00 --9.6000e+02 -1.8571e+03 5.2348e+00 --9.6000e+02 -1.8286e+03 5.1531e+00 --9.6000e+02 -1.8000e+03 5.0687e+00 --9.6000e+02 -1.7714e+03 4.9818e+00 --9.6000e+02 -1.7429e+03 4.8920e+00 --9.6000e+02 -1.7143e+03 4.7994e+00 --9.6000e+02 -1.6857e+03 4.7037e+00 --9.6000e+02 -1.6571e+03 4.6049e+00 --9.6000e+02 -1.6286e+03 4.5028e+00 --9.6000e+02 -1.6000e+03 4.3973e+00 --9.6000e+02 -1.5714e+03 4.2882e+00 --9.6000e+02 -1.5429e+03 4.1753e+00 --9.6000e+02 -1.5143e+03 4.0585e+00 --9.6000e+02 -1.4857e+03 3.9377e+00 --9.6000e+02 -1.4571e+03 3.8126e+00 --9.6000e+02 -1.4286e+03 3.6831e+00 --9.6000e+02 -1.4000e+03 3.5489e+00 --9.6000e+02 -1.3714e+03 3.4099e+00 --9.6000e+02 -1.3429e+03 3.2658e+00 --9.6000e+02 -1.3143e+03 3.1164e+00 --9.6000e+02 -1.2857e+03 2.9615e+00 --9.6000e+02 -1.2571e+03 2.8008e+00 --9.6000e+02 -1.2286e+03 2.6341e+00 --9.6000e+02 -1.2000e+03 2.4612e+00 --9.6000e+02 -1.1714e+03 2.2817e+00 --9.6000e+02 -1.1429e+03 2.0955e+00 --9.6000e+02 -1.1143e+03 1.9022e+00 --9.6000e+02 -1.0857e+03 1.7016e+00 --9.6000e+02 -1.0571e+03 1.4934e+00 --9.6000e+02 -1.0286e+03 1.2774e+00 --9.6000e+02 -1.0000e+03 1.0533e+00 --9.6000e+02 -9.7143e+02 8.2075e-01 --9.6000e+02 -9.4286e+02 5.7963e-01 --9.6000e+02 -9.1429e+02 3.2971e-01 --9.6000e+02 -8.8571e+02 7.0775e-02 --9.6000e+02 -8.5714e+02 -1.9731e-01 --9.6000e+02 -8.2857e+02 -4.7467e-01 --9.6000e+02 -8.0000e+02 -7.6135e-01 --9.6000e+02 -7.7143e+02 -1.0574e+00 --9.6000e+02 -7.4286e+02 -1.3626e+00 --9.6000e+02 -7.1429e+02 -1.6769e+00 --9.6000e+02 -6.8571e+02 -2.0000e+00 --9.6000e+02 -6.5714e+02 -2.3315e+00 --9.6000e+02 -6.2857e+02 -2.6708e+00 --9.6000e+02 -6.0000e+02 -3.0172e+00 --9.6000e+02 -5.7143e+02 -3.3700e+00 --9.6000e+02 -5.4286e+02 -3.7279e+00 --9.6000e+02 -5.1429e+02 -4.0897e+00 --9.6000e+02 -4.8571e+02 -4.4539e+00 --9.6000e+02 -4.5714e+02 -4.8188e+00 --9.6000e+02 -4.2857e+02 -5.1824e+00 --9.6000e+02 -4.0000e+02 -5.5424e+00 --9.6000e+02 -3.7143e+02 -5.8964e+00 --9.6000e+02 -3.4286e+02 -6.2418e+00 --9.6000e+02 -3.1429e+02 -6.5756e+00 --9.6000e+02 -2.8571e+02 -6.8948e+00 --9.6000e+02 -2.5714e+02 -7.1964e+00 --9.6000e+02 -2.2857e+02 -7.4771e+00 --9.6000e+02 -2.0000e+02 -7.7339e+00 --9.6000e+02 -1.7143e+02 -7.9636e+00 --9.6000e+02 -1.4286e+02 -8.1635e+00 --9.6000e+02 -1.1429e+02 -8.3309e+00 --9.6000e+02 -8.5714e+01 -8.4636e+00 --9.6000e+02 -5.7143e+01 -8.5597e+00 --9.6000e+02 -2.8571e+01 -8.6180e+00 --9.6000e+02 0.0000e+00 -8.6375e+00 --9.6000e+02 2.8571e+01 -8.6180e+00 --9.6000e+02 5.7143e+01 -8.5597e+00 --9.6000e+02 8.5714e+01 -8.4636e+00 --9.6000e+02 1.1429e+02 -8.3309e+00 --9.6000e+02 1.4286e+02 -8.1635e+00 --9.6000e+02 1.7143e+02 -7.9636e+00 --9.6000e+02 2.0000e+02 -7.7339e+00 --9.6000e+02 2.2857e+02 -7.4771e+00 --9.6000e+02 2.5714e+02 -7.1964e+00 --9.6000e+02 2.8571e+02 -6.8948e+00 --9.6000e+02 3.1429e+02 -6.5756e+00 --9.6000e+02 3.4286e+02 -6.2418e+00 --9.6000e+02 3.7143e+02 -5.8964e+00 --9.6000e+02 4.0000e+02 -5.5424e+00 --9.6000e+02 4.2857e+02 -5.1824e+00 --9.6000e+02 4.5714e+02 -4.8188e+00 --9.6000e+02 4.8571e+02 -4.4539e+00 --9.6000e+02 5.1429e+02 -4.0897e+00 --9.6000e+02 5.4286e+02 -3.7279e+00 --9.6000e+02 5.7143e+02 -3.3700e+00 --9.6000e+02 6.0000e+02 -3.0172e+00 --9.6000e+02 6.2857e+02 -2.6708e+00 --9.6000e+02 6.5714e+02 -2.3315e+00 --9.6000e+02 6.8571e+02 -2.0000e+00 --9.6000e+02 7.1429e+02 -1.6769e+00 --9.6000e+02 7.4286e+02 -1.3626e+00 --9.6000e+02 7.7143e+02 -1.0574e+00 --9.6000e+02 8.0000e+02 -7.6135e-01 --9.6000e+02 8.2857e+02 -4.7467e-01 --9.6000e+02 8.5714e+02 -1.9731e-01 --9.6000e+02 8.8571e+02 7.0775e-02 --9.6000e+02 9.1429e+02 3.2971e-01 --9.6000e+02 9.4286e+02 5.7963e-01 --9.6000e+02 9.7143e+02 8.2075e-01 --9.6000e+02 1.0000e+03 1.0533e+00 --9.6000e+02 1.0286e+03 1.2774e+00 --9.6000e+02 1.0571e+03 1.4934e+00 --9.6000e+02 1.0857e+03 1.7016e+00 --9.6000e+02 1.1143e+03 1.9022e+00 --9.6000e+02 1.1429e+03 2.0955e+00 --9.6000e+02 1.1714e+03 2.2817e+00 --9.6000e+02 1.2000e+03 2.4612e+00 --9.6000e+02 1.2286e+03 2.6341e+00 --9.6000e+02 1.2571e+03 2.8008e+00 --9.6000e+02 1.2857e+03 2.9615e+00 --9.6000e+02 1.3143e+03 3.1164e+00 --9.6000e+02 1.3429e+03 3.2658e+00 --9.6000e+02 1.3714e+03 3.4099e+00 --9.6000e+02 1.4000e+03 3.5489e+00 --9.6000e+02 1.4286e+03 3.6831e+00 --9.6000e+02 1.4571e+03 3.8126e+00 --9.6000e+02 1.4857e+03 3.9377e+00 --9.6000e+02 1.5143e+03 4.0585e+00 --9.6000e+02 1.5429e+03 4.1753e+00 --9.6000e+02 1.5714e+03 4.2882e+00 --9.6000e+02 1.6000e+03 4.3973e+00 --9.6000e+02 1.6286e+03 4.5028e+00 --9.6000e+02 1.6571e+03 4.6049e+00 --9.6000e+02 1.6857e+03 4.7037e+00 --9.6000e+02 1.7143e+03 4.7994e+00 --9.6000e+02 1.7429e+03 4.8920e+00 --9.6000e+02 1.7714e+03 4.9818e+00 --9.6000e+02 1.8000e+03 5.0687e+00 --9.6000e+02 1.8286e+03 5.1531e+00 --9.6000e+02 1.8571e+03 5.2348e+00 --9.6000e+02 1.8857e+03 5.3141e+00 --9.6000e+02 1.9143e+03 5.3911e+00 --9.6000e+02 1.9429e+03 5.4658e+00 --9.6000e+02 1.9714e+03 5.5383e+00 --9.6000e+02 2.0000e+03 5.6088e+00 --9.3000e+02 -2.0000e+03 5.5740e+00 --9.3000e+02 -1.9714e+03 5.5020e+00 --9.3000e+02 -1.9429e+03 5.4278e+00 --9.3000e+02 -1.9143e+03 5.3513e+00 --9.3000e+02 -1.8857e+03 5.2725e+00 --9.3000e+02 -1.8571e+03 5.1913e+00 --9.3000e+02 -1.8286e+03 5.1074e+00 --9.3000e+02 -1.8000e+03 5.0209e+00 --9.3000e+02 -1.7714e+03 4.9316e+00 --9.3000e+02 -1.7429e+03 4.8394e+00 --9.3000e+02 -1.7143e+03 4.7441e+00 --9.3000e+02 -1.6857e+03 4.6456e+00 --9.3000e+02 -1.6571e+03 4.5438e+00 --9.3000e+02 -1.6286e+03 4.4386e+00 --9.3000e+02 -1.6000e+03 4.3296e+00 --9.3000e+02 -1.5714e+03 4.2169e+00 --9.3000e+02 -1.5429e+03 4.1002e+00 --9.3000e+02 -1.5143e+03 3.9793e+00 --9.3000e+02 -1.4857e+03 3.8541e+00 --9.3000e+02 -1.4571e+03 3.7243e+00 --9.3000e+02 -1.4286e+03 3.5897e+00 --9.3000e+02 -1.4000e+03 3.4501e+00 --9.3000e+02 -1.3714e+03 3.3053e+00 --9.3000e+02 -1.3429e+03 3.1550e+00 --9.3000e+02 -1.3143e+03 2.9989e+00 --9.3000e+02 -1.2857e+03 2.8369e+00 --9.3000e+02 -1.2571e+03 2.6685e+00 --9.3000e+02 -1.2286e+03 2.4936e+00 --9.3000e+02 -1.2000e+03 2.3118e+00 --9.3000e+02 -1.1714e+03 2.1227e+00 --9.3000e+02 -1.1429e+03 1.9262e+00 --9.3000e+02 -1.1143e+03 1.7218e+00 --9.3000e+02 -1.0857e+03 1.5093e+00 --9.3000e+02 -1.0571e+03 1.2882e+00 --9.3000e+02 -1.0286e+03 1.0583e+00 --9.3000e+02 -1.0000e+03 8.1915e-01 --9.3000e+02 -9.7143e+02 5.7048e-01 --9.3000e+02 -9.4286e+02 3.1195e-01 --9.3000e+02 -9.1429e+02 4.3236e-02 --9.3000e+02 -8.8571e+02 -2.3594e-01 --9.3000e+02 -8.5714e+02 -5.2583e-01 --9.3000e+02 -8.2857e+02 -8.2665e-01 --9.3000e+02 -8.0000e+02 -1.1386e+00 --9.3000e+02 -7.7143e+02 -1.4617e+00 --9.3000e+02 -7.4286e+02 -1.7961e+00 --9.3000e+02 -7.1429e+02 -2.1415e+00 --9.3000e+02 -6.8571e+02 -2.4980e+00 --9.3000e+02 -6.5714e+02 -2.8650e+00 --9.3000e+02 -6.2857e+02 -3.2422e+00 --9.3000e+02 -6.0000e+02 -3.6288e+00 --9.3000e+02 -5.7143e+02 -4.0240e+00 --9.3000e+02 -5.4286e+02 -4.4267e+00 --9.3000e+02 -5.1429e+02 -4.8354e+00 --9.3000e+02 -4.8571e+02 -5.2486e+00 --9.3000e+02 -4.5714e+02 -5.6643e+00 --9.3000e+02 -4.2857e+02 -6.0802e+00 --9.3000e+02 -4.0000e+02 -6.4937e+00 --9.3000e+02 -3.7143e+02 -6.9019e+00 --9.3000e+02 -3.4286e+02 -7.3018e+00 --9.3000e+02 -3.1429e+02 -7.6897e+00 --9.3000e+02 -2.8571e+02 -8.0621e+00 --9.3000e+02 -2.5714e+02 -8.4151e+00 --9.3000e+02 -2.2857e+02 -8.7448e+00 --9.3000e+02 -2.0000e+02 -9.0472e+00 --9.3000e+02 -1.7143e+02 -9.3185e+00 --9.3000e+02 -1.4286e+02 -9.5551e+00 --9.3000e+02 -1.1429e+02 -9.7537e+00 --9.3000e+02 -8.5714e+01 -9.9113e+00 --9.3000e+02 -5.7143e+01 -1.0026e+01 --9.3000e+02 -2.8571e+01 -1.0095e+01 --9.3000e+02 0.0000e+00 -1.0118e+01 --9.3000e+02 2.8571e+01 -1.0095e+01 --9.3000e+02 5.7143e+01 -1.0026e+01 --9.3000e+02 8.5714e+01 -9.9113e+00 --9.3000e+02 1.1429e+02 -9.7537e+00 --9.3000e+02 1.4286e+02 -9.5551e+00 --9.3000e+02 1.7143e+02 -9.3185e+00 --9.3000e+02 2.0000e+02 -9.0472e+00 --9.3000e+02 2.2857e+02 -8.7448e+00 --9.3000e+02 2.5714e+02 -8.4151e+00 --9.3000e+02 2.8571e+02 -8.0621e+00 --9.3000e+02 3.1429e+02 -7.6897e+00 --9.3000e+02 3.4286e+02 -7.3018e+00 --9.3000e+02 3.7143e+02 -6.9019e+00 --9.3000e+02 4.0000e+02 -6.4937e+00 --9.3000e+02 4.2857e+02 -6.0802e+00 --9.3000e+02 4.5714e+02 -5.6643e+00 --9.3000e+02 4.8571e+02 -5.2486e+00 --9.3000e+02 5.1429e+02 -4.8354e+00 --9.3000e+02 5.4286e+02 -4.4267e+00 --9.3000e+02 5.7143e+02 -4.0240e+00 --9.3000e+02 6.0000e+02 -3.6288e+00 --9.3000e+02 6.2857e+02 -3.2422e+00 --9.3000e+02 6.5714e+02 -2.8650e+00 --9.3000e+02 6.8571e+02 -2.4980e+00 --9.3000e+02 7.1429e+02 -2.1415e+00 --9.3000e+02 7.4286e+02 -1.7961e+00 --9.3000e+02 7.7143e+02 -1.4617e+00 --9.3000e+02 8.0000e+02 -1.1386e+00 --9.3000e+02 8.2857e+02 -8.2665e-01 --9.3000e+02 8.5714e+02 -5.2583e-01 --9.3000e+02 8.8571e+02 -2.3594e-01 --9.3000e+02 9.1429e+02 4.3236e-02 --9.3000e+02 9.4286e+02 3.1195e-01 --9.3000e+02 9.7143e+02 5.7048e-01 --9.3000e+02 1.0000e+03 8.1915e-01 --9.3000e+02 1.0286e+03 1.0583e+00 --9.3000e+02 1.0571e+03 1.2882e+00 --9.3000e+02 1.0857e+03 1.5093e+00 --9.3000e+02 1.1143e+03 1.7218e+00 --9.3000e+02 1.1429e+03 1.9262e+00 --9.3000e+02 1.1714e+03 2.1227e+00 --9.3000e+02 1.2000e+03 2.3118e+00 --9.3000e+02 1.2286e+03 2.4936e+00 --9.3000e+02 1.2571e+03 2.6685e+00 --9.3000e+02 1.2857e+03 2.8369e+00 --9.3000e+02 1.3143e+03 2.9989e+00 --9.3000e+02 1.3429e+03 3.1550e+00 --9.3000e+02 1.3714e+03 3.3053e+00 --9.3000e+02 1.4000e+03 3.4501e+00 --9.3000e+02 1.4286e+03 3.5897e+00 --9.3000e+02 1.4571e+03 3.7243e+00 --9.3000e+02 1.4857e+03 3.8541e+00 --9.3000e+02 1.5143e+03 3.9793e+00 --9.3000e+02 1.5429e+03 4.1002e+00 --9.3000e+02 1.5714e+03 4.2169e+00 --9.3000e+02 1.6000e+03 4.3296e+00 --9.3000e+02 1.6286e+03 4.4386e+00 --9.3000e+02 1.6571e+03 4.5438e+00 --9.3000e+02 1.6857e+03 4.6456e+00 --9.3000e+02 1.7143e+03 4.7441e+00 --9.3000e+02 1.7429e+03 4.8394e+00 --9.3000e+02 1.7714e+03 4.9316e+00 --9.3000e+02 1.8000e+03 5.0209e+00 --9.3000e+02 1.8286e+03 5.1074e+00 --9.3000e+02 1.8571e+03 5.1913e+00 --9.3000e+02 1.8857e+03 5.2725e+00 --9.3000e+02 1.9143e+03 5.3513e+00 --9.3000e+02 1.9429e+03 5.4278e+00 --9.3000e+02 1.9714e+03 5.5020e+00 --9.3000e+02 2.0000e+03 5.5740e+00 --9.0000e+02 -2.0000e+03 5.5395e+00 --9.0000e+02 -1.9714e+03 5.4660e+00 --9.0000e+02 -1.9429e+03 5.3901e+00 --9.0000e+02 -1.9143e+03 5.3119e+00 --9.0000e+02 -1.8857e+03 5.2313e+00 --9.0000e+02 -1.8571e+03 5.1480e+00 --9.0000e+02 -1.8286e+03 5.0621e+00 --9.0000e+02 -1.8000e+03 4.9734e+00 --9.0000e+02 -1.7714e+03 4.8817e+00 --9.0000e+02 -1.7429e+03 4.7870e+00 --9.0000e+02 -1.7143e+03 4.6891e+00 --9.0000e+02 -1.6857e+03 4.5878e+00 --9.0000e+02 -1.6571e+03 4.4829e+00 --9.0000e+02 -1.6286e+03 4.3744e+00 --9.0000e+02 -1.6000e+03 4.2621e+00 --9.0000e+02 -1.5714e+03 4.1457e+00 --9.0000e+02 -1.5429e+03 4.0250e+00 --9.0000e+02 -1.5143e+03 3.8999e+00 --9.0000e+02 -1.4857e+03 3.7702e+00 --9.0000e+02 -1.4571e+03 3.6355e+00 --9.0000e+02 -1.4286e+03 3.4958e+00 --9.0000e+02 -1.4000e+03 3.3506e+00 --9.0000e+02 -1.3714e+03 3.1998e+00 --9.0000e+02 -1.3429e+03 3.0431e+00 --9.0000e+02 -1.3143e+03 2.8801e+00 --9.0000e+02 -1.2857e+03 2.7106e+00 --9.0000e+02 -1.2571e+03 2.5342e+00 --9.0000e+02 -1.2286e+03 2.3507e+00 --9.0000e+02 -1.2000e+03 2.1595e+00 --9.0000e+02 -1.1714e+03 1.9605e+00 --9.0000e+02 -1.1429e+03 1.7531e+00 --9.0000e+02 -1.1143e+03 1.5370e+00 --9.0000e+02 -1.0857e+03 1.3117e+00 --9.0000e+02 -1.0571e+03 1.0770e+00 --9.0000e+02 -1.0286e+03 8.3218e-01 --9.0000e+02 -1.0000e+03 5.7699e-01 --9.0000e+02 -9.7143e+02 3.1094e-01 --9.0000e+02 -9.4286e+02 3.3585e-02 --9.0000e+02 -9.1429e+02 -2.5550e-01 --9.0000e+02 -8.8571e+02 -5.5672e-01 --9.0000e+02 -8.5714e+02 -8.7046e-01 --9.0000e+02 -8.2857e+02 -1.1971e+00 --9.0000e+02 -8.0000e+02 -1.5369e+00 --9.0000e+02 -7.7143e+02 -1.8901e+00 --9.0000e+02 -7.4286e+02 -2.2570e+00 --9.0000e+02 -7.1429e+02 -2.6374e+00 --9.0000e+02 -6.8571e+02 -3.0315e+00 --9.0000e+02 -6.5714e+02 -3.4389e+00 --9.0000e+02 -6.2857e+02 -3.8593e+00 --9.0000e+02 -6.0000e+02 -4.2921e+00 --9.0000e+02 -5.7143e+02 -4.7363e+00 --9.0000e+02 -5.4286e+02 -5.1910e+00 --9.0000e+02 -5.1429e+02 -5.6546e+00 --9.0000e+02 -4.8571e+02 -6.1253e+00 --9.0000e+02 -4.5714e+02 -6.6010e+00 --9.0000e+02 -4.2857e+02 -7.0792e+00 --9.0000e+02 -4.0000e+02 -7.5568e+00 --9.0000e+02 -3.7143e+02 -8.0305e+00 --9.0000e+02 -3.4286e+02 -8.4963e+00 --9.0000e+02 -3.1429e+02 -8.9503e+00 --9.0000e+02 -2.8571e+02 -9.3878e+00 --9.0000e+02 -2.5714e+02 -9.8041e+00 --9.0000e+02 -2.2857e+02 -1.0194e+01 --9.0000e+02 -2.0000e+02 -1.0553e+01 --9.0000e+02 -1.7143e+02 -1.0876e+01 --9.0000e+02 -1.4286e+02 -1.1159e+01 --9.0000e+02 -1.1429e+02 -1.1397e+01 --9.0000e+02 -8.5714e+01 -1.1586e+01 --9.0000e+02 -5.7143e+01 -1.1723e+01 --9.0000e+02 -2.8571e+01 -1.1806e+01 --9.0000e+02 0.0000e+00 -1.1834e+01 --9.0000e+02 2.8571e+01 -1.1806e+01 --9.0000e+02 5.7143e+01 -1.1723e+01 --9.0000e+02 8.5714e+01 -1.1586e+01 --9.0000e+02 1.1429e+02 -1.1397e+01 --9.0000e+02 1.4286e+02 -1.1159e+01 --9.0000e+02 1.7143e+02 -1.0876e+01 --9.0000e+02 2.0000e+02 -1.0553e+01 --9.0000e+02 2.2857e+02 -1.0194e+01 --9.0000e+02 2.5714e+02 -9.8041e+00 --9.0000e+02 2.8571e+02 -9.3878e+00 --9.0000e+02 3.1429e+02 -8.9503e+00 --9.0000e+02 3.4286e+02 -8.4963e+00 --9.0000e+02 3.7143e+02 -8.0305e+00 --9.0000e+02 4.0000e+02 -7.5568e+00 --9.0000e+02 4.2857e+02 -7.0792e+00 --9.0000e+02 4.5714e+02 -6.6010e+00 --9.0000e+02 4.8571e+02 -6.1253e+00 --9.0000e+02 5.1429e+02 -5.6546e+00 --9.0000e+02 5.4286e+02 -5.1910e+00 --9.0000e+02 5.7143e+02 -4.7363e+00 --9.0000e+02 6.0000e+02 -4.2921e+00 --9.0000e+02 6.2857e+02 -3.8593e+00 --9.0000e+02 6.5714e+02 -3.4389e+00 --9.0000e+02 6.8571e+02 -3.0315e+00 --9.0000e+02 7.1429e+02 -2.6374e+00 --9.0000e+02 7.4286e+02 -2.2570e+00 --9.0000e+02 7.7143e+02 -1.8901e+00 --9.0000e+02 8.0000e+02 -1.5369e+00 --9.0000e+02 8.2857e+02 -1.1971e+00 --9.0000e+02 8.5714e+02 -8.7046e-01 --9.0000e+02 8.8571e+02 -5.5672e-01 --9.0000e+02 9.1429e+02 -2.5550e-01 --9.0000e+02 9.4286e+02 3.3585e-02 --9.0000e+02 9.7143e+02 3.1094e-01 --9.0000e+02 1.0000e+03 5.7699e-01 --9.0000e+02 1.0286e+03 8.3218e-01 --9.0000e+02 1.0571e+03 1.0770e+00 --9.0000e+02 1.0857e+03 1.3117e+00 --9.0000e+02 1.1143e+03 1.5370e+00 --9.0000e+02 1.1429e+03 1.7531e+00 --9.0000e+02 1.1714e+03 1.9605e+00 --9.0000e+02 1.2000e+03 2.1595e+00 --9.0000e+02 1.2286e+03 2.3507e+00 --9.0000e+02 1.2571e+03 2.5342e+00 --9.0000e+02 1.2857e+03 2.7106e+00 --9.0000e+02 1.3143e+03 2.8801e+00 --9.0000e+02 1.3429e+03 3.0431e+00 --9.0000e+02 1.3714e+03 3.1998e+00 --9.0000e+02 1.4000e+03 3.3506e+00 --9.0000e+02 1.4286e+03 3.4958e+00 --9.0000e+02 1.4571e+03 3.6355e+00 --9.0000e+02 1.4857e+03 3.7702e+00 --9.0000e+02 1.5143e+03 3.8999e+00 --9.0000e+02 1.5429e+03 4.0250e+00 --9.0000e+02 1.5714e+03 4.1457e+00 --9.0000e+02 1.6000e+03 4.2621e+00 --9.0000e+02 1.6286e+03 4.3744e+00 --9.0000e+02 1.6571e+03 4.4829e+00 --9.0000e+02 1.6857e+03 4.5878e+00 --9.0000e+02 1.7143e+03 4.6891e+00 --9.0000e+02 1.7429e+03 4.7870e+00 --9.0000e+02 1.7714e+03 4.8817e+00 --9.0000e+02 1.8000e+03 4.9734e+00 --9.0000e+02 1.8286e+03 5.0621e+00 --9.0000e+02 1.8571e+03 5.1480e+00 --9.0000e+02 1.8857e+03 5.2313e+00 --9.0000e+02 1.9143e+03 5.3119e+00 --9.0000e+02 1.9429e+03 5.3901e+00 --9.0000e+02 1.9714e+03 5.4660e+00 --9.0000e+02 2.0000e+03 5.5395e+00 --8.7000e+02 -2.0000e+03 5.5055e+00 --8.7000e+02 -1.9714e+03 5.4304e+00 --8.7000e+02 -1.9429e+03 5.3529e+00 --8.7000e+02 -1.9143e+03 5.2730e+00 --8.7000e+02 -1.8857e+03 5.1904e+00 --8.7000e+02 -1.8571e+03 5.1052e+00 --8.7000e+02 -1.8286e+03 5.0172e+00 --8.7000e+02 -1.8000e+03 4.9263e+00 --8.7000e+02 -1.7714e+03 4.8322e+00 --8.7000e+02 -1.7429e+03 4.7350e+00 --8.7000e+02 -1.7143e+03 4.6343e+00 --8.7000e+02 -1.6857e+03 4.5301e+00 --8.7000e+02 -1.6571e+03 4.4223e+00 --8.7000e+02 -1.6286e+03 4.3105e+00 --8.7000e+02 -1.6000e+03 4.1946e+00 --8.7000e+02 -1.5714e+03 4.0744e+00 --8.7000e+02 -1.5429e+03 3.9498e+00 --8.7000e+02 -1.5143e+03 3.8204e+00 --8.7000e+02 -1.4857e+03 3.6860e+00 --8.7000e+02 -1.4571e+03 3.5464e+00 --8.7000e+02 -1.4286e+03 3.4014e+00 --8.7000e+02 -1.4000e+03 3.2505e+00 --8.7000e+02 -1.3714e+03 3.0935e+00 --8.7000e+02 -1.3429e+03 2.9301e+00 --8.7000e+02 -1.3143e+03 2.7600e+00 --8.7000e+02 -1.2857e+03 2.5828e+00 --8.7000e+02 -1.2571e+03 2.3981e+00 --8.7000e+02 -1.2286e+03 2.2055e+00 --8.7000e+02 -1.2000e+03 2.0046e+00 --8.7000e+02 -1.1714e+03 1.7950e+00 --8.7000e+02 -1.1429e+03 1.5762e+00 --8.7000e+02 -1.1143e+03 1.3477e+00 --8.7000e+02 -1.0857e+03 1.1090e+00 --8.7000e+02 -1.0571e+03 8.5968e-01 --8.7000e+02 -1.0286e+03 5.9908e-01 --8.7000e+02 -1.0000e+03 3.2669e-01 --8.7000e+02 -9.7143e+02 4.1952e-02 --8.7000e+02 -9.4286e+02 -2.5571e-01 --8.7000e+02 -9.1429e+02 -5.6688e-01 --8.7000e+02 -8.8571e+02 -8.9211e-01 --8.7000e+02 -8.5714e+02 -1.2320e+00 --8.7000e+02 -8.2857e+02 -1.5870e+00 --8.7000e+02 -8.0000e+02 -1.9576e+00 --8.7000e+02 -7.7143e+02 -2.3443e+00 --8.7000e+02 -7.4286e+02 -2.7474e+00 --8.7000e+02 -7.1429e+02 -3.1672e+00 --8.7000e+02 -6.8571e+02 -3.6038e+00 --8.7000e+02 -6.5714e+02 -4.0571e+00 --8.7000e+02 -6.2857e+02 -4.5269e+00 --8.7000e+02 -6.0000e+02 -5.0127e+00 --8.7000e+02 -5.7143e+02 -5.5139e+00 --8.7000e+02 -5.4286e+02 -6.0291e+00 --8.7000e+02 -5.1429e+02 -6.5571e+00 --8.7000e+02 -4.8571e+02 -7.0959e+00 --8.7000e+02 -4.5714e+02 -7.6431e+00 --8.7000e+02 -4.2857e+02 -8.1959e+00 --8.7000e+02 -4.0000e+02 -8.7507e+00 --8.7000e+02 -3.7143e+02 -9.3037e+00 --8.7000e+02 -3.4286e+02 -9.8502e+00 --8.7000e+02 -3.1429e+02 -1.0385e+01 --8.7000e+02 -2.8571e+02 -1.0903e+01 --8.7000e+02 -2.5714e+02 -1.1398e+01 --8.7000e+02 -2.2857e+02 -1.1864e+01 --8.7000e+02 -2.0000e+02 -1.2294e+01 --8.7000e+02 -1.7143e+02 -1.2682e+01 --8.7000e+02 -1.4286e+02 -1.3022e+01 --8.7000e+02 -1.1429e+02 -1.3309e+01 --8.7000e+02 -8.5714e+01 -1.3538e+01 --8.7000e+02 -5.7143e+01 -1.3704e+01 --8.7000e+02 -2.8571e+01 -1.3806e+01 --8.7000e+02 0.0000e+00 -1.3839e+01 --8.7000e+02 2.8571e+01 -1.3806e+01 --8.7000e+02 5.7143e+01 -1.3704e+01 --8.7000e+02 8.5714e+01 -1.3538e+01 --8.7000e+02 1.1429e+02 -1.3309e+01 --8.7000e+02 1.4286e+02 -1.3022e+01 --8.7000e+02 1.7143e+02 -1.2682e+01 --8.7000e+02 2.0000e+02 -1.2294e+01 --8.7000e+02 2.2857e+02 -1.1864e+01 --8.7000e+02 2.5714e+02 -1.1398e+01 --8.7000e+02 2.8571e+02 -1.0903e+01 --8.7000e+02 3.1429e+02 -1.0385e+01 --8.7000e+02 3.4286e+02 -9.8502e+00 --8.7000e+02 3.7143e+02 -9.3037e+00 --8.7000e+02 4.0000e+02 -8.7507e+00 --8.7000e+02 4.2857e+02 -8.1959e+00 --8.7000e+02 4.5714e+02 -7.6431e+00 --8.7000e+02 4.8571e+02 -7.0959e+00 --8.7000e+02 5.1429e+02 -6.5571e+00 --8.7000e+02 5.4286e+02 -6.0291e+00 --8.7000e+02 5.7143e+02 -5.5139e+00 --8.7000e+02 6.0000e+02 -5.0127e+00 --8.7000e+02 6.2857e+02 -4.5269e+00 --8.7000e+02 6.5714e+02 -4.0571e+00 --8.7000e+02 6.8571e+02 -3.6038e+00 --8.7000e+02 7.1429e+02 -3.1672e+00 --8.7000e+02 7.4286e+02 -2.7474e+00 --8.7000e+02 7.7143e+02 -2.3443e+00 --8.7000e+02 8.0000e+02 -1.9576e+00 --8.7000e+02 8.2857e+02 -1.5870e+00 --8.7000e+02 8.5714e+02 -1.2320e+00 --8.7000e+02 8.8571e+02 -8.9211e-01 --8.7000e+02 9.1429e+02 -5.6688e-01 --8.7000e+02 9.4286e+02 -2.5571e-01 --8.7000e+02 9.7143e+02 4.1952e-02 --8.7000e+02 1.0000e+03 3.2669e-01 --8.7000e+02 1.0286e+03 5.9908e-01 --8.7000e+02 1.0571e+03 8.5968e-01 --8.7000e+02 1.0857e+03 1.1090e+00 --8.7000e+02 1.1143e+03 1.3477e+00 --8.7000e+02 1.1429e+03 1.5762e+00 --8.7000e+02 1.1714e+03 1.7950e+00 --8.7000e+02 1.2000e+03 2.0046e+00 --8.7000e+02 1.2286e+03 2.2055e+00 --8.7000e+02 1.2571e+03 2.3981e+00 --8.7000e+02 1.2857e+03 2.5828e+00 --8.7000e+02 1.3143e+03 2.7600e+00 --8.7000e+02 1.3429e+03 2.9301e+00 --8.7000e+02 1.3714e+03 3.0935e+00 --8.7000e+02 1.4000e+03 3.2505e+00 --8.7000e+02 1.4286e+03 3.4014e+00 --8.7000e+02 1.4571e+03 3.5464e+00 --8.7000e+02 1.4857e+03 3.6860e+00 --8.7000e+02 1.5143e+03 3.8204e+00 --8.7000e+02 1.5429e+03 3.9498e+00 --8.7000e+02 1.5714e+03 4.0744e+00 --8.7000e+02 1.6000e+03 4.1946e+00 --8.7000e+02 1.6286e+03 4.3105e+00 --8.7000e+02 1.6571e+03 4.4223e+00 --8.7000e+02 1.6857e+03 4.5301e+00 --8.7000e+02 1.7143e+03 4.6343e+00 --8.7000e+02 1.7429e+03 4.7350e+00 --8.7000e+02 1.7714e+03 4.8322e+00 --8.7000e+02 1.8000e+03 4.9263e+00 --8.7000e+02 1.8286e+03 5.0172e+00 --8.7000e+02 1.8571e+03 5.1052e+00 --8.7000e+02 1.8857e+03 5.1904e+00 --8.7000e+02 1.9143e+03 5.2730e+00 --8.7000e+02 1.9429e+03 5.3529e+00 --8.7000e+02 1.9714e+03 5.4304e+00 --8.7000e+02 2.0000e+03 5.5055e+00 --8.4000e+02 -2.0000e+03 5.4720e+00 --8.4000e+02 -1.9714e+03 5.3953e+00 --8.4000e+02 -1.9429e+03 5.3161e+00 --8.4000e+02 -1.9143e+03 5.2344e+00 --8.4000e+02 -1.8857e+03 5.1501e+00 --8.4000e+02 -1.8571e+03 5.0629e+00 --8.4000e+02 -1.8286e+03 4.9728e+00 --8.4000e+02 -1.8000e+03 4.8796e+00 --8.4000e+02 -1.7714e+03 4.7831e+00 --8.4000e+02 -1.7429e+03 4.6833e+00 --8.4000e+02 -1.7143e+03 4.5800e+00 --8.4000e+02 -1.6857e+03 4.4729e+00 --8.4000e+02 -1.6571e+03 4.3619e+00 --8.4000e+02 -1.6286e+03 4.2468e+00 --8.4000e+02 -1.6000e+03 4.1274e+00 --8.4000e+02 -1.5714e+03 4.0034e+00 --8.4000e+02 -1.5429e+03 3.8747e+00 --8.4000e+02 -1.5143e+03 3.7409e+00 --8.4000e+02 -1.4857e+03 3.6018e+00 --8.4000e+02 -1.4571e+03 3.4572e+00 --8.4000e+02 -1.4286e+03 3.3066e+00 --8.4000e+02 -1.4000e+03 3.1499e+00 --8.4000e+02 -1.3714e+03 2.9866e+00 --8.4000e+02 -1.3429e+03 2.8164e+00 --8.4000e+02 -1.3143e+03 2.6388e+00 --8.4000e+02 -1.2857e+03 2.4536e+00 --8.4000e+02 -1.2571e+03 2.2603e+00 --8.4000e+02 -1.2286e+03 2.0583e+00 --8.4000e+02 -1.2000e+03 1.8472e+00 --8.4000e+02 -1.1714e+03 1.6266e+00 --8.4000e+02 -1.1429e+03 1.3957e+00 --8.4000e+02 -1.1143e+03 1.1542e+00 --8.4000e+02 -1.0857e+03 9.0131e-01 --8.4000e+02 -1.0571e+03 6.3647e-01 --8.4000e+02 -1.0286e+03 3.5901e-01 --8.4000e+02 -1.0000e+03 6.8225e-02 --8.4000e+02 -9.7143e+02 -2.3659e-01 --8.4000e+02 -9.4286e+02 -5.5617e-01 --8.4000e+02 -9.1429e+02 -8.9127e-01 --8.4000e+02 -8.8571e+02 -1.2426e+00 --8.4000e+02 -8.5714e+02 -1.6111e+00 --8.4000e+02 -8.2857e+02 -1.9973e+00 --8.4000e+02 -8.0000e+02 -2.4020e+00 --8.4000e+02 -7.7143e+02 -2.8259e+00 --8.4000e+02 -7.4286e+02 -3.2696e+00 --8.4000e+02 -7.1429e+02 -3.7336e+00 --8.4000e+02 -6.8571e+02 -4.2183e+00 --8.4000e+02 -6.5714e+02 -4.7239e+00 --8.4000e+02 -6.2857e+02 -5.2504e+00 --8.4000e+02 -6.0000e+02 -5.7975e+00 --8.4000e+02 -5.7143e+02 -6.3647e+00 --8.4000e+02 -5.4286e+02 -6.9510e+00 --8.4000e+02 -5.1429e+02 -7.5549e+00 --8.4000e+02 -4.8571e+02 -8.1745e+00 --8.4000e+02 -4.5714e+02 -8.8072e+00 --8.4000e+02 -4.2857e+02 -9.4498e+00 --8.4000e+02 -4.0000e+02 -1.0098e+01 --8.4000e+02 -3.7143e+02 -1.0748e+01 --8.4000e+02 -3.4286e+02 -1.1394e+01 --8.4000e+02 -3.1429e+02 -1.2029e+01 --8.4000e+02 -2.8571e+02 -1.2647e+01 --8.4000e+02 -2.5714e+02 -1.3240e+01 --8.4000e+02 -2.2857e+02 -1.3800e+01 --8.4000e+02 -2.0000e+02 -1.4320e+01 --8.4000e+02 -1.7143e+02 -1.4791e+01 --8.4000e+02 -1.4286e+02 -1.5205e+01 --8.4000e+02 -1.1429e+02 -1.5555e+01 --8.4000e+02 -8.5714e+01 -1.5834e+01 --8.4000e+02 -5.7143e+01 -1.6038e+01 --8.4000e+02 -2.8571e+01 -1.6162e+01 --8.4000e+02 0.0000e+00 -1.6203e+01 --8.4000e+02 2.8571e+01 -1.6162e+01 --8.4000e+02 5.7143e+01 -1.6038e+01 --8.4000e+02 8.5714e+01 -1.5834e+01 --8.4000e+02 1.1429e+02 -1.5555e+01 --8.4000e+02 1.4286e+02 -1.5205e+01 --8.4000e+02 1.7143e+02 -1.4791e+01 --8.4000e+02 2.0000e+02 -1.4320e+01 --8.4000e+02 2.2857e+02 -1.3800e+01 --8.4000e+02 2.5714e+02 -1.3240e+01 --8.4000e+02 2.8571e+02 -1.2647e+01 --8.4000e+02 3.1429e+02 -1.2029e+01 --8.4000e+02 3.4286e+02 -1.1394e+01 --8.4000e+02 3.7143e+02 -1.0748e+01 --8.4000e+02 4.0000e+02 -1.0098e+01 --8.4000e+02 4.2857e+02 -9.4498e+00 --8.4000e+02 4.5714e+02 -8.8072e+00 --8.4000e+02 4.8571e+02 -8.1745e+00 --8.4000e+02 5.1429e+02 -7.5549e+00 --8.4000e+02 5.4286e+02 -6.9510e+00 --8.4000e+02 5.7143e+02 -6.3647e+00 --8.4000e+02 6.0000e+02 -5.7975e+00 --8.4000e+02 6.2857e+02 -5.2504e+00 --8.4000e+02 6.5714e+02 -4.7239e+00 --8.4000e+02 6.8571e+02 -4.2183e+00 --8.4000e+02 7.1429e+02 -3.7336e+00 --8.4000e+02 7.4286e+02 -3.2696e+00 --8.4000e+02 7.7143e+02 -2.8259e+00 --8.4000e+02 8.0000e+02 -2.4020e+00 --8.4000e+02 8.2857e+02 -1.9973e+00 --8.4000e+02 8.5714e+02 -1.6111e+00 --8.4000e+02 8.8571e+02 -1.2426e+00 --8.4000e+02 9.1429e+02 -8.9127e-01 --8.4000e+02 9.4286e+02 -5.5617e-01 --8.4000e+02 9.7143e+02 -2.3659e-01 --8.4000e+02 1.0000e+03 6.8225e-02 --8.4000e+02 1.0286e+03 3.5901e-01 --8.4000e+02 1.0571e+03 6.3647e-01 --8.4000e+02 1.0857e+03 9.0131e-01 --8.4000e+02 1.1143e+03 1.1542e+00 --8.4000e+02 1.1429e+03 1.3957e+00 --8.4000e+02 1.1714e+03 1.6266e+00 --8.4000e+02 1.2000e+03 1.8472e+00 --8.4000e+02 1.2286e+03 2.0583e+00 --8.4000e+02 1.2571e+03 2.2603e+00 --8.4000e+02 1.2857e+03 2.4536e+00 --8.4000e+02 1.3143e+03 2.6388e+00 --8.4000e+02 1.3429e+03 2.8164e+00 --8.4000e+02 1.3714e+03 2.9866e+00 --8.4000e+02 1.4000e+03 3.1499e+00 --8.4000e+02 1.4286e+03 3.3066e+00 --8.4000e+02 1.4571e+03 3.4572e+00 --8.4000e+02 1.4857e+03 3.6018e+00 --8.4000e+02 1.5143e+03 3.7409e+00 --8.4000e+02 1.5429e+03 3.8747e+00 --8.4000e+02 1.5714e+03 4.0034e+00 --8.4000e+02 1.6000e+03 4.1274e+00 --8.4000e+02 1.6286e+03 4.2468e+00 --8.4000e+02 1.6571e+03 4.3619e+00 --8.4000e+02 1.6857e+03 4.4729e+00 --8.4000e+02 1.7143e+03 4.5800e+00 --8.4000e+02 1.7429e+03 4.6833e+00 --8.4000e+02 1.7714e+03 4.7831e+00 --8.4000e+02 1.8000e+03 4.8796e+00 --8.4000e+02 1.8286e+03 4.9728e+00 --8.4000e+02 1.8571e+03 5.0629e+00 --8.4000e+02 1.8857e+03 5.1501e+00 --8.4000e+02 1.9143e+03 5.2344e+00 --8.4000e+02 1.9429e+03 5.3161e+00 --8.4000e+02 1.9714e+03 5.3953e+00 --8.4000e+02 2.0000e+03 5.4720e+00 --8.1000e+02 -2.0000e+03 5.4389e+00 --8.1000e+02 -1.9714e+03 5.3607e+00 --8.1000e+02 -1.9429e+03 5.2799e+00 --8.1000e+02 -1.9143e+03 5.1965e+00 --8.1000e+02 -1.8857e+03 5.1102e+00 --8.1000e+02 -1.8571e+03 5.0211e+00 --8.1000e+02 -1.8286e+03 4.9288e+00 --8.1000e+02 -1.8000e+03 4.8334e+00 --8.1000e+02 -1.7714e+03 4.7346e+00 --8.1000e+02 -1.7429e+03 4.6322e+00 --8.1000e+02 -1.7143e+03 4.5261e+00 --8.1000e+02 -1.6857e+03 4.4161e+00 --8.1000e+02 -1.6571e+03 4.3020e+00 --8.1000e+02 -1.6286e+03 4.1835e+00 --8.1000e+02 -1.6000e+03 4.0605e+00 --8.1000e+02 -1.5714e+03 3.9327e+00 --8.1000e+02 -1.5429e+03 3.7998e+00 --8.1000e+02 -1.5143e+03 3.6616e+00 --8.1000e+02 -1.4857e+03 3.5177e+00 --8.1000e+02 -1.4571e+03 3.3679e+00 --8.1000e+02 -1.4286e+03 3.2118e+00 --8.1000e+02 -1.4000e+03 3.0490e+00 --8.1000e+02 -1.3714e+03 2.8792e+00 --8.1000e+02 -1.3429e+03 2.7019e+00 --8.1000e+02 -1.3143e+03 2.5168e+00 --8.1000e+02 -1.2857e+03 2.3233e+00 --8.1000e+02 -1.2571e+03 2.1209e+00 --8.1000e+02 -1.2286e+03 1.9092e+00 --8.1000e+02 -1.2000e+03 1.6875e+00 --8.1000e+02 -1.1714e+03 1.4553e+00 --8.1000e+02 -1.1429e+03 1.2119e+00 --8.1000e+02 -1.1143e+03 9.5659e-01 --8.1000e+02 -1.0857e+03 6.8871e-01 --8.1000e+02 -1.0571e+03 4.0746e-01 --8.1000e+02 -1.0286e+03 1.1205e-01 --8.1000e+02 -1.0000e+03 -1.9839e-01 --8.1000e+02 -9.7143e+02 -5.2474e-01 --8.1000e+02 -9.4286e+02 -8.6794e-01 --8.1000e+02 -9.1429e+02 -1.2290e+00 --8.1000e+02 -8.8571e+02 -1.6088e+00 --8.1000e+02 -8.5714e+02 -2.0084e+00 --8.1000e+02 -8.2857e+02 -2.4290e+00 --8.1000e+02 -8.0000e+02 -2.8713e+00 --8.1000e+02 -7.7143e+02 -3.3366e+00 --8.1000e+02 -7.4286e+02 -3.8257e+00 --8.1000e+02 -7.1429e+02 -4.3395e+00 --8.1000e+02 -6.8571e+02 -4.8788e+00 --8.1000e+02 -6.5714e+02 -5.4441e+00 --8.1000e+02 -6.2857e+02 -6.0357e+00 --8.1000e+02 -6.0000e+02 -6.6539e+00 --8.1000e+02 -5.7143e+02 -7.2982e+00 --8.1000e+02 -5.4286e+02 -7.9679e+00 --8.1000e+02 -5.1429e+02 -8.6617e+00 --8.1000e+02 -4.8571e+02 -9.3777e+00 --8.1000e+02 -4.5714e+02 -1.0113e+01 --8.1000e+02 -4.2857e+02 -1.0865e+01 --8.1000e+02 -4.0000e+02 -1.1627e+01 --8.1000e+02 -3.7143e+02 -1.2396e+01 --8.1000e+02 -3.4286e+02 -1.3164e+01 --8.1000e+02 -3.1429e+02 -1.3924e+01 --8.1000e+02 -2.8571e+02 -1.4667e+01 --8.1000e+02 -2.5714e+02 -1.5384e+01 --8.1000e+02 -2.2857e+02 -1.6064e+01 --8.1000e+02 -2.0000e+02 -1.6698e+01 --8.1000e+02 -1.7143e+02 -1.7274e+01 --8.1000e+02 -1.4286e+02 -1.7782e+01 --8.1000e+02 -1.1429e+02 -1.8213e+01 --8.1000e+02 -8.5714e+01 -1.8558e+01 --8.1000e+02 -5.7143e+01 -1.8809e+01 --8.1000e+02 -2.8571e+01 -1.8963e+01 --8.1000e+02 0.0000e+00 -1.9014e+01 --8.1000e+02 2.8571e+01 -1.8963e+01 --8.1000e+02 5.7143e+01 -1.8809e+01 --8.1000e+02 8.5714e+01 -1.8558e+01 --8.1000e+02 1.1429e+02 -1.8213e+01 --8.1000e+02 1.4286e+02 -1.7782e+01 --8.1000e+02 1.7143e+02 -1.7274e+01 --8.1000e+02 2.0000e+02 -1.6698e+01 --8.1000e+02 2.2857e+02 -1.6064e+01 --8.1000e+02 2.5714e+02 -1.5384e+01 --8.1000e+02 2.8571e+02 -1.4667e+01 --8.1000e+02 3.1429e+02 -1.3924e+01 --8.1000e+02 3.4286e+02 -1.3164e+01 --8.1000e+02 3.7143e+02 -1.2396e+01 --8.1000e+02 4.0000e+02 -1.1627e+01 --8.1000e+02 4.2857e+02 -1.0865e+01 --8.1000e+02 4.5714e+02 -1.0113e+01 --8.1000e+02 4.8571e+02 -9.3777e+00 --8.1000e+02 5.1429e+02 -8.6617e+00 --8.1000e+02 5.4286e+02 -7.9679e+00 --8.1000e+02 5.7143e+02 -7.2982e+00 --8.1000e+02 6.0000e+02 -6.6539e+00 --8.1000e+02 6.2857e+02 -6.0357e+00 --8.1000e+02 6.5714e+02 -5.4441e+00 --8.1000e+02 6.8571e+02 -4.8788e+00 --8.1000e+02 7.1429e+02 -4.3395e+00 --8.1000e+02 7.4286e+02 -3.8257e+00 --8.1000e+02 7.7143e+02 -3.3366e+00 --8.1000e+02 8.0000e+02 -2.8713e+00 --8.1000e+02 8.2857e+02 -2.4290e+00 --8.1000e+02 8.5714e+02 -2.0084e+00 --8.1000e+02 8.8571e+02 -1.6088e+00 --8.1000e+02 9.1429e+02 -1.2290e+00 --8.1000e+02 9.4286e+02 -8.6794e-01 --8.1000e+02 9.7143e+02 -5.2474e-01 --8.1000e+02 1.0000e+03 -1.9839e-01 --8.1000e+02 1.0286e+03 1.1205e-01 --8.1000e+02 1.0571e+03 4.0746e-01 --8.1000e+02 1.0857e+03 6.8871e-01 --8.1000e+02 1.1143e+03 9.5659e-01 --8.1000e+02 1.1429e+03 1.2119e+00 --8.1000e+02 1.1714e+03 1.4553e+00 --8.1000e+02 1.2000e+03 1.6875e+00 --8.1000e+02 1.2286e+03 1.9092e+00 --8.1000e+02 1.2571e+03 2.1209e+00 --8.1000e+02 1.2857e+03 2.3233e+00 --8.1000e+02 1.3143e+03 2.5168e+00 --8.1000e+02 1.3429e+03 2.7019e+00 --8.1000e+02 1.3714e+03 2.8792e+00 --8.1000e+02 1.4000e+03 3.0490e+00 --8.1000e+02 1.4286e+03 3.2118e+00 --8.1000e+02 1.4571e+03 3.3679e+00 --8.1000e+02 1.4857e+03 3.5177e+00 --8.1000e+02 1.5143e+03 3.6616e+00 --8.1000e+02 1.5429e+03 3.7998e+00 --8.1000e+02 1.5714e+03 3.9327e+00 --8.1000e+02 1.6000e+03 4.0605e+00 --8.1000e+02 1.6286e+03 4.1835e+00 --8.1000e+02 1.6571e+03 4.3020e+00 --8.1000e+02 1.6857e+03 4.4161e+00 --8.1000e+02 1.7143e+03 4.5261e+00 --8.1000e+02 1.7429e+03 4.6322e+00 --8.1000e+02 1.7714e+03 4.7346e+00 --8.1000e+02 1.8000e+03 4.8334e+00 --8.1000e+02 1.8286e+03 4.9288e+00 --8.1000e+02 1.8571e+03 5.0211e+00 --8.1000e+02 1.8857e+03 5.1102e+00 --8.1000e+02 1.9143e+03 5.1965e+00 --8.1000e+02 1.9429e+03 5.2799e+00 --8.1000e+02 1.9714e+03 5.3607e+00 --8.1000e+02 2.0000e+03 5.4389e+00 --7.8000e+02 -2.0000e+03 5.4065e+00 --7.8000e+02 -1.9714e+03 5.3267e+00 --7.8000e+02 -1.9429e+03 5.2443e+00 --7.8000e+02 -1.9143e+03 5.1591e+00 --7.8000e+02 -1.8857e+03 5.0710e+00 --7.8000e+02 -1.8571e+03 4.9799e+00 --7.8000e+02 -1.8286e+03 4.8855e+00 --7.8000e+02 -1.8000e+03 4.7878e+00 --7.8000e+02 -1.7714e+03 4.6866e+00 --7.8000e+02 -1.7429e+03 4.5817e+00 --7.8000e+02 -1.7143e+03 4.4728e+00 --7.8000e+02 -1.6857e+03 4.3599e+00 --7.8000e+02 -1.6571e+03 4.2426e+00 --7.8000e+02 -1.6286e+03 4.1208e+00 --7.8000e+02 -1.6000e+03 3.9941e+00 --7.8000e+02 -1.5714e+03 3.8624e+00 --7.8000e+02 -1.5429e+03 3.7253e+00 --7.8000e+02 -1.5143e+03 3.5826e+00 --7.8000e+02 -1.4857e+03 3.4338e+00 --7.8000e+02 -1.4571e+03 3.2787e+00 --7.8000e+02 -1.4286e+03 3.1169e+00 --7.8000e+02 -1.4000e+03 2.9480e+00 --7.8000e+02 -1.3714e+03 2.7715e+00 --7.8000e+02 -1.3429e+03 2.5870e+00 --7.8000e+02 -1.3143e+03 2.3940e+00 --7.8000e+02 -1.2857e+03 2.1920e+00 --7.8000e+02 -1.2571e+03 1.9803e+00 --7.8000e+02 -1.2286e+03 1.7585e+00 --7.8000e+02 -1.2000e+03 1.5258e+00 --7.8000e+02 -1.1714e+03 1.2815e+00 --7.8000e+02 -1.1429e+03 1.0249e+00 --7.8000e+02 -1.1143e+03 7.5515e-01 --7.8000e+02 -1.0857e+03 4.7144e-01 --7.8000e+02 -1.0571e+03 1.7283e-01 --7.8000e+02 -1.0286e+03 -1.4166e-01 --7.8000e+02 -1.0000e+03 -4.7306e-01 --7.8000e+02 -9.7143e+02 -8.2250e-01 --7.8000e+02 -9.4286e+02 -1.1911e+00 --7.8000e+02 -9.1429e+02 -1.5802e+00 --7.8000e+02 -8.8571e+02 -1.9909e+00 --7.8000e+02 -8.5714e+02 -2.4247e+00 --7.8000e+02 -8.2857e+02 -2.8830e+00 --7.8000e+02 -8.0000e+02 -3.3670e+00 --7.8000e+02 -7.7143e+02 -3.8783e+00 --7.8000e+02 -7.4286e+02 -4.4183e+00 --7.8000e+02 -7.1429e+02 -4.9882e+00 --7.8000e+02 -6.8571e+02 -5.5894e+00 --7.8000e+02 -6.5714e+02 -6.2230e+00 --7.8000e+02 -6.2857e+02 -6.8897e+00 --7.8000e+02 -6.0000e+02 -7.5902e+00 --7.8000e+02 -5.7143e+02 -8.3247e+00 --7.8000e+02 -5.4286e+02 -9.0928e+00 --7.8000e+02 -5.1429e+02 -9.8934e+00 --7.8000e+02 -4.8571e+02 -1.0725e+01 --7.8000e+02 -4.5714e+02 -1.1585e+01 --7.8000e+02 -4.2857e+02 -1.2468e+01 --7.8000e+02 -4.0000e+02 -1.3371e+01 --7.8000e+02 -3.7143e+02 -1.4287e+01 --7.8000e+02 -3.4286e+02 -1.5207e+01 --7.8000e+02 -3.1429e+02 -1.6123e+01 --7.8000e+02 -2.8571e+02 -1.7024e+01 --7.8000e+02 -2.5714e+02 -1.7897e+01 --7.8000e+02 -2.2857e+02 -1.8730e+01 --7.8000e+02 -2.0000e+02 -1.9509e+01 --7.8000e+02 -1.7143e+02 -2.0220e+01 --7.8000e+02 -1.4286e+02 -2.0849e+01 --7.8000e+02 -1.1429e+02 -2.1384e+01 --7.8000e+02 -8.5714e+01 -2.1813e+01 --7.8000e+02 -5.7143e+01 -2.2126e+01 --7.8000e+02 -2.8571e+01 -2.2317e+01 --7.8000e+02 0.0000e+00 -2.2382e+01 --7.8000e+02 2.8571e+01 -2.2317e+01 --7.8000e+02 5.7143e+01 -2.2126e+01 --7.8000e+02 8.5714e+01 -2.1813e+01 --7.8000e+02 1.1429e+02 -2.1384e+01 --7.8000e+02 1.4286e+02 -2.0849e+01 --7.8000e+02 1.7143e+02 -2.0220e+01 --7.8000e+02 2.0000e+02 -1.9509e+01 --7.8000e+02 2.2857e+02 -1.8730e+01 --7.8000e+02 2.5714e+02 -1.7897e+01 --7.8000e+02 2.8571e+02 -1.7024e+01 --7.8000e+02 3.1429e+02 -1.6123e+01 --7.8000e+02 3.4286e+02 -1.5207e+01 --7.8000e+02 3.7143e+02 -1.4287e+01 --7.8000e+02 4.0000e+02 -1.3371e+01 --7.8000e+02 4.2857e+02 -1.2468e+01 --7.8000e+02 4.5714e+02 -1.1585e+01 --7.8000e+02 4.8571e+02 -1.0725e+01 --7.8000e+02 5.1429e+02 -9.8934e+00 --7.8000e+02 5.4286e+02 -9.0928e+00 --7.8000e+02 5.7143e+02 -8.3247e+00 --7.8000e+02 6.0000e+02 -7.5902e+00 --7.8000e+02 6.2857e+02 -6.8897e+00 --7.8000e+02 6.5714e+02 -6.2230e+00 --7.8000e+02 6.8571e+02 -5.5894e+00 --7.8000e+02 7.1429e+02 -4.9882e+00 --7.8000e+02 7.4286e+02 -4.4183e+00 --7.8000e+02 7.7143e+02 -3.8783e+00 --7.8000e+02 8.0000e+02 -3.3670e+00 --7.8000e+02 8.2857e+02 -2.8830e+00 --7.8000e+02 8.5714e+02 -2.4247e+00 --7.8000e+02 8.8571e+02 -1.9909e+00 --7.8000e+02 9.1429e+02 -1.5802e+00 --7.8000e+02 9.4286e+02 -1.1911e+00 --7.8000e+02 9.7143e+02 -8.2250e-01 --7.8000e+02 1.0000e+03 -4.7306e-01 --7.8000e+02 1.0286e+03 -1.4166e-01 --7.8000e+02 1.0571e+03 1.7283e-01 --7.8000e+02 1.0857e+03 4.7144e-01 --7.8000e+02 1.1143e+03 7.5515e-01 --7.8000e+02 1.1429e+03 1.0249e+00 --7.8000e+02 1.1714e+03 1.2815e+00 --7.8000e+02 1.2000e+03 1.5258e+00 --7.8000e+02 1.2286e+03 1.7585e+00 --7.8000e+02 1.2571e+03 1.9803e+00 --7.8000e+02 1.2857e+03 2.1920e+00 --7.8000e+02 1.3143e+03 2.3940e+00 --7.8000e+02 1.3429e+03 2.5870e+00 --7.8000e+02 1.3714e+03 2.7715e+00 --7.8000e+02 1.4000e+03 2.9480e+00 --7.8000e+02 1.4286e+03 3.1169e+00 --7.8000e+02 1.4571e+03 3.2787e+00 --7.8000e+02 1.4857e+03 3.4338e+00 --7.8000e+02 1.5143e+03 3.5826e+00 --7.8000e+02 1.5429e+03 3.7253e+00 --7.8000e+02 1.5714e+03 3.8624e+00 --7.8000e+02 1.6000e+03 3.9941e+00 --7.8000e+02 1.6286e+03 4.1208e+00 --7.8000e+02 1.6571e+03 4.2426e+00 --7.8000e+02 1.6857e+03 4.3599e+00 --7.8000e+02 1.7143e+03 4.4728e+00 --7.8000e+02 1.7429e+03 4.5817e+00 --7.8000e+02 1.7714e+03 4.6866e+00 --7.8000e+02 1.8000e+03 4.7878e+00 --7.8000e+02 1.8286e+03 4.8855e+00 --7.8000e+02 1.8571e+03 4.9799e+00 --7.8000e+02 1.8857e+03 5.0710e+00 --7.8000e+02 1.9143e+03 5.1591e+00 --7.8000e+02 1.9429e+03 5.2443e+00 --7.8000e+02 1.9714e+03 5.3267e+00 --7.8000e+02 2.0000e+03 5.4065e+00 --7.5000e+02 -2.0000e+03 5.3747e+00 --7.5000e+02 -1.9714e+03 5.2934e+00 --7.5000e+02 -1.9429e+03 5.2093e+00 --7.5000e+02 -1.9143e+03 5.1224e+00 --7.5000e+02 -1.8857e+03 5.0324e+00 --7.5000e+02 -1.8571e+03 4.9393e+00 --7.5000e+02 -1.8286e+03 4.8429e+00 --7.5000e+02 -1.8000e+03 4.7429e+00 --7.5000e+02 -1.7714e+03 4.6393e+00 --7.5000e+02 -1.7429e+03 4.5318e+00 --7.5000e+02 -1.7143e+03 4.4202e+00 --7.5000e+02 -1.6857e+03 4.3043e+00 --7.5000e+02 -1.6571e+03 4.1839e+00 --7.5000e+02 -1.6286e+03 4.0587e+00 --7.5000e+02 -1.6000e+03 3.9284e+00 --7.5000e+02 -1.5714e+03 3.7927e+00 --7.5000e+02 -1.5429e+03 3.6514e+00 --7.5000e+02 -1.5143e+03 3.5040e+00 --7.5000e+02 -1.4857e+03 3.3503e+00 --7.5000e+02 -1.4571e+03 3.1899e+00 --7.5000e+02 -1.4286e+03 3.0223e+00 --7.5000e+02 -1.4000e+03 2.8471e+00 --7.5000e+02 -1.3714e+03 2.6638e+00 --7.5000e+02 -1.3429e+03 2.4719e+00 --7.5000e+02 -1.3143e+03 2.2708e+00 --7.5000e+02 -1.2857e+03 2.0600e+00 --7.5000e+02 -1.2571e+03 1.8387e+00 --7.5000e+02 -1.2286e+03 1.6064e+00 --7.5000e+02 -1.2000e+03 1.3622e+00 --7.5000e+02 -1.1714e+03 1.1054e+00 --7.5000e+02 -1.1429e+03 8.3500e-01 --7.5000e+02 -1.1143e+03 5.5014e-01 --7.5000e+02 -1.0857e+03 2.4978e-01 --7.5000e+02 -1.0571e+03 -6.7162e-02 --7.5000e+02 -1.0286e+03 -4.0187e-01 --7.5000e+02 -1.0000e+03 -7.5562e-01 --7.5000e+02 -9.7143e+02 -1.1297e+00 --7.5000e+02 -9.4286e+02 -1.5257e+00 --7.5000e+02 -9.1429e+02 -1.9450e+00 --7.5000e+02 -8.8571e+02 -2.3894e+00 --7.5000e+02 -8.5714e+02 -2.8605e+00 --7.5000e+02 -8.2857e+02 -3.3602e+00 --7.5000e+02 -8.0000e+02 -3.8903e+00 --7.5000e+02 -7.7143e+02 -4.4528e+00 --7.5000e+02 -7.4286e+02 -5.0497e+00 --7.5000e+02 -7.1429e+02 -5.6830e+00 --7.5000e+02 -6.8571e+02 -6.3546e+00 --7.5000e+02 -6.5714e+02 -7.0663e+00 --7.5000e+02 -6.2857e+02 -7.8196e+00 --7.5000e+02 -6.0000e+02 -8.6160e+00 --7.5000e+02 -5.7143e+02 -9.4562e+00 --7.5000e+02 -5.4286e+02 -1.0341e+01 --7.5000e+02 -5.1429e+02 -1.1269e+01 --7.5000e+02 -4.8571e+02 -1.2239e+01 --7.5000e+02 -4.5714e+02 -1.3249e+01 --7.5000e+02 -4.2857e+02 -1.4295e+01 --7.5000e+02 -4.0000e+02 -1.5371e+01 --7.5000e+02 -3.7143e+02 -1.6468e+01 --7.5000e+02 -3.4286e+02 -1.7579e+01 --7.5000e+02 -3.1429e+02 -1.8691e+01 --7.5000e+02 -2.8571e+02 -1.9791e+01 --7.5000e+02 -2.5714e+02 -2.0862e+01 --7.5000e+02 -2.2857e+02 -2.1889e+01 --7.5000e+02 -2.0000e+02 -2.2853e+01 --7.5000e+02 -1.7143e+02 -2.3736e+01 --7.5000e+02 -1.4286e+02 -2.4520e+01 --7.5000e+02 -1.1429e+02 -2.5188e+01 --7.5000e+02 -8.5714e+01 -2.5724e+01 --7.5000e+02 -5.7143e+01 -2.6117e+01 --7.5000e+02 -2.8571e+01 -2.6357e+01 --7.5000e+02 0.0000e+00 -2.6437e+01 --7.5000e+02 2.8571e+01 -2.6357e+01 --7.5000e+02 5.7143e+01 -2.6117e+01 --7.5000e+02 8.5714e+01 -2.5724e+01 --7.5000e+02 1.1429e+02 -2.5188e+01 --7.5000e+02 1.4286e+02 -2.4520e+01 --7.5000e+02 1.7143e+02 -2.3736e+01 --7.5000e+02 2.0000e+02 -2.2853e+01 --7.5000e+02 2.2857e+02 -2.1889e+01 --7.5000e+02 2.5714e+02 -2.0862e+01 --7.5000e+02 2.8571e+02 -1.9791e+01 --7.5000e+02 3.1429e+02 -1.8691e+01 --7.5000e+02 3.4286e+02 -1.7579e+01 --7.5000e+02 3.7143e+02 -1.6468e+01 --7.5000e+02 4.0000e+02 -1.5371e+01 --7.5000e+02 4.2857e+02 -1.4295e+01 --7.5000e+02 4.5714e+02 -1.3249e+01 --7.5000e+02 4.8571e+02 -1.2239e+01 --7.5000e+02 5.1429e+02 -1.1269e+01 --7.5000e+02 5.4286e+02 -1.0341e+01 --7.5000e+02 5.7143e+02 -9.4562e+00 --7.5000e+02 6.0000e+02 -8.6160e+00 --7.5000e+02 6.2857e+02 -7.8196e+00 --7.5000e+02 6.5714e+02 -7.0663e+00 --7.5000e+02 6.8571e+02 -6.3546e+00 --7.5000e+02 7.1429e+02 -5.6830e+00 --7.5000e+02 7.4286e+02 -5.0497e+00 --7.5000e+02 7.7143e+02 -4.4528e+00 --7.5000e+02 8.0000e+02 -3.8903e+00 --7.5000e+02 8.2857e+02 -3.3602e+00 --7.5000e+02 8.5714e+02 -2.8605e+00 --7.5000e+02 8.8571e+02 -2.3894e+00 --7.5000e+02 9.1429e+02 -1.9450e+00 --7.5000e+02 9.4286e+02 -1.5257e+00 --7.5000e+02 9.7143e+02 -1.1297e+00 --7.5000e+02 1.0000e+03 -7.5562e-01 --7.5000e+02 1.0286e+03 -4.0187e-01 --7.5000e+02 1.0571e+03 -6.7162e-02 --7.5000e+02 1.0857e+03 2.4978e-01 --7.5000e+02 1.1143e+03 5.5014e-01 --7.5000e+02 1.1429e+03 8.3500e-01 --7.5000e+02 1.1714e+03 1.1054e+00 --7.5000e+02 1.2000e+03 1.3622e+00 --7.5000e+02 1.2286e+03 1.6064e+00 --7.5000e+02 1.2571e+03 1.8387e+00 --7.5000e+02 1.2857e+03 2.0600e+00 --7.5000e+02 1.3143e+03 2.2708e+00 --7.5000e+02 1.3429e+03 2.4719e+00 --7.5000e+02 1.3714e+03 2.6638e+00 --7.5000e+02 1.4000e+03 2.8471e+00 --7.5000e+02 1.4286e+03 3.0223e+00 --7.5000e+02 1.4571e+03 3.1899e+00 --7.5000e+02 1.4857e+03 3.3503e+00 --7.5000e+02 1.5143e+03 3.5040e+00 --7.5000e+02 1.5429e+03 3.6514e+00 --7.5000e+02 1.5714e+03 3.7927e+00 --7.5000e+02 1.6000e+03 3.9284e+00 --7.5000e+02 1.6286e+03 4.0587e+00 --7.5000e+02 1.6571e+03 4.1839e+00 --7.5000e+02 1.6857e+03 4.3043e+00 --7.5000e+02 1.7143e+03 4.4202e+00 --7.5000e+02 1.7429e+03 4.5318e+00 --7.5000e+02 1.7714e+03 4.6393e+00 --7.5000e+02 1.8000e+03 4.7429e+00 --7.5000e+02 1.8286e+03 4.8429e+00 --7.5000e+02 1.8571e+03 4.9393e+00 --7.5000e+02 1.8857e+03 5.0324e+00 --7.5000e+02 1.9143e+03 5.1224e+00 --7.5000e+02 1.9429e+03 5.2093e+00 --7.5000e+02 1.9714e+03 5.2934e+00 --7.5000e+02 2.0000e+03 5.3747e+00 --7.2000e+02 -2.0000e+03 5.3435e+00 --7.2000e+02 -1.9714e+03 5.2607e+00 --7.2000e+02 -1.9429e+03 5.1750e+00 --7.2000e+02 -1.9143e+03 5.0864e+00 --7.2000e+02 -1.8857e+03 4.9946e+00 --7.2000e+02 -1.8571e+03 4.8995e+00 --7.2000e+02 -1.8286e+03 4.8010e+00 --7.2000e+02 -1.8000e+03 4.6988e+00 --7.2000e+02 -1.7714e+03 4.5928e+00 --7.2000e+02 -1.7429e+03 4.4827e+00 --7.2000e+02 -1.7143e+03 4.3684e+00 --7.2000e+02 -1.6857e+03 4.2496e+00 --7.2000e+02 -1.6571e+03 4.1259e+00 --7.2000e+02 -1.6286e+03 3.9973e+00 --7.2000e+02 -1.6000e+03 3.8633e+00 --7.2000e+02 -1.5714e+03 3.7237e+00 --7.2000e+02 -1.5429e+03 3.5781e+00 --7.2000e+02 -1.5143e+03 3.4261e+00 --7.2000e+02 -1.4857e+03 3.2674e+00 --7.2000e+02 -1.4571e+03 3.1016e+00 --7.2000e+02 -1.4286e+03 2.9281e+00 --7.2000e+02 -1.4000e+03 2.7465e+00 --7.2000e+02 -1.3714e+03 2.5562e+00 --7.2000e+02 -1.3429e+03 2.3567e+00 --7.2000e+02 -1.3143e+03 2.1474e+00 --7.2000e+02 -1.2857e+03 1.9276e+00 --7.2000e+02 -1.2571e+03 1.6965e+00 --7.2000e+02 -1.2286e+03 1.4533e+00 --7.2000e+02 -1.2000e+03 1.1973e+00 --7.2000e+02 -1.1714e+03 9.2737e-01 --7.2000e+02 -1.1429e+03 6.4262e-01 --7.2000e+02 -1.1143e+03 3.4193e-01 --7.2000e+02 -1.0857e+03 2.4092e-02 --7.2000e+02 -1.0571e+03 -3.1218e-01 --7.2000e+02 -1.0286e+03 -6.6830e-01 --7.2000e+02 -1.0000e+03 -1.0458e+00 --7.2000e+02 -9.7143e+02 -1.4463e+00 --7.2000e+02 -9.4286e+02 -1.8716e+00 --7.2000e+02 -9.1429e+02 -2.3236e+00 --7.2000e+02 -8.8571e+02 -2.8044e+00 --7.2000e+02 -8.5714e+02 -3.3162e+00 --7.2000e+02 -8.2857e+02 -3.8613e+00 --7.2000e+02 -8.0000e+02 -4.4424e+00 --7.2000e+02 -7.7143e+02 -5.0618e+00 --7.2000e+02 -7.4286e+02 -5.7226e+00 --7.2000e+02 -7.1429e+02 -6.4273e+00 --7.2000e+02 -6.8571e+02 -7.1789e+00 --7.2000e+02 -6.5714e+02 -7.9801e+00 --7.2000e+02 -6.2857e+02 -8.8336e+00 --7.2000e+02 -6.0000e+02 -9.7417e+00 --7.2000e+02 -5.7143e+02 -1.0706e+01 --7.2000e+02 -5.4286e+02 -1.1729e+01 --7.2000e+02 -5.1429e+02 -1.2809e+01 --7.2000e+02 -4.8571e+02 -1.3947e+01 --7.2000e+02 -4.5714e+02 -1.5140e+01 --7.2000e+02 -4.2857e+02 -1.6385e+01 --7.2000e+02 -4.0000e+02 -1.7673e+01 --7.2000e+02 -3.7143e+02 -1.8998e+01 --7.2000e+02 -3.4286e+02 -2.0346e+01 --7.2000e+02 -3.1429e+02 -2.1704e+01 --7.2000e+02 -2.8571e+02 -2.3054e+01 --7.2000e+02 -2.5714e+02 -2.4377e+01 --7.2000e+02 -2.2857e+02 -2.5648e+01 --7.2000e+02 -2.0000e+02 -2.6846e+01 --7.2000e+02 -1.7143e+02 -2.7947e+01 --7.2000e+02 -1.4286e+02 -2.8925e+01 --7.2000e+02 -1.1429e+02 -2.9760e+01 --7.2000e+02 -8.5714e+01 -3.0431e+01 --7.2000e+02 -5.7143e+01 -3.0923e+01 --7.2000e+02 -2.8571e+01 -3.1223e+01 --7.2000e+02 0.0000e+00 -3.1323e+01 --7.2000e+02 2.8571e+01 -3.1223e+01 --7.2000e+02 5.7143e+01 -3.0923e+01 --7.2000e+02 8.5714e+01 -3.0431e+01 --7.2000e+02 1.1429e+02 -2.9760e+01 --7.2000e+02 1.4286e+02 -2.8925e+01 --7.2000e+02 1.7143e+02 -2.7947e+01 --7.2000e+02 2.0000e+02 -2.6846e+01 --7.2000e+02 2.2857e+02 -2.5648e+01 --7.2000e+02 2.5714e+02 -2.4377e+01 --7.2000e+02 2.8571e+02 -2.3054e+01 --7.2000e+02 3.1429e+02 -2.1704e+01 --7.2000e+02 3.4286e+02 -2.0346e+01 --7.2000e+02 3.7143e+02 -1.8998e+01 --7.2000e+02 4.0000e+02 -1.7673e+01 --7.2000e+02 4.2857e+02 -1.6385e+01 --7.2000e+02 4.5714e+02 -1.5140e+01 --7.2000e+02 4.8571e+02 -1.3947e+01 --7.2000e+02 5.1429e+02 -1.2809e+01 --7.2000e+02 5.4286e+02 -1.1729e+01 --7.2000e+02 5.7143e+02 -1.0706e+01 --7.2000e+02 6.0000e+02 -9.7417e+00 --7.2000e+02 6.2857e+02 -8.8336e+00 --7.2000e+02 6.5714e+02 -7.9801e+00 --7.2000e+02 6.8571e+02 -7.1789e+00 --7.2000e+02 7.1429e+02 -6.4273e+00 --7.2000e+02 7.4286e+02 -5.7226e+00 --7.2000e+02 7.7143e+02 -5.0618e+00 --7.2000e+02 8.0000e+02 -4.4424e+00 --7.2000e+02 8.2857e+02 -3.8613e+00 --7.2000e+02 8.5714e+02 -3.3162e+00 --7.2000e+02 8.8571e+02 -2.8044e+00 --7.2000e+02 9.1429e+02 -2.3236e+00 --7.2000e+02 9.4286e+02 -1.8716e+00 --7.2000e+02 9.7143e+02 -1.4463e+00 --7.2000e+02 1.0000e+03 -1.0458e+00 --7.2000e+02 1.0286e+03 -6.6830e-01 --7.2000e+02 1.0571e+03 -3.1218e-01 --7.2000e+02 1.0857e+03 2.4092e-02 --7.2000e+02 1.1143e+03 3.4193e-01 --7.2000e+02 1.1429e+03 6.4262e-01 --7.2000e+02 1.1714e+03 9.2737e-01 --7.2000e+02 1.2000e+03 1.1973e+00 --7.2000e+02 1.2286e+03 1.4533e+00 --7.2000e+02 1.2571e+03 1.6965e+00 --7.2000e+02 1.2857e+03 1.9276e+00 --7.2000e+02 1.3143e+03 2.1474e+00 --7.2000e+02 1.3429e+03 2.3567e+00 --7.2000e+02 1.3714e+03 2.5562e+00 --7.2000e+02 1.4000e+03 2.7465e+00 --7.2000e+02 1.4286e+03 2.9281e+00 --7.2000e+02 1.4571e+03 3.1016e+00 --7.2000e+02 1.4857e+03 3.2674e+00 --7.2000e+02 1.5143e+03 3.4261e+00 --7.2000e+02 1.5429e+03 3.5781e+00 --7.2000e+02 1.5714e+03 3.7237e+00 --7.2000e+02 1.6000e+03 3.8633e+00 --7.2000e+02 1.6286e+03 3.9973e+00 --7.2000e+02 1.6571e+03 4.1259e+00 --7.2000e+02 1.6857e+03 4.2496e+00 --7.2000e+02 1.7143e+03 4.3684e+00 --7.2000e+02 1.7429e+03 4.4827e+00 --7.2000e+02 1.7714e+03 4.5928e+00 --7.2000e+02 1.8000e+03 4.6988e+00 --7.2000e+02 1.8286e+03 4.8010e+00 --7.2000e+02 1.8571e+03 4.8995e+00 --7.2000e+02 1.8857e+03 4.9946e+00 --7.2000e+02 1.9143e+03 5.0864e+00 --7.2000e+02 1.9429e+03 5.1750e+00 --7.2000e+02 1.9714e+03 5.2607e+00 --7.2000e+02 2.0000e+03 5.3435e+00 --6.9000e+02 -2.0000e+03 5.3131e+00 --6.9000e+02 -1.9714e+03 5.2288e+00 --6.9000e+02 -1.9429e+03 5.1415e+00 --6.9000e+02 -1.9143e+03 5.0512e+00 --6.9000e+02 -1.8857e+03 4.9576e+00 --6.9000e+02 -1.8571e+03 4.8606e+00 --6.9000e+02 -1.8286e+03 4.7600e+00 --6.9000e+02 -1.8000e+03 4.6556e+00 --6.9000e+02 -1.7714e+03 4.5472e+00 --6.9000e+02 -1.7429e+03 4.4345e+00 --6.9000e+02 -1.7143e+03 4.3175e+00 --6.9000e+02 -1.6857e+03 4.1957e+00 --6.9000e+02 -1.6571e+03 4.0689e+00 --6.9000e+02 -1.6286e+03 3.9368e+00 --6.9000e+02 -1.6000e+03 3.7992e+00 --6.9000e+02 -1.5714e+03 3.6556e+00 --6.9000e+02 -1.5429e+03 3.5057e+00 --6.9000e+02 -1.5143e+03 3.3491e+00 --6.9000e+02 -1.4857e+03 3.1853e+00 --6.9000e+02 -1.4571e+03 3.0140e+00 --6.9000e+02 -1.4286e+03 2.8345e+00 --6.9000e+02 -1.4000e+03 2.6464e+00 --6.9000e+02 -1.3714e+03 2.4491e+00 --6.9000e+02 -1.3429e+03 2.2419e+00 --6.9000e+02 -1.3143e+03 2.0242e+00 --6.9000e+02 -1.2857e+03 1.7951e+00 --6.9000e+02 -1.2571e+03 1.5538e+00 --6.9000e+02 -1.2286e+03 1.2995e+00 --6.9000e+02 -1.2000e+03 1.0312e+00 --6.9000e+02 -1.1714e+03 7.4781e-01 --6.9000e+02 -1.1429e+03 4.4813e-01 --6.9000e+02 -1.1143e+03 1.3092e-01 --6.9000e+02 -1.0857e+03 -2.0522e-01 --6.9000e+02 -1.0571e+03 -5.6181e-01 --6.9000e+02 -1.0286e+03 -9.4053e-01 --6.9000e+02 -1.0000e+03 -1.3432e+00 --6.9000e+02 -9.7143e+02 -1.7718e+00 --6.9000e+02 -9.4286e+02 -2.2285e+00 --6.9000e+02 -9.1429e+02 -2.7157e+00 --6.9000e+02 -8.8571e+02 -3.2360e+00 --6.9000e+02 -8.5714e+02 -3.7921e+00 --6.9000e+02 -8.2857e+02 -4.3871e+00 --6.9000e+02 -8.0000e+02 -5.0243e+00 --6.9000e+02 -7.7143e+02 -5.7071e+00 --6.9000e+02 -7.4286e+02 -6.4392e+00 --6.9000e+02 -7.1429e+02 -7.2246e+00 --6.9000e+02 -6.8571e+02 -8.0672e+00 --6.9000e+02 -6.5714e+02 -8.9712e+00 --6.9000e+02 -6.2857e+02 -9.9405e+00 --6.9000e+02 -6.0000e+02 -1.0979e+01 --6.9000e+02 -5.7143e+02 -1.2090e+01 --6.9000e+02 -5.4286e+02 -1.3276e+01 --6.9000e+02 -5.1429e+02 -1.4540e+01 --6.9000e+02 -4.8571e+02 -1.5880e+01 --6.9000e+02 -4.5714e+02 -1.7296e+01 --6.9000e+02 -4.2857e+02 -1.8784e+01 --6.9000e+02 -4.0000e+02 -2.0336e+01 --6.9000e+02 -3.7143e+02 -2.1942e+01 --6.9000e+02 -3.4286e+02 -2.3586e+01 --6.9000e+02 -3.1429e+02 -2.5251e+01 --6.9000e+02 -2.8571e+02 -2.6914e+01 --6.9000e+02 -2.5714e+02 -2.8548e+01 --6.9000e+02 -2.2857e+02 -3.0123e+01 --6.9000e+02 -2.0000e+02 -3.1610e+01 --6.9000e+02 -1.7143e+02 -3.2976e+01 --6.9000e+02 -1.4286e+02 -3.4191e+01 --6.9000e+02 -1.1429e+02 -3.5227e+01 --6.9000e+02 -8.5714e+01 -3.6060e+01 --6.9000e+02 -5.7143e+01 -3.6670e+01 --6.9000e+02 -2.8571e+01 -3.7041e+01 --6.9000e+02 0.0000e+00 -3.7166e+01 --6.9000e+02 2.8571e+01 -3.7041e+01 --6.9000e+02 5.7143e+01 -3.6670e+01 --6.9000e+02 8.5714e+01 -3.6060e+01 --6.9000e+02 1.1429e+02 -3.5227e+01 --6.9000e+02 1.4286e+02 -3.4191e+01 --6.9000e+02 1.7143e+02 -3.2976e+01 --6.9000e+02 2.0000e+02 -3.1610e+01 --6.9000e+02 2.2857e+02 -3.0123e+01 --6.9000e+02 2.5714e+02 -2.8548e+01 --6.9000e+02 2.8571e+02 -2.6914e+01 --6.9000e+02 3.1429e+02 -2.5251e+01 --6.9000e+02 3.4286e+02 -2.3586e+01 --6.9000e+02 3.7143e+02 -2.1942e+01 --6.9000e+02 4.0000e+02 -2.0336e+01 --6.9000e+02 4.2857e+02 -1.8784e+01 --6.9000e+02 4.5714e+02 -1.7296e+01 --6.9000e+02 4.8571e+02 -1.5880e+01 --6.9000e+02 5.1429e+02 -1.4540e+01 --6.9000e+02 5.4286e+02 -1.3276e+01 --6.9000e+02 5.7143e+02 -1.2090e+01 --6.9000e+02 6.0000e+02 -1.0979e+01 --6.9000e+02 6.2857e+02 -9.9405e+00 --6.9000e+02 6.5714e+02 -8.9712e+00 --6.9000e+02 6.8571e+02 -8.0672e+00 --6.9000e+02 7.1429e+02 -7.2246e+00 --6.9000e+02 7.4286e+02 -6.4392e+00 --6.9000e+02 7.7143e+02 -5.7071e+00 --6.9000e+02 8.0000e+02 -5.0243e+00 --6.9000e+02 8.2857e+02 -4.3871e+00 --6.9000e+02 8.5714e+02 -3.7921e+00 --6.9000e+02 8.8571e+02 -3.2360e+00 --6.9000e+02 9.1429e+02 -2.7157e+00 --6.9000e+02 9.4286e+02 -2.2285e+00 --6.9000e+02 9.7143e+02 -1.7718e+00 --6.9000e+02 1.0000e+03 -1.3432e+00 --6.9000e+02 1.0286e+03 -9.4053e-01 --6.9000e+02 1.0571e+03 -5.6181e-01 --6.9000e+02 1.0857e+03 -2.0522e-01 --6.9000e+02 1.1143e+03 1.3092e-01 --6.9000e+02 1.1429e+03 4.4813e-01 --6.9000e+02 1.1714e+03 7.4781e-01 --6.9000e+02 1.2000e+03 1.0312e+00 --6.9000e+02 1.2286e+03 1.2995e+00 --6.9000e+02 1.2571e+03 1.5538e+00 --6.9000e+02 1.2857e+03 1.7951e+00 --6.9000e+02 1.3143e+03 2.0242e+00 --6.9000e+02 1.3429e+03 2.2419e+00 --6.9000e+02 1.3714e+03 2.4491e+00 --6.9000e+02 1.4000e+03 2.6464e+00 --6.9000e+02 1.4286e+03 2.8345e+00 --6.9000e+02 1.4571e+03 3.0140e+00 --6.9000e+02 1.4857e+03 3.1853e+00 --6.9000e+02 1.5143e+03 3.3491e+00 --6.9000e+02 1.5429e+03 3.5057e+00 --6.9000e+02 1.5714e+03 3.6556e+00 --6.9000e+02 1.6000e+03 3.7992e+00 --6.9000e+02 1.6286e+03 3.9368e+00 --6.9000e+02 1.6571e+03 4.0689e+00 --6.9000e+02 1.6857e+03 4.1957e+00 --6.9000e+02 1.7143e+03 4.3175e+00 --6.9000e+02 1.7429e+03 4.4345e+00 --6.9000e+02 1.7714e+03 4.5472e+00 --6.9000e+02 1.8000e+03 4.6556e+00 --6.9000e+02 1.8286e+03 4.7600e+00 --6.9000e+02 1.8571e+03 4.8606e+00 --6.9000e+02 1.8857e+03 4.9576e+00 --6.9000e+02 1.9143e+03 5.0512e+00 --6.9000e+02 1.9429e+03 5.1415e+00 --6.9000e+02 1.9714e+03 5.2288e+00 --6.9000e+02 2.0000e+03 5.3131e+00 --6.6000e+02 -2.0000e+03 5.2835e+00 --6.6000e+02 -1.9714e+03 5.1977e+00 --6.6000e+02 -1.9429e+03 5.1088e+00 --6.6000e+02 -1.9143e+03 5.0168e+00 --6.6000e+02 -1.8857e+03 4.9214e+00 --6.6000e+02 -1.8571e+03 4.8225e+00 --6.6000e+02 -1.8286e+03 4.7198e+00 --6.6000e+02 -1.8000e+03 4.6132e+00 --6.6000e+02 -1.7714e+03 4.5025e+00 --6.6000e+02 -1.7429e+03 4.3873e+00 --6.6000e+02 -1.7143e+03 4.2675e+00 --6.6000e+02 -1.6857e+03 4.1428e+00 --6.6000e+02 -1.6571e+03 4.0129e+00 --6.6000e+02 -1.6286e+03 3.8774e+00 --6.6000e+02 -1.6000e+03 3.7361e+00 --6.6000e+02 -1.5714e+03 3.5885e+00 --6.6000e+02 -1.5429e+03 3.4343e+00 --6.6000e+02 -1.5143e+03 3.2730e+00 --6.6000e+02 -1.4857e+03 3.1042e+00 --6.6000e+02 -1.4571e+03 2.9273e+00 --6.6000e+02 -1.4286e+03 2.7419e+00 --6.6000e+02 -1.4000e+03 2.5472e+00 --6.6000e+02 -1.3714e+03 2.3427e+00 --6.6000e+02 -1.3429e+03 2.1277e+00 --6.6000e+02 -1.3143e+03 1.9013e+00 --6.6000e+02 -1.2857e+03 1.6628e+00 --6.6000e+02 -1.2571e+03 1.4112e+00 --6.6000e+02 -1.2286e+03 1.1455e+00 --6.6000e+02 -1.2000e+03 8.6453e-01 --6.6000e+02 -1.1714e+03 5.6715e-01 --6.6000e+02 -1.1429e+03 2.5201e-01 --6.6000e+02 -1.1143e+03 -8.2383e-02 --6.6000e+02 -1.0857e+03 -4.3764e-01 --6.6000e+02 -1.0571e+03 -8.1554e-01 --6.6000e+02 -1.0286e+03 -1.2181e+00 --6.6000e+02 -1.0000e+03 -1.6473e+00 --6.6000e+02 -9.7143e+02 -2.1058e+00 --6.6000e+02 -9.4286e+02 -2.5961e+00 --6.6000e+02 -9.1429e+02 -3.1211e+00 --6.6000e+02 -8.8571e+02 -3.6840e+00 --6.6000e+02 -8.5714e+02 -4.2883e+00 --6.6000e+02 -8.2857e+02 -4.9379e+00 --6.6000e+02 -8.0000e+02 -5.6369e+00 --6.6000e+02 -7.7143e+02 -6.3900e+00 --6.6000e+02 -7.4286e+02 -7.2021e+00 --6.6000e+02 -7.1429e+02 -8.0784e+00 --6.6000e+02 -6.8571e+02 -9.0245e+00 --6.6000e+02 -6.5714e+02 -1.0046e+01 --6.6000e+02 -6.2857e+02 -1.1150e+01 --6.6000e+02 -6.0000e+02 -1.2340e+01 --6.6000e+02 -5.7143e+02 -1.3624e+01 --6.6000e+02 -5.4286e+02 -1.5005e+01 --6.6000e+02 -5.1429e+02 -1.6488e+01 --6.6000e+02 -4.8571e+02 -1.8073e+01 --6.6000e+02 -4.5714e+02 -1.9761e+01 --6.6000e+02 -4.2857e+02 -2.1547e+01 --6.6000e+02 -4.0000e+02 -2.3422e+01 --6.6000e+02 -3.7143e+02 -2.5374e+01 --6.6000e+02 -3.4286e+02 -2.7383e+01 --6.6000e+02 -3.1429e+02 -2.9425e+01 --6.6000e+02 -2.8571e+02 -3.1468e+01 --6.6000e+02 -2.5714e+02 -3.3479e+01 --6.6000e+02 -2.2857e+02 -3.5417e+01 --6.6000e+02 -2.0000e+02 -3.7243e+01 --6.6000e+02 -1.7143e+02 -3.8917e+01 --6.6000e+02 -1.4286e+02 -4.0401e+01 --6.6000e+02 -1.1429e+02 -4.1663e+01 --6.6000e+02 -8.5714e+01 -4.2674e+01 --6.6000e+02 -5.7143e+01 -4.3412e+01 --6.6000e+02 -2.8571e+01 -4.3861e+01 --6.6000e+02 0.0000e+00 -4.4012e+01 --6.6000e+02 2.8571e+01 -4.3861e+01 --6.6000e+02 5.7143e+01 -4.3412e+01 --6.6000e+02 8.5714e+01 -4.2674e+01 --6.6000e+02 1.1429e+02 -4.1663e+01 --6.6000e+02 1.4286e+02 -4.0401e+01 --6.6000e+02 1.7143e+02 -3.8917e+01 --6.6000e+02 2.0000e+02 -3.7243e+01 --6.6000e+02 2.2857e+02 -3.5417e+01 --6.6000e+02 2.5714e+02 -3.3479e+01 --6.6000e+02 2.8571e+02 -3.1468e+01 --6.6000e+02 3.1429e+02 -2.9425e+01 --6.6000e+02 3.4286e+02 -2.7383e+01 --6.6000e+02 3.7143e+02 -2.5374e+01 --6.6000e+02 4.0000e+02 -2.3422e+01 --6.6000e+02 4.2857e+02 -2.1547e+01 --6.6000e+02 4.5714e+02 -1.9761e+01 --6.6000e+02 4.8571e+02 -1.8073e+01 --6.6000e+02 5.1429e+02 -1.6488e+01 --6.6000e+02 5.4286e+02 -1.5005e+01 --6.6000e+02 5.7143e+02 -1.3624e+01 --6.6000e+02 6.0000e+02 -1.2340e+01 --6.6000e+02 6.2857e+02 -1.1150e+01 --6.6000e+02 6.5714e+02 -1.0046e+01 --6.6000e+02 6.8571e+02 -9.0245e+00 --6.6000e+02 7.1429e+02 -8.0784e+00 --6.6000e+02 7.4286e+02 -7.2021e+00 --6.6000e+02 7.7143e+02 -6.3900e+00 --6.6000e+02 8.0000e+02 -5.6369e+00 --6.6000e+02 8.2857e+02 -4.9379e+00 --6.6000e+02 8.5714e+02 -4.2883e+00 --6.6000e+02 8.8571e+02 -3.6840e+00 --6.6000e+02 9.1429e+02 -3.1211e+00 --6.6000e+02 9.4286e+02 -2.5961e+00 --6.6000e+02 9.7143e+02 -2.1058e+00 --6.6000e+02 1.0000e+03 -1.6473e+00 --6.6000e+02 1.0286e+03 -1.2181e+00 --6.6000e+02 1.0571e+03 -8.1554e-01 --6.6000e+02 1.0857e+03 -4.3764e-01 --6.6000e+02 1.1143e+03 -8.2383e-02 --6.6000e+02 1.1429e+03 2.5201e-01 --6.6000e+02 1.1714e+03 5.6715e-01 --6.6000e+02 1.2000e+03 8.6453e-01 --6.6000e+02 1.2286e+03 1.1455e+00 --6.6000e+02 1.2571e+03 1.4112e+00 --6.6000e+02 1.2857e+03 1.6628e+00 --6.6000e+02 1.3143e+03 1.9013e+00 --6.6000e+02 1.3429e+03 2.1277e+00 --6.6000e+02 1.3714e+03 2.3427e+00 --6.6000e+02 1.4000e+03 2.5472e+00 --6.6000e+02 1.4286e+03 2.7419e+00 --6.6000e+02 1.4571e+03 2.9273e+00 --6.6000e+02 1.4857e+03 3.1042e+00 --6.6000e+02 1.5143e+03 3.2730e+00 --6.6000e+02 1.5429e+03 3.4343e+00 --6.6000e+02 1.5714e+03 3.5885e+00 --6.6000e+02 1.6000e+03 3.7361e+00 --6.6000e+02 1.6286e+03 3.8774e+00 --6.6000e+02 1.6571e+03 4.0129e+00 --6.6000e+02 1.6857e+03 4.1428e+00 --6.6000e+02 1.7143e+03 4.2675e+00 --6.6000e+02 1.7429e+03 4.3873e+00 --6.6000e+02 1.7714e+03 4.5025e+00 --6.6000e+02 1.8000e+03 4.6132e+00 --6.6000e+02 1.8286e+03 4.7198e+00 --6.6000e+02 1.8571e+03 4.8225e+00 --6.6000e+02 1.8857e+03 4.9214e+00 --6.6000e+02 1.9143e+03 5.0168e+00 --6.6000e+02 1.9429e+03 5.1088e+00 --6.6000e+02 1.9714e+03 5.1977e+00 --6.6000e+02 2.0000e+03 5.2835e+00 --6.3000e+02 -2.0000e+03 5.2547e+00 --6.3000e+02 -1.9714e+03 5.1674e+00 --6.3000e+02 -1.9429e+03 5.0770e+00 --6.3000e+02 -1.9143e+03 4.9834e+00 --6.3000e+02 -1.8857e+03 4.8862e+00 --6.3000e+02 -1.8571e+03 4.7854e+00 --6.3000e+02 -1.8286e+03 4.6807e+00 --6.3000e+02 -1.8000e+03 4.5719e+00 --6.3000e+02 -1.7714e+03 4.4588e+00 --6.3000e+02 -1.7429e+03 4.3412e+00 --6.3000e+02 -1.7143e+03 4.2187e+00 --6.3000e+02 -1.6857e+03 4.0911e+00 --6.3000e+02 -1.6571e+03 3.9580e+00 --6.3000e+02 -1.6286e+03 3.8192e+00 --6.3000e+02 -1.6000e+03 3.6742e+00 --6.3000e+02 -1.5714e+03 3.5226e+00 --6.3000e+02 -1.5429e+03 3.3641e+00 --6.3000e+02 -1.5143e+03 3.1981e+00 --6.3000e+02 -1.4857e+03 3.0242e+00 --6.3000e+02 -1.4571e+03 2.8418e+00 --6.3000e+02 -1.4286e+03 2.6503e+00 --6.3000e+02 -1.4000e+03 2.4491e+00 --6.3000e+02 -1.3714e+03 2.2374e+00 --6.3000e+02 -1.3429e+03 2.0144e+00 --6.3000e+02 -1.3143e+03 1.7793e+00 --6.3000e+02 -1.2857e+03 1.5312e+00 --6.3000e+02 -1.2571e+03 1.2690e+00 --6.3000e+02 -1.2286e+03 9.9155e-01 --6.3000e+02 -1.2000e+03 6.9765e-01 --6.3000e+02 -1.1714e+03 3.8590e-01 --6.3000e+02 -1.1429e+03 5.4774e-02 --6.3000e+02 -1.1143e+03 -2.9743e-01 --6.3000e+02 -1.0857e+03 -6.7257e-01 --6.3000e+02 -1.0571e+03 -1.0727e+00 --6.3000e+02 -1.0286e+03 -1.5002e+00 --6.3000e+02 -1.0000e+03 -1.9576e+00 --6.3000e+02 -9.7143e+02 -2.4477e+00 --6.3000e+02 -9.4286e+02 -2.9738e+00 --6.3000e+02 -9.1429e+02 -3.5392e+00 --6.3000e+02 -8.8571e+02 -4.1481e+00 --6.3000e+02 -8.5714e+02 -4.8047e+00 --6.3000e+02 -8.2857e+02 -5.5139e+00 --6.3000e+02 -8.0000e+02 -6.2810e+00 --6.3000e+02 -7.7143e+02 -7.1119e+00 --6.3000e+02 -7.4286e+02 -8.0132e+00 --6.3000e+02 -7.1429e+02 -8.9919e+00 --6.3000e+02 -6.8571e+02 -1.0056e+01 --6.3000e+02 -6.5714e+02 -1.1213e+01 --6.3000e+02 -6.2857e+02 -1.2471e+01 --6.3000e+02 -6.0000e+02 -1.3839e+01 --6.3000e+02 -5.7143e+02 -1.5326e+01 --6.3000e+02 -5.4286e+02 -1.6939e+01 --6.3000e+02 -5.1429e+02 -1.8684e+01 --6.3000e+02 -4.8571e+02 -2.0565e+01 --6.3000e+02 -4.5714e+02 -2.2581e+01 --6.3000e+02 -4.2857e+02 -2.4730e+01 --6.3000e+02 -4.0000e+02 -2.6998e+01 --6.3000e+02 -3.7143e+02 -2.9370e+01 --6.3000e+02 -3.4286e+02 -3.1817e+01 --6.3000e+02 -3.1429e+02 -3.4306e+01 --6.3000e+02 -2.8571e+02 -3.6795e+01 --6.3000e+02 -2.5714e+02 -3.9236e+01 --6.3000e+02 -2.2857e+02 -4.1579e+01 --6.3000e+02 -2.0000e+02 -4.3772e+01 --6.3000e+02 -1.7143e+02 -4.5769e+01 --6.3000e+02 -1.4286e+02 -4.7526e+01 --6.3000e+02 -1.1429e+02 -4.9009e+01 --6.3000e+02 -8.5714e+01 -5.0189e+01 --6.3000e+02 -5.7143e+01 -5.1047e+01 --6.3000e+02 -2.8571e+01 -5.1566e+01 --6.3000e+02 0.0000e+00 -5.1740e+01 --6.3000e+02 2.8571e+01 -5.1566e+01 --6.3000e+02 5.7143e+01 -5.1047e+01 --6.3000e+02 8.5714e+01 -5.0189e+01 --6.3000e+02 1.1429e+02 -4.9009e+01 --6.3000e+02 1.4286e+02 -4.7526e+01 --6.3000e+02 1.7143e+02 -4.5769e+01 --6.3000e+02 2.0000e+02 -4.3772e+01 --6.3000e+02 2.2857e+02 -4.1579e+01 --6.3000e+02 2.5714e+02 -3.9236e+01 --6.3000e+02 2.8571e+02 -3.6795e+01 --6.3000e+02 3.1429e+02 -3.4306e+01 --6.3000e+02 3.4286e+02 -3.1817e+01 --6.3000e+02 3.7143e+02 -2.9370e+01 --6.3000e+02 4.0000e+02 -2.6998e+01 --6.3000e+02 4.2857e+02 -2.4730e+01 --6.3000e+02 4.5714e+02 -2.2581e+01 --6.3000e+02 4.8571e+02 -2.0565e+01 --6.3000e+02 5.1429e+02 -1.8684e+01 --6.3000e+02 5.4286e+02 -1.6939e+01 --6.3000e+02 5.7143e+02 -1.5326e+01 --6.3000e+02 6.0000e+02 -1.3839e+01 --6.3000e+02 6.2857e+02 -1.2471e+01 --6.3000e+02 6.5714e+02 -1.1213e+01 --6.3000e+02 6.8571e+02 -1.0056e+01 --6.3000e+02 7.1429e+02 -8.9919e+00 --6.3000e+02 7.4286e+02 -8.0132e+00 --6.3000e+02 7.7143e+02 -7.1119e+00 --6.3000e+02 8.0000e+02 -6.2810e+00 --6.3000e+02 8.2857e+02 -5.5139e+00 --6.3000e+02 8.5714e+02 -4.8047e+00 --6.3000e+02 8.8571e+02 -4.1481e+00 --6.3000e+02 9.1429e+02 -3.5392e+00 --6.3000e+02 9.4286e+02 -2.9738e+00 --6.3000e+02 9.7143e+02 -2.4477e+00 --6.3000e+02 1.0000e+03 -1.9576e+00 --6.3000e+02 1.0286e+03 -1.5002e+00 --6.3000e+02 1.0571e+03 -1.0727e+00 --6.3000e+02 1.0857e+03 -6.7257e-01 --6.3000e+02 1.1143e+03 -2.9743e-01 --6.3000e+02 1.1429e+03 5.4774e-02 --6.3000e+02 1.1714e+03 3.8590e-01 --6.3000e+02 1.2000e+03 6.9765e-01 --6.3000e+02 1.2286e+03 9.9155e-01 --6.3000e+02 1.2571e+03 1.2690e+00 --6.3000e+02 1.2857e+03 1.5312e+00 --6.3000e+02 1.3143e+03 1.7793e+00 --6.3000e+02 1.3429e+03 2.0144e+00 --6.3000e+02 1.3714e+03 2.2374e+00 --6.3000e+02 1.4000e+03 2.4491e+00 --6.3000e+02 1.4286e+03 2.6503e+00 --6.3000e+02 1.4571e+03 2.8418e+00 --6.3000e+02 1.4857e+03 3.0242e+00 --6.3000e+02 1.5143e+03 3.1981e+00 --6.3000e+02 1.5429e+03 3.3641e+00 --6.3000e+02 1.5714e+03 3.5226e+00 --6.3000e+02 1.6000e+03 3.6742e+00 --6.3000e+02 1.6286e+03 3.8192e+00 --6.3000e+02 1.6571e+03 3.9580e+00 --6.3000e+02 1.6857e+03 4.0911e+00 --6.3000e+02 1.7143e+03 4.2187e+00 --6.3000e+02 1.7429e+03 4.3412e+00 --6.3000e+02 1.7714e+03 4.4588e+00 --6.3000e+02 1.8000e+03 4.5719e+00 --6.3000e+02 1.8286e+03 4.6807e+00 --6.3000e+02 1.8571e+03 4.7854e+00 --6.3000e+02 1.8857e+03 4.8862e+00 --6.3000e+02 1.9143e+03 4.9834e+00 --6.3000e+02 1.9429e+03 5.0770e+00 --6.3000e+02 1.9714e+03 5.1674e+00 --6.3000e+02 2.0000e+03 5.2547e+00 --6.0000e+02 -2.0000e+03 5.2268e+00 --6.0000e+02 -1.9714e+03 5.1381e+00 --6.0000e+02 -1.9429e+03 5.0462e+00 --6.0000e+02 -1.9143e+03 4.9509e+00 --6.0000e+02 -1.8857e+03 4.8520e+00 --6.0000e+02 -1.8571e+03 4.7493e+00 --6.0000e+02 -1.8286e+03 4.6427e+00 --6.0000e+02 -1.8000e+03 4.5318e+00 --6.0000e+02 -1.7714e+03 4.4164e+00 --6.0000e+02 -1.7429e+03 4.2962e+00 --6.0000e+02 -1.7143e+03 4.1711e+00 --6.0000e+02 -1.6857e+03 4.0406e+00 --6.0000e+02 -1.6571e+03 3.9044e+00 --6.0000e+02 -1.6286e+03 3.7622e+00 --6.0000e+02 -1.6000e+03 3.6136e+00 --6.0000e+02 -1.5714e+03 3.4581e+00 --6.0000e+02 -1.5429e+03 3.2953e+00 --6.0000e+02 -1.5143e+03 3.1247e+00 --6.0000e+02 -1.4857e+03 2.9457e+00 --6.0000e+02 -1.4571e+03 2.7578e+00 --6.0000e+02 -1.4286e+03 2.5602e+00 --6.0000e+02 -1.4000e+03 2.3523e+00 --6.0000e+02 -1.3714e+03 2.1333e+00 --6.0000e+02 -1.3429e+03 1.9023e+00 --6.0000e+02 -1.3143e+03 1.6584e+00 --6.0000e+02 -1.2857e+03 1.4006e+00 --6.0000e+02 -1.2571e+03 1.1276e+00 --6.0000e+02 -1.2286e+03 8.3825e-01 --6.0000e+02 -1.2000e+03 5.3111e-01 --6.0000e+02 -1.1714e+03 2.0462e-01 --6.0000e+02 -1.1429e+03 -1.4296e-01 --6.0000e+02 -1.1143e+03 -5.1355e-01 --6.0000e+02 -1.0857e+03 -9.0932e-01 --6.0000e+02 -1.0571e+03 -1.3327e+00 --6.0000e+02 -1.0286e+03 -1.7863e+00 --6.0000e+02 -1.0000e+03 -2.2732e+00 --6.0000e+02 -9.7143e+02 -2.7967e+00 --6.0000e+02 -9.4286e+02 -3.3607e+00 --6.0000e+02 -9.1429e+02 -3.9694e+00 --6.0000e+02 -8.8571e+02 -4.6277e+00 --6.0000e+02 -8.5714e+02 -5.3408e+00 --6.0000e+02 -8.2857e+02 -6.1149e+00 --6.0000e+02 -8.0000e+02 -6.9567e+00 --6.0000e+02 -7.7143e+02 -7.8737e+00 --6.0000e+02 -7.4286e+02 -8.8745e+00 --6.0000e+02 -7.1429e+02 -9.9684e+00 --6.0000e+02 -6.8571e+02 -1.1166e+01 --6.0000e+02 -6.5714e+02 -1.2477e+01 --6.0000e+02 -6.2857e+02 -1.3914e+01 --6.0000e+02 -6.0000e+02 -1.5490e+01 --6.0000e+02 -5.7143e+02 -1.7216e+01 --6.0000e+02 -5.4286e+02 -1.9103e+01 --6.0000e+02 -5.1429e+02 -2.1161e+01 --6.0000e+02 -4.8571e+02 -2.3395e+01 --6.0000e+02 -4.5714e+02 -2.5807e+01 --6.0000e+02 -4.2857e+02 -2.8389e+01 --6.0000e+02 -4.0000e+02 -3.1126e+01 --6.0000e+02 -3.7143e+02 -3.3991e+01 --6.0000e+02 -3.4286e+02 -3.6945e+01 --6.0000e+02 -3.1429e+02 -3.9937e+01 --6.0000e+02 -2.8571e+02 -4.2910e+01 --6.0000e+02 -2.5714e+02 -4.5800e+01 --6.0000e+02 -2.2857e+02 -4.8544e+01 --6.0000e+02 -2.0000e+02 -5.1081e+01 --6.0000e+02 -1.7143e+02 -5.3362e+01 --6.0000e+02 -1.4286e+02 -5.5346e+01 --6.0000e+02 -1.1429e+02 -5.7000e+01 --6.0000e+02 -8.5714e+01 -5.8304e+01 --6.0000e+02 -5.7143e+01 -5.9244e+01 --6.0000e+02 -2.8571e+01 -5.9811e+01 --6.0000e+02 0.0000e+00 -6.0000e+01 --6.0000e+02 2.8571e+01 -5.9811e+01 --6.0000e+02 5.7143e+01 -5.9244e+01 --6.0000e+02 8.5714e+01 -5.8304e+01 --6.0000e+02 1.1429e+02 -5.7000e+01 --6.0000e+02 1.4286e+02 -5.5346e+01 --6.0000e+02 1.7143e+02 -5.3362e+01 --6.0000e+02 2.0000e+02 -5.1081e+01 --6.0000e+02 2.2857e+02 -4.8544e+01 --6.0000e+02 2.5714e+02 -4.5800e+01 --6.0000e+02 2.8571e+02 -4.2910e+01 --6.0000e+02 3.1429e+02 -3.9937e+01 --6.0000e+02 3.4286e+02 -3.6945e+01 --6.0000e+02 3.7143e+02 -3.3991e+01 --6.0000e+02 4.0000e+02 -3.1126e+01 --6.0000e+02 4.2857e+02 -2.8389e+01 --6.0000e+02 4.5714e+02 -2.5807e+01 --6.0000e+02 4.8571e+02 -2.3395e+01 --6.0000e+02 5.1429e+02 -2.1161e+01 --6.0000e+02 5.4286e+02 -1.9103e+01 --6.0000e+02 5.7143e+02 -1.7216e+01 --6.0000e+02 6.0000e+02 -1.5490e+01 --6.0000e+02 6.2857e+02 -1.3914e+01 --6.0000e+02 6.5714e+02 -1.2477e+01 --6.0000e+02 6.8571e+02 -1.1166e+01 --6.0000e+02 7.1429e+02 -9.9684e+00 --6.0000e+02 7.4286e+02 -8.8745e+00 --6.0000e+02 7.7143e+02 -7.8737e+00 --6.0000e+02 8.0000e+02 -6.9567e+00 --6.0000e+02 8.2857e+02 -6.1149e+00 --6.0000e+02 8.5714e+02 -5.3408e+00 --6.0000e+02 8.8571e+02 -4.6277e+00 --6.0000e+02 9.1429e+02 -3.9694e+00 --6.0000e+02 9.4286e+02 -3.3607e+00 --6.0000e+02 9.7143e+02 -2.7967e+00 --6.0000e+02 1.0000e+03 -2.2732e+00 --6.0000e+02 1.0286e+03 -1.7863e+00 --6.0000e+02 1.0571e+03 -1.3327e+00 --6.0000e+02 1.0857e+03 -9.0932e-01 --6.0000e+02 1.1143e+03 -5.1355e-01 --6.0000e+02 1.1429e+03 -1.4296e-01 --6.0000e+02 1.1714e+03 2.0462e-01 --6.0000e+02 1.2000e+03 5.3111e-01 --6.0000e+02 1.2286e+03 8.3825e-01 --6.0000e+02 1.2571e+03 1.1276e+00 --6.0000e+02 1.2857e+03 1.4006e+00 --6.0000e+02 1.3143e+03 1.6584e+00 --6.0000e+02 1.3429e+03 1.9023e+00 --6.0000e+02 1.3714e+03 2.1333e+00 --6.0000e+02 1.4000e+03 2.3523e+00 --6.0000e+02 1.4286e+03 2.5602e+00 --6.0000e+02 1.4571e+03 2.7578e+00 --6.0000e+02 1.4857e+03 2.9457e+00 --6.0000e+02 1.5143e+03 3.1247e+00 --6.0000e+02 1.5429e+03 3.2953e+00 --6.0000e+02 1.5714e+03 3.4581e+00 --6.0000e+02 1.6000e+03 3.6136e+00 --6.0000e+02 1.6286e+03 3.7622e+00 --6.0000e+02 1.6571e+03 3.9044e+00 --6.0000e+02 1.6857e+03 4.0406e+00 --6.0000e+02 1.7143e+03 4.1711e+00 --6.0000e+02 1.7429e+03 4.2962e+00 --6.0000e+02 1.7714e+03 4.4164e+00 --6.0000e+02 1.8000e+03 4.5318e+00 --6.0000e+02 1.8286e+03 4.6427e+00 --6.0000e+02 1.8571e+03 4.7493e+00 --6.0000e+02 1.8857e+03 4.8520e+00 --6.0000e+02 1.9143e+03 4.9509e+00 --6.0000e+02 1.9429e+03 5.0462e+00 --6.0000e+02 1.9714e+03 5.1381e+00 --6.0000e+02 2.0000e+03 5.2268e+00 --5.7000e+02 -2.0000e+03 5.1998e+00 --5.7000e+02 -1.9714e+03 5.1098e+00 --5.7000e+02 -1.9429e+03 5.0164e+00 --5.7000e+02 -1.9143e+03 4.9195e+00 --5.7000e+02 -1.8857e+03 4.8189e+00 --5.7000e+02 -1.8571e+03 4.7144e+00 --5.7000e+02 -1.8286e+03 4.6058e+00 --5.7000e+02 -1.8000e+03 4.4928e+00 --5.7000e+02 -1.7714e+03 4.3752e+00 --5.7000e+02 -1.7429e+03 4.2526e+00 --5.7000e+02 -1.7143e+03 4.1248e+00 --5.7000e+02 -1.6857e+03 3.9915e+00 --5.7000e+02 -1.6571e+03 3.8523e+00 --5.7000e+02 -1.6286e+03 3.7067e+00 --5.7000e+02 -1.6000e+03 3.5545e+00 --5.7000e+02 -1.5714e+03 3.3951e+00 --5.7000e+02 -1.5429e+03 3.2281e+00 --5.7000e+02 -1.5143e+03 3.0528e+00 --5.7000e+02 -1.4857e+03 2.8688e+00 --5.7000e+02 -1.4571e+03 2.6753e+00 --5.7000e+02 -1.4286e+03 2.4717e+00 --5.7000e+02 -1.4000e+03 2.2572e+00 --5.7000e+02 -1.3714e+03 2.0309e+00 --5.7000e+02 -1.3429e+03 1.7919e+00 --5.7000e+02 -1.3143e+03 1.5391e+00 --5.7000e+02 -1.2857e+03 1.2714e+00 --5.7000e+02 -1.2571e+03 9.8756e-01 --5.7000e+02 -1.2286e+03 6.8611e-01 --5.7000e+02 -1.2000e+03 3.6548e-01 --5.7000e+02 -1.1714e+03 2.3931e-02 --5.7000e+02 -1.1429e+03 -3.4051e-01 --5.7000e+02 -1.1143e+03 -7.3003e-01 --5.7000e+02 -1.0857e+03 -1.1471e+00 --5.7000e+02 -1.0571e+03 -1.5945e+00 --5.7000e+02 -1.0286e+03 -2.0753e+00 --5.7000e+02 -1.0000e+03 -2.5931e+00 --5.7000e+02 -9.7143e+02 -3.1518e+00 --5.7000e+02 -9.4286e+02 -3.7560e+00 --5.7000e+02 -9.1429e+02 -4.4107e+00 --5.7000e+02 -8.8571e+02 -5.1218e+00 --5.7000e+02 -8.5714e+02 -5.8959e+00 --5.7000e+02 -8.2857e+02 -6.7404e+00 --5.7000e+02 -8.0000e+02 -7.6638e+00 --5.7000e+02 -7.7143e+02 -8.6758e+00 --5.7000e+02 -7.4286e+02 -9.7872e+00 --5.7000e+02 -7.1429e+02 -1.1010e+01 --5.7000e+02 -6.8571e+02 -1.2358e+01 --5.7000e+02 -6.5714e+02 -1.3846e+01 --5.7000e+02 -6.2857e+02 -1.5490e+01 --5.7000e+02 -6.0000e+02 -1.7306e+01 --5.7000e+02 -5.7143e+02 -1.9312e+01 --5.7000e+02 -5.4286e+02 -2.1523e+01 --5.7000e+02 -5.1429e+02 -2.3951e+01 --5.7000e+02 -4.8571e+02 -2.6604e+01 --5.7000e+02 -4.5714e+02 -2.9481e+01 --5.7000e+02 -4.2857e+02 -3.2571e+01 --5.7000e+02 -4.0000e+02 -3.5846e+01 --5.7000e+02 -3.7143e+02 -3.9263e+01 --5.7000e+02 -3.4286e+02 -4.2763e+01 --5.7000e+02 -3.1429e+02 -4.6274e+01 --5.7000e+02 -2.8571e+02 -4.9714e+01 --5.7000e+02 -2.5714e+02 -5.3006e+01 --5.7000e+02 -2.2857e+02 -5.6077e+01 --5.7000e+02 -2.0000e+02 -5.8867e+01 --5.7000e+02 -1.7143e+02 -6.1331e+01 --5.7000e+02 -1.4286e+02 -6.3439e+01 --5.7000e+02 -1.1429e+02 -6.5173e+01 --5.7000e+02 -8.5714e+01 -6.6524e+01 --5.7000e+02 -5.7143e+01 -6.7489e+01 --5.7000e+02 -2.8571e+01 -6.8067e+01 --5.7000e+02 0.0000e+00 -6.8260e+01 --5.7000e+02 2.8571e+01 -6.8067e+01 --5.7000e+02 5.7143e+01 -6.7489e+01 --5.7000e+02 8.5714e+01 -6.6524e+01 --5.7000e+02 1.1429e+02 -6.5173e+01 --5.7000e+02 1.4286e+02 -6.3439e+01 --5.7000e+02 1.7143e+02 -6.1331e+01 --5.7000e+02 2.0000e+02 -5.8867e+01 --5.7000e+02 2.2857e+02 -5.6077e+01 --5.7000e+02 2.5714e+02 -5.3006e+01 --5.7000e+02 2.8571e+02 -4.9714e+01 --5.7000e+02 3.1429e+02 -4.6274e+01 --5.7000e+02 3.4286e+02 -4.2763e+01 --5.7000e+02 3.7143e+02 -3.9263e+01 --5.7000e+02 4.0000e+02 -3.5846e+01 --5.7000e+02 4.2857e+02 -3.2571e+01 --5.7000e+02 4.5714e+02 -2.9481e+01 --5.7000e+02 4.8571e+02 -2.6604e+01 --5.7000e+02 5.1429e+02 -2.3951e+01 --5.7000e+02 5.4286e+02 -2.1523e+01 --5.7000e+02 5.7143e+02 -1.9312e+01 --5.7000e+02 6.0000e+02 -1.7306e+01 --5.7000e+02 6.2857e+02 -1.5490e+01 --5.7000e+02 6.5714e+02 -1.3846e+01 --5.7000e+02 6.8571e+02 -1.2358e+01 --5.7000e+02 7.1429e+02 -1.1010e+01 --5.7000e+02 7.4286e+02 -9.7872e+00 --5.7000e+02 7.7143e+02 -8.6758e+00 --5.7000e+02 8.0000e+02 -7.6638e+00 --5.7000e+02 8.2857e+02 -6.7404e+00 --5.7000e+02 8.5714e+02 -5.8959e+00 --5.7000e+02 8.8571e+02 -5.1218e+00 --5.7000e+02 9.1429e+02 -4.4107e+00 --5.7000e+02 9.4286e+02 -3.7560e+00 --5.7000e+02 9.7143e+02 -3.1518e+00 --5.7000e+02 1.0000e+03 -2.5931e+00 --5.7000e+02 1.0286e+03 -2.0753e+00 --5.7000e+02 1.0571e+03 -1.5945e+00 --5.7000e+02 1.0857e+03 -1.1471e+00 --5.7000e+02 1.1143e+03 -7.3003e-01 --5.7000e+02 1.1429e+03 -3.4051e-01 --5.7000e+02 1.1714e+03 2.3931e-02 --5.7000e+02 1.2000e+03 3.6548e-01 --5.7000e+02 1.2286e+03 6.8611e-01 --5.7000e+02 1.2571e+03 9.8756e-01 --5.7000e+02 1.2857e+03 1.2714e+00 --5.7000e+02 1.3143e+03 1.5391e+00 --5.7000e+02 1.3429e+03 1.7919e+00 --5.7000e+02 1.3714e+03 2.0309e+00 --5.7000e+02 1.4000e+03 2.2572e+00 --5.7000e+02 1.4286e+03 2.4717e+00 --5.7000e+02 1.4571e+03 2.6753e+00 --5.7000e+02 1.4857e+03 2.8688e+00 --5.7000e+02 1.5143e+03 3.0528e+00 --5.7000e+02 1.5429e+03 3.2281e+00 --5.7000e+02 1.5714e+03 3.3951e+00 --5.7000e+02 1.6000e+03 3.5545e+00 --5.7000e+02 1.6286e+03 3.7067e+00 --5.7000e+02 1.6571e+03 3.8523e+00 --5.7000e+02 1.6857e+03 3.9915e+00 --5.7000e+02 1.7143e+03 4.1248e+00 --5.7000e+02 1.7429e+03 4.2526e+00 --5.7000e+02 1.7714e+03 4.3752e+00 --5.7000e+02 1.8000e+03 4.4928e+00 --5.7000e+02 1.8286e+03 4.6058e+00 --5.7000e+02 1.8571e+03 4.7144e+00 --5.7000e+02 1.8857e+03 4.8189e+00 --5.7000e+02 1.9143e+03 4.9195e+00 --5.7000e+02 1.9429e+03 5.0164e+00 --5.7000e+02 1.9714e+03 5.1098e+00 --5.7000e+02 2.0000e+03 5.1998e+00 --5.4000e+02 -2.0000e+03 5.1739e+00 --5.4000e+02 -1.9714e+03 5.0824e+00 --5.4000e+02 -1.9429e+03 4.9876e+00 --5.4000e+02 -1.9143e+03 4.8892e+00 --5.4000e+02 -1.8857e+03 4.7870e+00 --5.4000e+02 -1.8571e+03 4.6807e+00 --5.4000e+02 -1.8286e+03 4.5702e+00 --5.4000e+02 -1.8000e+03 4.4551e+00 --5.4000e+02 -1.7714e+03 4.3353e+00 --5.4000e+02 -1.7429e+03 4.2104e+00 --5.4000e+02 -1.7143e+03 4.0800e+00 --5.4000e+02 -1.6857e+03 3.9439e+00 --5.4000e+02 -1.6571e+03 3.8017e+00 --5.4000e+02 -1.6286e+03 3.6529e+00 --5.4000e+02 -1.6000e+03 3.4971e+00 --5.4000e+02 -1.5714e+03 3.3339e+00 --5.4000e+02 -1.5429e+03 3.1627e+00 --5.4000e+02 -1.5143e+03 2.9828e+00 --5.4000e+02 -1.4857e+03 2.7938e+00 --5.4000e+02 -1.4571e+03 2.5948e+00 --5.4000e+02 -1.4286e+03 2.3852e+00 --5.4000e+02 -1.4000e+03 2.1641e+00 --5.4000e+02 -1.3714e+03 1.9305e+00 --5.4000e+02 -1.3429e+03 1.6834e+00 --5.4000e+02 -1.3143e+03 1.4218e+00 --5.4000e+02 -1.2857e+03 1.1442e+00 --5.4000e+02 -1.2571e+03 8.4936e-01 --5.4000e+02 -1.2286e+03 5.3567e-01 --5.4000e+02 -1.2000e+03 2.0138e-01 --5.4000e+02 -1.1714e+03 -1.5549e-01 --5.4000e+02 -1.1429e+03 -5.3713e-01 --5.4000e+02 -1.1143e+03 -9.4603e-01 --5.4000e+02 -1.0857e+03 -1.3850e+00 --5.4000e+02 -1.0571e+03 -1.8572e+00 --5.4000e+02 -1.0286e+03 -2.3662e+00 --5.4000e+02 -1.0000e+03 -2.9162e+00 --5.4000e+02 -9.7143e+02 -3.5117e+00 --5.4000e+02 -9.4286e+02 -4.1582e+00 --5.4000e+02 -9.1429e+02 -4.8617e+00 --5.4000e+02 -8.8571e+02 -5.6292e+00 --5.4000e+02 -8.5714e+02 -6.4686e+00 --5.4000e+02 -8.2857e+02 -7.3893e+00 --5.4000e+02 -8.0000e+02 -8.4017e+00 --5.4000e+02 -7.7143e+02 -9.5180e+00 --5.4000e+02 -7.4286e+02 -1.0752e+01 --5.4000e+02 -7.1429e+02 -1.2119e+01 --5.4000e+02 -6.8571e+02 -1.3637e+01 --5.4000e+02 -6.5714e+02 -1.5326e+01 --5.4000e+02 -6.2857e+02 -1.7207e+01 --5.4000e+02 -6.0000e+02 -1.9301e+01 --5.4000e+02 -5.7143e+02 -2.1632e+01 --5.4000e+02 -5.4286e+02 -2.4220e+01 --5.4000e+02 -5.1429e+02 -2.7081e+01 --5.4000e+02 -4.8571e+02 -3.0221e+01 --5.4000e+02 -4.5714e+02 -3.3633e+01 --5.4000e+02 -4.2857e+02 -3.7293e+01 --5.4000e+02 -4.0000e+02 -4.1153e+01 --5.4000e+02 -3.7143e+02 -4.5144e+01 --5.4000e+02 -3.4286e+02 -4.9175e+01 --5.4000e+02 -3.1429e+02 -5.3147e+01 --5.4000e+02 -2.8571e+02 -5.6961e+01 --5.4000e+02 -2.5714e+02 -6.0529e+01 --5.4000e+02 -2.2857e+02 -6.3784e+01 --5.4000e+02 -2.0000e+02 -6.6677e+01 --5.4000e+02 -1.7143e+02 -6.9182e+01 --5.4000e+02 -1.4286e+02 -7.1289e+01 --5.4000e+02 -1.1429e+02 -7.2998e+01 --5.4000e+02 -8.5714e+01 -7.4315e+01 --5.4000e+02 -5.7143e+01 -7.5247e+01 --5.4000e+02 -2.8571e+01 -7.5803e+01 --5.4000e+02 0.0000e+00 -7.5988e+01 --5.4000e+02 2.8571e+01 -7.5803e+01 --5.4000e+02 5.7143e+01 -7.5247e+01 --5.4000e+02 8.5714e+01 -7.4315e+01 --5.4000e+02 1.1429e+02 -7.2998e+01 --5.4000e+02 1.4286e+02 -7.1289e+01 --5.4000e+02 1.7143e+02 -6.9182e+01 --5.4000e+02 2.0000e+02 -6.6677e+01 --5.4000e+02 2.2857e+02 -6.3784e+01 --5.4000e+02 2.5714e+02 -6.0529e+01 --5.4000e+02 2.8571e+02 -5.6961e+01 --5.4000e+02 3.1429e+02 -5.3147e+01 --5.4000e+02 3.4286e+02 -4.9175e+01 --5.4000e+02 3.7143e+02 -4.5144e+01 --5.4000e+02 4.0000e+02 -4.1153e+01 --5.4000e+02 4.2857e+02 -3.7293e+01 --5.4000e+02 4.5714e+02 -3.3633e+01 --5.4000e+02 4.8571e+02 -3.0221e+01 --5.4000e+02 5.1429e+02 -2.7081e+01 --5.4000e+02 5.4286e+02 -2.4220e+01 --5.4000e+02 5.7143e+02 -2.1632e+01 --5.4000e+02 6.0000e+02 -1.9301e+01 --5.4000e+02 6.2857e+02 -1.7207e+01 --5.4000e+02 6.5714e+02 -1.5326e+01 --5.4000e+02 6.8571e+02 -1.3637e+01 --5.4000e+02 7.1429e+02 -1.2119e+01 --5.4000e+02 7.4286e+02 -1.0752e+01 --5.4000e+02 7.7143e+02 -9.5180e+00 --5.4000e+02 8.0000e+02 -8.4017e+00 --5.4000e+02 8.2857e+02 -7.3893e+00 --5.4000e+02 8.5714e+02 -6.4686e+00 --5.4000e+02 8.8571e+02 -5.6292e+00 --5.4000e+02 9.1429e+02 -4.8617e+00 --5.4000e+02 9.4286e+02 -4.1582e+00 --5.4000e+02 9.7143e+02 -3.5117e+00 --5.4000e+02 1.0000e+03 -2.9162e+00 --5.4000e+02 1.0286e+03 -2.3662e+00 --5.4000e+02 1.0571e+03 -1.8572e+00 --5.4000e+02 1.0857e+03 -1.3850e+00 --5.4000e+02 1.1143e+03 -9.4603e-01 --5.4000e+02 1.1429e+03 -5.3713e-01 --5.4000e+02 1.1714e+03 -1.5549e-01 --5.4000e+02 1.2000e+03 2.0138e-01 --5.4000e+02 1.2286e+03 5.3567e-01 --5.4000e+02 1.2571e+03 8.4936e-01 --5.4000e+02 1.2857e+03 1.1442e+00 --5.4000e+02 1.3143e+03 1.4218e+00 --5.4000e+02 1.3429e+03 1.6834e+00 --5.4000e+02 1.3714e+03 1.9305e+00 --5.4000e+02 1.4000e+03 2.1641e+00 --5.4000e+02 1.4286e+03 2.3852e+00 --5.4000e+02 1.4571e+03 2.5948e+00 --5.4000e+02 1.4857e+03 2.7938e+00 --5.4000e+02 1.5143e+03 2.9828e+00 --5.4000e+02 1.5429e+03 3.1627e+00 --5.4000e+02 1.5714e+03 3.3339e+00 --5.4000e+02 1.6000e+03 3.4971e+00 --5.4000e+02 1.6286e+03 3.6529e+00 --5.4000e+02 1.6571e+03 3.8017e+00 --5.4000e+02 1.6857e+03 3.9439e+00 --5.4000e+02 1.7143e+03 4.0800e+00 --5.4000e+02 1.7429e+03 4.2104e+00 --5.4000e+02 1.7714e+03 4.3353e+00 --5.4000e+02 1.8000e+03 4.4551e+00 --5.4000e+02 1.8286e+03 4.5702e+00 --5.4000e+02 1.8571e+03 4.6807e+00 --5.4000e+02 1.8857e+03 4.7870e+00 --5.4000e+02 1.9143e+03 4.8892e+00 --5.4000e+02 1.9429e+03 4.9876e+00 --5.4000e+02 1.9714e+03 5.0824e+00 --5.4000e+02 2.0000e+03 5.1739e+00 --5.1000e+02 -2.0000e+03 5.1489e+00 --5.1000e+02 -1.9714e+03 5.0562e+00 --5.1000e+02 -1.9429e+03 4.9600e+00 --5.1000e+02 -1.9143e+03 4.8601e+00 --5.1000e+02 -1.8857e+03 4.7563e+00 --5.1000e+02 -1.8571e+03 4.6483e+00 --5.1000e+02 -1.8286e+03 4.5359e+00 --5.1000e+02 -1.8000e+03 4.4189e+00 --5.1000e+02 -1.7714e+03 4.2969e+00 --5.1000e+02 -1.7429e+03 4.1696e+00 --5.1000e+02 -1.7143e+03 4.0368e+00 --5.1000e+02 -1.6857e+03 3.8980e+00 --5.1000e+02 -1.6571e+03 3.7528e+00 --5.1000e+02 -1.6286e+03 3.6008e+00 --5.1000e+02 -1.6000e+03 3.4416e+00 --5.1000e+02 -1.5714e+03 3.2746e+00 --5.1000e+02 -1.5429e+03 3.0992e+00 --5.1000e+02 -1.5143e+03 2.9149e+00 --5.1000e+02 -1.4857e+03 2.7209e+00 --5.1000e+02 -1.4571e+03 2.5166e+00 --5.1000e+02 -1.4286e+03 2.3010e+00 --5.1000e+02 -1.4000e+03 2.0733e+00 --5.1000e+02 -1.3714e+03 1.8324e+00 --5.1000e+02 -1.3429e+03 1.5774e+00 --5.1000e+02 -1.3143e+03 1.3068e+00 --5.1000e+02 -1.2857e+03 1.0194e+00 --5.1000e+02 -1.2571e+03 7.1354e-01 --5.1000e+02 -1.2286e+03 3.8755e-01 --5.1000e+02 -1.2000e+03 3.9469e-02 --5.1000e+02 -1.1714e+03 -3.3289e-01 --5.1000e+02 -1.1429e+03 -7.3199e-01 --5.1000e+02 -1.1143e+03 -1.1606e+00 --5.1000e+02 -1.0857e+03 -1.6220e+00 --5.1000e+02 -1.0571e+03 -2.1197e+00 --5.1000e+02 -1.0286e+03 -2.6578e+00 --5.1000e+02 -1.0000e+03 -3.2412e+00 --5.1000e+02 -9.7143e+02 -3.8751e+00 --5.1000e+02 -9.4286e+02 -4.5659e+00 --5.1000e+02 -9.1429e+02 -5.3208e+00 --5.1000e+02 -8.8571e+02 -6.1480e+00 --5.1000e+02 -8.5714e+02 -7.0573e+00 --5.1000e+02 -8.2857e+02 -8.0600e+00 --5.1000e+02 -8.0000e+02 -9.1688e+00 --5.1000e+02 -7.7143e+02 -1.0399e+01 --5.1000e+02 -7.4286e+02 -1.1768e+01 --5.1000e+02 -7.1429e+02 -1.3296e+01 --5.1000e+02 -6.8571e+02 -1.5005e+01 --5.1000e+02 -6.5714e+02 -1.6921e+01 --5.1000e+02 -6.2857e+02 -1.9071e+01 --5.1000e+02 -6.0000e+02 -2.1485e+01 --5.1000e+02 -5.7143e+02 -2.4191e+01 --5.1000e+02 -5.4286e+02 -2.7214e+01 --5.1000e+02 -5.1429e+02 -3.0569e+01 --5.1000e+02 -4.8571e+02 -3.4259e+01 --5.1000e+02 -4.5714e+02 -3.8261e+01 --5.1000e+02 -4.2857e+02 -4.2526e+01 --5.1000e+02 -4.0000e+02 -4.6973e+01 --5.1000e+02 -3.7143e+02 -5.1493e+01 --5.1000e+02 -3.4286e+02 -5.5963e+01 --5.1000e+02 -3.1429e+02 -6.0261e+01 --5.1000e+02 -2.8571e+02 -6.4282e+01 --5.1000e+02 -2.5714e+02 -6.7948e+01 --5.1000e+02 -2.2857e+02 -7.1211e+01 --5.1000e+02 -2.0000e+02 -7.4050e+01 --5.1000e+02 -1.7143e+02 -7.6465e+01 --5.1000e+02 -1.4286e+02 -7.8465e+01 --5.1000e+02 -1.1429e+02 -8.0068e+01 --5.1000e+02 -8.5714e+01 -8.1292e+01 --5.1000e+02 -5.7143e+01 -8.2153e+01 --5.1000e+02 -2.8571e+01 -8.2664e+01 --5.1000e+02 0.0000e+00 -8.2834e+01 --5.1000e+02 2.8571e+01 -8.2664e+01 --5.1000e+02 5.7143e+01 -8.2153e+01 --5.1000e+02 8.5714e+01 -8.1292e+01 --5.1000e+02 1.1429e+02 -8.0068e+01 --5.1000e+02 1.4286e+02 -7.8465e+01 --5.1000e+02 1.7143e+02 -7.6465e+01 --5.1000e+02 2.0000e+02 -7.4050e+01 --5.1000e+02 2.2857e+02 -7.1211e+01 --5.1000e+02 2.5714e+02 -6.7948e+01 --5.1000e+02 2.8571e+02 -6.4282e+01 --5.1000e+02 3.1429e+02 -6.0261e+01 --5.1000e+02 3.4286e+02 -5.5963e+01 --5.1000e+02 3.7143e+02 -5.1493e+01 --5.1000e+02 4.0000e+02 -4.6973e+01 --5.1000e+02 4.2857e+02 -4.2526e+01 --5.1000e+02 4.5714e+02 -3.8261e+01 --5.1000e+02 4.8571e+02 -3.4259e+01 --5.1000e+02 5.1429e+02 -3.0569e+01 --5.1000e+02 5.4286e+02 -2.7214e+01 --5.1000e+02 5.7143e+02 -2.4191e+01 --5.1000e+02 6.0000e+02 -2.1485e+01 --5.1000e+02 6.2857e+02 -1.9071e+01 --5.1000e+02 6.5714e+02 -1.6921e+01 --5.1000e+02 6.8571e+02 -1.5005e+01 --5.1000e+02 7.1429e+02 -1.3296e+01 --5.1000e+02 7.4286e+02 -1.1768e+01 --5.1000e+02 7.7143e+02 -1.0399e+01 --5.1000e+02 8.0000e+02 -9.1688e+00 --5.1000e+02 8.2857e+02 -8.0600e+00 --5.1000e+02 8.5714e+02 -7.0573e+00 --5.1000e+02 8.8571e+02 -6.1480e+00 --5.1000e+02 9.1429e+02 -5.3208e+00 --5.1000e+02 9.4286e+02 -4.5659e+00 --5.1000e+02 9.7143e+02 -3.8751e+00 --5.1000e+02 1.0000e+03 -3.2412e+00 --5.1000e+02 1.0286e+03 -2.6578e+00 --5.1000e+02 1.0571e+03 -2.1197e+00 --5.1000e+02 1.0857e+03 -1.6220e+00 --5.1000e+02 1.1143e+03 -1.1606e+00 --5.1000e+02 1.1429e+03 -7.3199e-01 --5.1000e+02 1.1714e+03 -3.3289e-01 --5.1000e+02 1.2000e+03 3.9469e-02 --5.1000e+02 1.2286e+03 3.8755e-01 --5.1000e+02 1.2571e+03 7.1354e-01 --5.1000e+02 1.2857e+03 1.0194e+00 --5.1000e+02 1.3143e+03 1.3068e+00 --5.1000e+02 1.3429e+03 1.5774e+00 --5.1000e+02 1.3714e+03 1.8324e+00 --5.1000e+02 1.4000e+03 2.0733e+00 --5.1000e+02 1.4286e+03 2.3010e+00 --5.1000e+02 1.4571e+03 2.5166e+00 --5.1000e+02 1.4857e+03 2.7209e+00 --5.1000e+02 1.5143e+03 2.9149e+00 --5.1000e+02 1.5429e+03 3.0992e+00 --5.1000e+02 1.5714e+03 3.2746e+00 --5.1000e+02 1.6000e+03 3.4416e+00 --5.1000e+02 1.6286e+03 3.6008e+00 --5.1000e+02 1.6571e+03 3.7528e+00 --5.1000e+02 1.6857e+03 3.8980e+00 --5.1000e+02 1.7143e+03 4.0368e+00 --5.1000e+02 1.7429e+03 4.1696e+00 --5.1000e+02 1.7714e+03 4.2969e+00 --5.1000e+02 1.8000e+03 4.4189e+00 --5.1000e+02 1.8286e+03 4.5359e+00 --5.1000e+02 1.8571e+03 4.6483e+00 --5.1000e+02 1.8857e+03 4.7563e+00 --5.1000e+02 1.9143e+03 4.8601e+00 --5.1000e+02 1.9429e+03 4.9600e+00 --5.1000e+02 1.9714e+03 5.0562e+00 --5.1000e+02 2.0000e+03 5.1489e+00 --4.8000e+02 -2.0000e+03 5.1251e+00 --4.8000e+02 -1.9714e+03 5.0312e+00 --4.8000e+02 -1.9429e+03 4.9336e+00 --4.8000e+02 -1.9143e+03 4.8322e+00 --4.8000e+02 -1.8857e+03 4.7269e+00 --4.8000e+02 -1.8571e+03 4.6172e+00 --4.8000e+02 -1.8286e+03 4.5030e+00 --4.8000e+02 -1.8000e+03 4.3841e+00 --4.8000e+02 -1.7714e+03 4.2600e+00 --4.8000e+02 -1.7429e+03 4.1305e+00 --4.8000e+02 -1.7143e+03 3.9952e+00 --4.8000e+02 -1.6857e+03 3.8538e+00 --4.8000e+02 -1.6571e+03 3.7058e+00 --4.8000e+02 -1.6286e+03 3.5507e+00 --4.8000e+02 -1.6000e+03 3.3881e+00 --4.8000e+02 -1.5714e+03 3.2174e+00 --4.8000e+02 -1.5429e+03 3.0380e+00 --4.8000e+02 -1.5143e+03 2.8492e+00 --4.8000e+02 -1.4857e+03 2.6504e+00 --4.8000e+02 -1.4571e+03 2.4407e+00 --4.8000e+02 -1.4286e+03 2.2193e+00 --4.8000e+02 -1.4000e+03 1.9851e+00 --4.8000e+02 -1.3714e+03 1.7371e+00 --4.8000e+02 -1.3429e+03 1.4741e+00 --4.8000e+02 -1.3143e+03 1.1948e+00 --4.8000e+02 -1.2857e+03 8.9750e-01 --4.8000e+02 -1.2571e+03 5.8067e-01 --4.8000e+02 -1.2286e+03 2.4238e-01 --4.8000e+02 -1.2000e+03 -1.1953e-01 --4.8000e+02 -1.1714e+03 -5.0747e-01 --4.8000e+02 -1.1429e+03 -9.2420e-01 --4.8000e+02 -1.1143e+03 -1.3729e+00 --4.8000e+02 -1.0857e+03 -1.8570e+00 --4.8000e+02 -1.0571e+03 -2.3807e+00 --4.8000e+02 -1.0286e+03 -2.9487e+00 --4.8000e+02 -1.0000e+03 -3.5665e+00 --4.8000e+02 -9.7143e+02 -4.2402e+00 --4.8000e+02 -9.4286e+02 -4.9771e+00 --4.8000e+02 -9.1429e+02 -5.7858e+00 --4.8000e+02 -8.8571e+02 -6.6762e+00 --4.8000e+02 -8.5714e+02 -7.6597e+00 --4.8000e+02 -8.2857e+02 -8.7500e+00 --4.8000e+02 -8.0000e+02 -9.9629e+00 --4.8000e+02 -7.7143e+02 -1.1317e+01 --4.8000e+02 -7.4286e+02 -1.2834e+01 --4.8000e+02 -7.1429e+02 -1.4539e+01 --4.8000e+02 -6.8571e+02 -1.6461e+01 --4.8000e+02 -6.5714e+02 -1.8632e+01 --4.8000e+02 -6.2857e+02 -2.1087e+01 --4.8000e+02 -6.0000e+02 -2.3864e+01 --4.8000e+02 -5.7143e+02 -2.6995e+01 --4.8000e+02 -5.4286e+02 -3.0509e+01 --4.8000e+02 -5.1429e+02 -3.4416e+01 --4.8000e+02 -4.8571e+02 -3.8702e+01 --4.8000e+02 -4.5714e+02 -4.3318e+01 --4.8000e+02 -4.2857e+02 -4.8174e+01 --4.8000e+02 -4.0000e+02 -5.3142e+01 --4.8000e+02 -3.7143e+02 -5.8072e+01 --4.8000e+02 -3.4286e+02 -6.2817e+01 --4.8000e+02 -3.1429e+02 -6.7250e+01 --4.8000e+02 -2.8571e+02 -7.1284e+01 --4.8000e+02 -2.5714e+02 -7.4870e+01 --4.8000e+02 -2.2857e+02 -7.7993e+01 --4.8000e+02 -2.0000e+02 -8.0662e+01 --4.8000e+02 -1.7143e+02 -8.2899e+01 --4.8000e+02 -1.4286e+02 -8.4731e+01 --4.8000e+02 -1.1429e+02 -8.6187e+01 --4.8000e+02 -8.5714e+01 -8.7292e+01 --4.8000e+02 -5.7143e+01 -8.8066e+01 --4.8000e+02 -2.8571e+01 -8.8525e+01 --4.8000e+02 0.0000e+00 -8.8677e+01 --4.8000e+02 2.8571e+01 -8.8525e+01 --4.8000e+02 5.7143e+01 -8.8066e+01 --4.8000e+02 8.5714e+01 -8.7292e+01 --4.8000e+02 1.1429e+02 -8.6187e+01 --4.8000e+02 1.4286e+02 -8.4731e+01 --4.8000e+02 1.7143e+02 -8.2899e+01 --4.8000e+02 2.0000e+02 -8.0662e+01 --4.8000e+02 2.2857e+02 -7.7993e+01 --4.8000e+02 2.5714e+02 -7.4870e+01 --4.8000e+02 2.8571e+02 -7.1284e+01 --4.8000e+02 3.1429e+02 -6.7250e+01 --4.8000e+02 3.4286e+02 -6.2817e+01 --4.8000e+02 3.7143e+02 -5.8072e+01 --4.8000e+02 4.0000e+02 -5.3142e+01 --4.8000e+02 4.2857e+02 -4.8174e+01 --4.8000e+02 4.5714e+02 -4.3318e+01 --4.8000e+02 4.8571e+02 -3.8702e+01 --4.8000e+02 5.1429e+02 -3.4416e+01 --4.8000e+02 5.4286e+02 -3.0509e+01 --4.8000e+02 5.7143e+02 -2.6995e+01 --4.8000e+02 6.0000e+02 -2.3864e+01 --4.8000e+02 6.2857e+02 -2.1087e+01 --4.8000e+02 6.5714e+02 -1.8632e+01 --4.8000e+02 6.8571e+02 -1.6461e+01 --4.8000e+02 7.1429e+02 -1.4539e+01 --4.8000e+02 7.4286e+02 -1.2834e+01 --4.8000e+02 7.7143e+02 -1.1317e+01 --4.8000e+02 8.0000e+02 -9.9629e+00 --4.8000e+02 8.2857e+02 -8.7500e+00 --4.8000e+02 8.5714e+02 -7.6597e+00 --4.8000e+02 8.8571e+02 -6.6762e+00 --4.8000e+02 9.1429e+02 -5.7858e+00 --4.8000e+02 9.4286e+02 -4.9771e+00 --4.8000e+02 9.7143e+02 -4.2402e+00 --4.8000e+02 1.0000e+03 -3.5665e+00 --4.8000e+02 1.0286e+03 -2.9487e+00 --4.8000e+02 1.0571e+03 -2.3807e+00 --4.8000e+02 1.0857e+03 -1.8570e+00 --4.8000e+02 1.1143e+03 -1.3729e+00 --4.8000e+02 1.1429e+03 -9.2420e-01 --4.8000e+02 1.1714e+03 -5.0747e-01 --4.8000e+02 1.2000e+03 -1.1953e-01 --4.8000e+02 1.2286e+03 2.4238e-01 --4.8000e+02 1.2571e+03 5.8067e-01 --4.8000e+02 1.2857e+03 8.9750e-01 --4.8000e+02 1.3143e+03 1.1948e+00 --4.8000e+02 1.3429e+03 1.4741e+00 --4.8000e+02 1.3714e+03 1.7371e+00 --4.8000e+02 1.4000e+03 1.9851e+00 --4.8000e+02 1.4286e+03 2.2193e+00 --4.8000e+02 1.4571e+03 2.4407e+00 --4.8000e+02 1.4857e+03 2.6504e+00 --4.8000e+02 1.5143e+03 2.8492e+00 --4.8000e+02 1.5429e+03 3.0380e+00 --4.8000e+02 1.5714e+03 3.2174e+00 --4.8000e+02 1.6000e+03 3.3881e+00 --4.8000e+02 1.6286e+03 3.5507e+00 --4.8000e+02 1.6571e+03 3.7058e+00 --4.8000e+02 1.6857e+03 3.8538e+00 --4.8000e+02 1.7143e+03 3.9952e+00 --4.8000e+02 1.7429e+03 4.1305e+00 --4.8000e+02 1.7714e+03 4.2600e+00 --4.8000e+02 1.8000e+03 4.3841e+00 --4.8000e+02 1.8286e+03 4.5030e+00 --4.8000e+02 1.8571e+03 4.6172e+00 --4.8000e+02 1.8857e+03 4.7269e+00 --4.8000e+02 1.9143e+03 4.8322e+00 --4.8000e+02 1.9429e+03 4.9336e+00 --4.8000e+02 1.9714e+03 5.0312e+00 --4.8000e+02 2.0000e+03 5.1251e+00 --4.5000e+02 -2.0000e+03 5.1025e+00 --4.5000e+02 -1.9714e+03 5.0073e+00 --4.5000e+02 -1.9429e+03 4.9085e+00 --4.5000e+02 -1.9143e+03 4.8057e+00 --4.5000e+02 -1.8857e+03 4.6988e+00 --4.5000e+02 -1.8571e+03 4.5876e+00 --4.5000e+02 -1.8286e+03 4.4717e+00 --4.5000e+02 -1.8000e+03 4.3509e+00 --4.5000e+02 -1.7714e+03 4.2248e+00 --4.5000e+02 -1.7429e+03 4.0931e+00 --4.5000e+02 -1.7143e+03 3.9555e+00 --4.5000e+02 -1.6857e+03 3.8115e+00 --4.5000e+02 -1.6571e+03 3.6607e+00 --4.5000e+02 -1.6286e+03 3.5026e+00 --4.5000e+02 -1.6000e+03 3.3367e+00 --4.5000e+02 -1.5714e+03 3.1624e+00 --4.5000e+02 -1.5429e+03 2.9791e+00 --4.5000e+02 -1.5143e+03 2.7861e+00 --4.5000e+02 -1.4857e+03 2.5825e+00 --4.5000e+02 -1.4571e+03 2.3676e+00 --4.5000e+02 -1.4286e+03 2.1405e+00 --4.5000e+02 -1.4000e+03 1.9000e+00 --4.5000e+02 -1.3714e+03 1.6449e+00 --4.5000e+02 -1.3429e+03 1.3741e+00 --4.5000e+02 -1.3143e+03 1.0861e+00 --4.5000e+02 -1.2857e+03 7.7908e-01 --4.5000e+02 -1.2571e+03 4.5137e-01 --4.5000e+02 -1.2286e+03 1.0084e-01 --4.5000e+02 -1.2000e+03 -2.7485e-01 --4.5000e+02 -1.1714e+03 -6.7838e-01 --4.5000e+02 -1.1429e+03 -1.1128e+00 --4.5000e+02 -1.1143e+03 -1.5816e+00 --4.5000e+02 -1.0857e+03 -2.0888e+00 --4.5000e+02 -1.0571e+03 -2.6389e+00 --4.5000e+02 -1.0286e+03 -3.2373e+00 --4.5000e+02 -1.0000e+03 -3.8903e+00 --4.5000e+02 -9.7143e+02 -4.6049e+00 --4.5000e+02 -9.4286e+02 -5.3897e+00 --4.5000e+02 -9.1429e+02 -6.2545e+00 --4.5000e+02 -8.8571e+02 -7.2109e+00 --4.5000e+02 -8.5714e+02 -8.2728e+00 --4.5000e+02 -8.2857e+02 -9.4562e+00 --4.5000e+02 -8.0000e+02 -1.0781e+01 --4.5000e+02 -7.7143e+02 -1.2268e+01 --4.5000e+02 -7.4286e+02 -1.3947e+01 --4.5000e+02 -7.1429e+02 -1.5846e+01 --4.5000e+02 -6.8571e+02 -1.8003e+01 --4.5000e+02 -6.5714e+02 -2.0459e+01 --4.5000e+02 -6.2857e+02 -2.3255e+01 --4.5000e+02 -6.0000e+02 -2.6437e+01 --4.5000e+02 -5.7143e+02 -3.0043e+01 --4.5000e+02 -5.4286e+02 -3.4096e+01 --4.5000e+02 -5.1429e+02 -3.8595e+01 --4.5000e+02 -4.8571e+02 -4.3494e+01 --4.5000e+02 -4.5714e+02 -4.8699e+01 --4.5000e+02 -4.2857e+02 -5.4067e+01 --4.5000e+02 -4.0000e+02 -5.9421e+01 --4.5000e+02 -3.7143e+02 -6.4582e+01 --4.5000e+02 -3.4286e+02 -6.9403e+01 --4.5000e+02 -3.1429e+02 -7.3780e+01 --4.5000e+02 -2.8571e+02 -7.7663e+01 --4.5000e+02 -2.5714e+02 -8.1042e+01 --4.5000e+02 -2.2857e+02 -8.3935e+01 --4.5000e+02 -2.0000e+02 -8.6375e+01 --4.5000e+02 -1.7143e+02 -8.8400e+01 --4.5000e+02 -1.4286e+02 -9.0046e+01 --4.5000e+02 -1.1429e+02 -9.1348e+01 --4.5000e+02 -8.5714e+01 -9.2333e+01 --4.5000e+02 -5.7143e+01 -9.3021e+01 --4.5000e+02 -2.8571e+01 -9.3428e+01 --4.5000e+02 0.0000e+00 -9.3563e+01 --4.5000e+02 2.8571e+01 -9.3428e+01 --4.5000e+02 5.7143e+01 -9.3021e+01 --4.5000e+02 8.5714e+01 -9.2333e+01 --4.5000e+02 1.1429e+02 -9.1348e+01 --4.5000e+02 1.4286e+02 -9.0046e+01 --4.5000e+02 1.7143e+02 -8.8400e+01 --4.5000e+02 2.0000e+02 -8.6375e+01 --4.5000e+02 2.2857e+02 -8.3935e+01 --4.5000e+02 2.5714e+02 -8.1042e+01 --4.5000e+02 2.8571e+02 -7.7663e+01 --4.5000e+02 3.1429e+02 -7.3780e+01 --4.5000e+02 3.4286e+02 -6.9403e+01 --4.5000e+02 3.7143e+02 -6.4582e+01 --4.5000e+02 4.0000e+02 -5.9421e+01 --4.5000e+02 4.2857e+02 -5.4067e+01 --4.5000e+02 4.5714e+02 -4.8699e+01 --4.5000e+02 4.8571e+02 -4.3494e+01 --4.5000e+02 5.1429e+02 -3.8595e+01 --4.5000e+02 5.4286e+02 -3.4096e+01 --4.5000e+02 5.7143e+02 -3.0043e+01 --4.5000e+02 6.0000e+02 -2.6437e+01 --4.5000e+02 6.2857e+02 -2.3255e+01 --4.5000e+02 6.5714e+02 -2.0459e+01 --4.5000e+02 6.8571e+02 -1.8003e+01 --4.5000e+02 7.1429e+02 -1.5846e+01 --4.5000e+02 7.4286e+02 -1.3947e+01 --4.5000e+02 7.7143e+02 -1.2268e+01 --4.5000e+02 8.0000e+02 -1.0781e+01 --4.5000e+02 8.2857e+02 -9.4562e+00 --4.5000e+02 8.5714e+02 -8.2728e+00 --4.5000e+02 8.8571e+02 -7.2109e+00 --4.5000e+02 9.1429e+02 -6.2545e+00 --4.5000e+02 9.4286e+02 -5.3897e+00 --4.5000e+02 9.7143e+02 -4.6049e+00 --4.5000e+02 1.0000e+03 -3.8903e+00 --4.5000e+02 1.0286e+03 -3.2373e+00 --4.5000e+02 1.0571e+03 -2.6389e+00 --4.5000e+02 1.0857e+03 -2.0888e+00 --4.5000e+02 1.1143e+03 -1.5816e+00 --4.5000e+02 1.1429e+03 -1.1128e+00 --4.5000e+02 1.1714e+03 -6.7838e-01 --4.5000e+02 1.2000e+03 -2.7485e-01 --4.5000e+02 1.2286e+03 1.0084e-01 --4.5000e+02 1.2571e+03 4.5137e-01 --4.5000e+02 1.2857e+03 7.7908e-01 --4.5000e+02 1.3143e+03 1.0861e+00 --4.5000e+02 1.3429e+03 1.3741e+00 --4.5000e+02 1.3714e+03 1.6449e+00 --4.5000e+02 1.4000e+03 1.9000e+00 --4.5000e+02 1.4286e+03 2.1405e+00 --4.5000e+02 1.4571e+03 2.3676e+00 --4.5000e+02 1.4857e+03 2.5825e+00 --4.5000e+02 1.5143e+03 2.7861e+00 --4.5000e+02 1.5429e+03 2.9791e+00 --4.5000e+02 1.5714e+03 3.1624e+00 --4.5000e+02 1.6000e+03 3.3367e+00 --4.5000e+02 1.6286e+03 3.5026e+00 --4.5000e+02 1.6571e+03 3.6607e+00 --4.5000e+02 1.6857e+03 3.8115e+00 --4.5000e+02 1.7143e+03 3.9555e+00 --4.5000e+02 1.7429e+03 4.0931e+00 --4.5000e+02 1.7714e+03 4.2248e+00 --4.5000e+02 1.8000e+03 4.3509e+00 --4.5000e+02 1.8286e+03 4.4717e+00 --4.5000e+02 1.8571e+03 4.5876e+00 --4.5000e+02 1.8857e+03 4.6988e+00 --4.5000e+02 1.9143e+03 4.8057e+00 --4.5000e+02 1.9429e+03 4.9085e+00 --4.5000e+02 1.9714e+03 5.0073e+00 --4.5000e+02 2.0000e+03 5.1025e+00 --4.2000e+02 -2.0000e+03 5.0810e+00 --4.2000e+02 -1.9714e+03 4.9847e+00 --4.2000e+02 -1.9429e+03 4.8846e+00 --4.2000e+02 -1.9143e+03 4.7805e+00 --4.2000e+02 -1.8857e+03 4.6723e+00 --4.2000e+02 -1.8571e+03 4.5595e+00 --4.2000e+02 -1.8286e+03 4.4419e+00 --4.2000e+02 -1.8000e+03 4.3193e+00 --4.2000e+02 -1.7714e+03 4.1913e+00 --4.2000e+02 -1.7429e+03 4.0576e+00 --4.2000e+02 -1.7143e+03 3.9177e+00 --4.2000e+02 -1.6857e+03 3.7712e+00 --4.2000e+02 -1.6571e+03 3.6178e+00 --4.2000e+02 -1.6286e+03 3.4568e+00 --4.2000e+02 -1.6000e+03 3.2877e+00 --4.2000e+02 -1.5714e+03 3.1100e+00 --4.2000e+02 -1.5429e+03 2.9228e+00 --4.2000e+02 -1.5143e+03 2.7256e+00 --4.2000e+02 -1.4857e+03 2.5175e+00 --4.2000e+02 -1.4571e+03 2.2976e+00 --4.2000e+02 -1.4286e+03 2.0648e+00 --4.2000e+02 -1.4000e+03 1.8181e+00 --4.2000e+02 -1.3714e+03 1.5563e+00 --4.2000e+02 -1.3429e+03 1.2778e+00 --4.2000e+02 -1.3143e+03 9.8120e-01 --4.2000e+02 -1.2857e+03 6.6468e-01 --4.2000e+02 -1.2571e+03 3.2625e-01 --4.2000e+02 -1.2286e+03 -3.6358e-02 --4.2000e+02 -1.2000e+03 -4.2570e-01 --4.2000e+02 -1.1714e+03 -8.4472e-01 --4.2000e+02 -1.1429e+03 -1.2968e+00 --4.2000e+02 -1.1143e+03 -1.7857e+00 --4.2000e+02 -1.0857e+03 -2.3160e+00 --4.2000e+02 -1.0571e+03 -2.8927e+00 --4.2000e+02 -1.0286e+03 -3.5220e+00 --4.2000e+02 -1.0000e+03 -4.2107e+00 --4.2000e+02 -9.7143e+02 -4.9672e+00 --4.2000e+02 -9.4286e+02 -5.8011e+00 --4.2000e+02 -9.1429e+02 -6.7238e+00 --4.2000e+02 -8.8571e+02 -7.7490e+00 --4.2000e+02 -8.5714e+02 -8.8928e+00 --4.2000e+02 -8.2857e+02 -1.0175e+01 --4.2000e+02 -8.0000e+02 -1.1617e+01 --4.2000e+02 -7.7143e+02 -1.3248e+01 --4.2000e+02 -7.4286e+02 -1.5101e+01 --4.2000e+02 -7.1429e+02 -1.7212e+01 --4.2000e+02 -6.8571e+02 -1.9627e+01 --4.2000e+02 -6.5714e+02 -2.2395e+01 --4.2000e+02 -6.2857e+02 -2.5567e+01 --4.2000e+02 -6.0000e+02 -2.9195e+01 --4.2000e+02 -5.7143e+02 -3.3316e+01 --4.2000e+02 -5.4286e+02 -3.7943e+01 --4.2000e+02 -5.1429e+02 -4.3044e+01 --4.2000e+02 -4.8571e+02 -4.8529e+01 --4.2000e+02 -4.5714e+02 -5.4242e+01 --4.2000e+02 -4.2857e+02 -5.9983e+01 --4.2000e+02 -4.0000e+02 -6.5542e+01 --4.2000e+02 -3.7143e+02 -7.0739e+01 --4.2000e+02 -3.4286e+02 -7.5455e+01 --4.2000e+02 -3.1429e+02 -7.9631e+01 --4.2000e+02 -2.8571e+02 -8.3261e+01 --4.2000e+02 -2.5714e+02 -8.6370e+01 --4.2000e+02 -2.2857e+02 -8.9001e+01 --4.2000e+02 -2.0000e+02 -9.1202e+01 --4.2000e+02 -1.7143e+02 -9.3017e+01 --4.2000e+02 -1.4286e+02 -9.4489e+01 --4.2000e+02 -1.1429e+02 -9.5649e+01 --4.2000e+02 -8.5714e+01 -9.6525e+01 --4.2000e+02 -5.7143e+01 -9.7137e+01 --4.2000e+02 -2.8571e+01 -9.7499e+01 --4.2000e+02 0.0000e+00 -9.7618e+01 --4.2000e+02 2.8571e+01 -9.7499e+01 --4.2000e+02 5.7143e+01 -9.7137e+01 --4.2000e+02 8.5714e+01 -9.6525e+01 --4.2000e+02 1.1429e+02 -9.5649e+01 --4.2000e+02 1.4286e+02 -9.4489e+01 --4.2000e+02 1.7143e+02 -9.3017e+01 --4.2000e+02 2.0000e+02 -9.1202e+01 --4.2000e+02 2.2857e+02 -8.9001e+01 --4.2000e+02 2.5714e+02 -8.6370e+01 --4.2000e+02 2.8571e+02 -8.3261e+01 --4.2000e+02 3.1429e+02 -7.9631e+01 --4.2000e+02 3.4286e+02 -7.5455e+01 --4.2000e+02 3.7143e+02 -7.0739e+01 --4.2000e+02 4.0000e+02 -6.5542e+01 --4.2000e+02 4.2857e+02 -5.9983e+01 --4.2000e+02 4.5714e+02 -5.4242e+01 --4.2000e+02 4.8571e+02 -4.8529e+01 --4.2000e+02 5.1429e+02 -4.3044e+01 --4.2000e+02 5.4286e+02 -3.7943e+01 --4.2000e+02 5.7143e+02 -3.3316e+01 --4.2000e+02 6.0000e+02 -2.9195e+01 --4.2000e+02 6.2857e+02 -2.5567e+01 --4.2000e+02 6.5714e+02 -2.2395e+01 --4.2000e+02 6.8571e+02 -1.9627e+01 --4.2000e+02 7.1429e+02 -1.7212e+01 --4.2000e+02 7.4286e+02 -1.5101e+01 --4.2000e+02 7.7143e+02 -1.3248e+01 --4.2000e+02 8.0000e+02 -1.1617e+01 --4.2000e+02 8.2857e+02 -1.0175e+01 --4.2000e+02 8.5714e+02 -8.8928e+00 --4.2000e+02 8.8571e+02 -7.7490e+00 --4.2000e+02 9.1429e+02 -6.7238e+00 --4.2000e+02 9.4286e+02 -5.8011e+00 --4.2000e+02 9.7143e+02 -4.9672e+00 --4.2000e+02 1.0000e+03 -4.2107e+00 --4.2000e+02 1.0286e+03 -3.5220e+00 --4.2000e+02 1.0571e+03 -2.8927e+00 --4.2000e+02 1.0857e+03 -2.3160e+00 --4.2000e+02 1.1143e+03 -1.7857e+00 --4.2000e+02 1.1429e+03 -1.2968e+00 --4.2000e+02 1.1714e+03 -8.4472e-01 --4.2000e+02 1.2000e+03 -4.2570e-01 --4.2000e+02 1.2286e+03 -3.6358e-02 --4.2000e+02 1.2571e+03 3.2625e-01 --4.2000e+02 1.2857e+03 6.6468e-01 --4.2000e+02 1.3143e+03 9.8120e-01 --4.2000e+02 1.3429e+03 1.2778e+00 --4.2000e+02 1.3714e+03 1.5563e+00 --4.2000e+02 1.4000e+03 1.8181e+00 --4.2000e+02 1.4286e+03 2.0648e+00 --4.2000e+02 1.4571e+03 2.2976e+00 --4.2000e+02 1.4857e+03 2.5175e+00 --4.2000e+02 1.5143e+03 2.7256e+00 --4.2000e+02 1.5429e+03 2.9228e+00 --4.2000e+02 1.5714e+03 3.1100e+00 --4.2000e+02 1.6000e+03 3.2877e+00 --4.2000e+02 1.6286e+03 3.4568e+00 --4.2000e+02 1.6571e+03 3.6178e+00 --4.2000e+02 1.6857e+03 3.7712e+00 --4.2000e+02 1.7143e+03 3.9177e+00 --4.2000e+02 1.7429e+03 4.0576e+00 --4.2000e+02 1.7714e+03 4.1913e+00 --4.2000e+02 1.8000e+03 4.3193e+00 --4.2000e+02 1.8286e+03 4.4419e+00 --4.2000e+02 1.8571e+03 4.5595e+00 --4.2000e+02 1.8857e+03 4.6723e+00 --4.2000e+02 1.9143e+03 4.7805e+00 --4.2000e+02 1.9429e+03 4.8846e+00 --4.2000e+02 1.9714e+03 4.9847e+00 --4.2000e+02 2.0000e+03 5.0810e+00 --3.9000e+02 -2.0000e+03 5.0608e+00 --3.9000e+02 -1.9714e+03 4.9634e+00 --3.9000e+02 -1.9429e+03 4.8622e+00 --3.9000e+02 -1.9143e+03 4.7568e+00 --3.9000e+02 -1.8857e+03 4.6472e+00 --3.9000e+02 -1.8571e+03 4.5329e+00 --3.9000e+02 -1.8286e+03 4.4138e+00 --3.9000e+02 -1.8000e+03 4.2895e+00 --3.9000e+02 -1.7714e+03 4.1597e+00 --3.9000e+02 -1.7429e+03 4.0240e+00 --3.9000e+02 -1.7143e+03 3.8819e+00 --3.9000e+02 -1.6857e+03 3.7331e+00 --3.9000e+02 -1.6571e+03 3.5771e+00 --3.9000e+02 -1.6286e+03 3.4133e+00 --3.9000e+02 -1.6000e+03 3.2412e+00 --3.9000e+02 -1.5714e+03 3.0601e+00 --3.9000e+02 -1.5429e+03 2.8694e+00 --3.9000e+02 -1.5143e+03 2.6682e+00 --3.9000e+02 -1.4857e+03 2.4556e+00 --3.9000e+02 -1.4571e+03 2.2308e+00 --3.9000e+02 -1.4286e+03 1.9927e+00 --3.9000e+02 -1.4000e+03 1.7400e+00 --3.9000e+02 -1.3714e+03 1.4715e+00 --3.9000e+02 -1.3429e+03 1.1856e+00 --3.9000e+02 -1.3143e+03 8.8070e-01 --3.9000e+02 -1.2857e+03 5.5486e-01 --3.9000e+02 -1.2571e+03 2.0595e-01 --3.9000e+02 -1.2286e+03 -1.6850e-01 --3.9000e+02 -1.2000e+03 -5.7126e-01 --3.9000e+02 -1.1714e+03 -1.0055e+00 --3.9000e+02 -1.1429e+03 -1.4750e+00 --3.9000e+02 -1.1143e+03 -1.9839e+00 --3.9000e+02 -1.0857e+03 -2.5372e+00 --3.9000e+02 -1.0571e+03 -3.1405e+00 --3.9000e+02 -1.0286e+03 -3.8007e+00 --3.9000e+02 -1.0000e+03 -4.5256e+00 --3.9000e+02 -9.7143e+02 -5.3245e+00 --3.9000e+02 -9.4286e+02 -6.2084e+00 --3.9000e+02 -9.1429e+02 -7.1905e+00 --3.9000e+02 -8.8571e+02 -8.2866e+00 --3.9000e+02 -8.5714e+02 -9.5155e+00 --3.9000e+02 -8.2857e+02 -1.0900e+01 --3.9000e+02 -8.0000e+02 -1.2467e+01 --3.9000e+02 -7.7143e+02 -1.4250e+01 --3.9000e+02 -7.4286e+02 -1.6289e+01 --3.9000e+02 -7.1429e+02 -1.8628e+01 --3.9000e+02 -6.8571e+02 -2.1322e+01 --3.9000e+02 -6.5714e+02 -2.4428e+01 --3.9000e+02 -6.2857e+02 -2.8009e+01 --3.9000e+02 -6.0000e+02 -3.2116e+01 --3.9000e+02 -5.7143e+02 -3.6781e+01 --3.9000e+02 -5.4286e+02 -4.1991e+01 --3.9000e+02 -5.1429e+02 -4.7669e+01 --3.9000e+02 -4.8571e+02 -5.3662e+01 --3.9000e+02 -4.5714e+02 -5.9750e+01 --3.9000e+02 -4.2857e+02 -6.5690e+01 --3.9000e+02 -4.0000e+02 -7.1268e+01 --3.9000e+02 -3.7143e+02 -7.6336e+01 --3.9000e+02 -3.4286e+02 -8.0822e+01 --3.9000e+02 -3.1429e+02 -8.4717e+01 --3.9000e+02 -2.8571e+02 -8.8054e+01 --3.9000e+02 -2.5714e+02 -9.0882e+01 --3.9000e+02 -2.2857e+02 -9.3258e+01 --3.9000e+02 -2.0000e+02 -9.5237e+01 --3.9000e+02 -1.7143e+02 -9.6865e+01 --3.9000e+02 -1.4286e+02 -9.8183e+01 --3.9000e+02 -1.1429e+02 -9.9222e+01 --3.9000e+02 -8.5714e+01 -1.0001e+02 --3.9000e+02 -5.7143e+01 -1.0055e+02 --3.9000e+02 -2.8571e+01 -1.0088e+02 --3.9000e+02 0.0000e+00 -1.0099e+02 --3.9000e+02 2.8571e+01 -1.0088e+02 --3.9000e+02 5.7143e+01 -1.0055e+02 --3.9000e+02 8.5714e+01 -1.0001e+02 --3.9000e+02 1.1429e+02 -9.9222e+01 --3.9000e+02 1.4286e+02 -9.8183e+01 --3.9000e+02 1.7143e+02 -9.6865e+01 --3.9000e+02 2.0000e+02 -9.5237e+01 --3.9000e+02 2.2857e+02 -9.3258e+01 --3.9000e+02 2.5714e+02 -9.0882e+01 --3.9000e+02 2.8571e+02 -8.8054e+01 --3.9000e+02 3.1429e+02 -8.4717e+01 --3.9000e+02 3.4286e+02 -8.0822e+01 --3.9000e+02 3.7143e+02 -7.6336e+01 --3.9000e+02 4.0000e+02 -7.1268e+01 --3.9000e+02 4.2857e+02 -6.5690e+01 --3.9000e+02 4.5714e+02 -5.9750e+01 --3.9000e+02 4.8571e+02 -5.3662e+01 --3.9000e+02 5.1429e+02 -4.7669e+01 --3.9000e+02 5.4286e+02 -4.1991e+01 --3.9000e+02 5.7143e+02 -3.6781e+01 --3.9000e+02 6.0000e+02 -3.2116e+01 --3.9000e+02 6.2857e+02 -2.8009e+01 --3.9000e+02 6.5714e+02 -2.4428e+01 --3.9000e+02 6.8571e+02 -2.1322e+01 --3.9000e+02 7.1429e+02 -1.8628e+01 --3.9000e+02 7.4286e+02 -1.6289e+01 --3.9000e+02 7.7143e+02 -1.4250e+01 --3.9000e+02 8.0000e+02 -1.2467e+01 --3.9000e+02 8.2857e+02 -1.0900e+01 --3.9000e+02 8.5714e+02 -9.5155e+00 --3.9000e+02 8.8571e+02 -8.2866e+00 --3.9000e+02 9.1429e+02 -7.1905e+00 --3.9000e+02 9.4286e+02 -6.2084e+00 --3.9000e+02 9.7143e+02 -5.3245e+00 --3.9000e+02 1.0000e+03 -4.5256e+00 --3.9000e+02 1.0286e+03 -3.8007e+00 --3.9000e+02 1.0571e+03 -3.1405e+00 --3.9000e+02 1.0857e+03 -2.5372e+00 --3.9000e+02 1.1143e+03 -1.9839e+00 --3.9000e+02 1.1429e+03 -1.4750e+00 --3.9000e+02 1.1714e+03 -1.0055e+00 --3.9000e+02 1.2000e+03 -5.7126e-01 --3.9000e+02 1.2286e+03 -1.6850e-01 --3.9000e+02 1.2571e+03 2.0595e-01 --3.9000e+02 1.2857e+03 5.5486e-01 --3.9000e+02 1.3143e+03 8.8070e-01 --3.9000e+02 1.3429e+03 1.1856e+00 --3.9000e+02 1.3714e+03 1.4715e+00 --3.9000e+02 1.4000e+03 1.7400e+00 --3.9000e+02 1.4286e+03 1.9927e+00 --3.9000e+02 1.4571e+03 2.2308e+00 --3.9000e+02 1.4857e+03 2.4556e+00 --3.9000e+02 1.5143e+03 2.6682e+00 --3.9000e+02 1.5429e+03 2.8694e+00 --3.9000e+02 1.5714e+03 3.0601e+00 --3.9000e+02 1.6000e+03 3.2412e+00 --3.9000e+02 1.6286e+03 3.4133e+00 --3.9000e+02 1.6571e+03 3.5771e+00 --3.9000e+02 1.6857e+03 3.7331e+00 --3.9000e+02 1.7143e+03 3.8819e+00 --3.9000e+02 1.7429e+03 4.0240e+00 --3.9000e+02 1.7714e+03 4.1597e+00 --3.9000e+02 1.8000e+03 4.2895e+00 --3.9000e+02 1.8286e+03 4.4138e+00 --3.9000e+02 1.8571e+03 4.5329e+00 --3.9000e+02 1.8857e+03 4.6472e+00 --3.9000e+02 1.9143e+03 4.7568e+00 --3.9000e+02 1.9429e+03 4.8622e+00 --3.9000e+02 1.9714e+03 4.9634e+00 --3.9000e+02 2.0000e+03 5.0608e+00 --3.6000e+02 -2.0000e+03 5.0419e+00 --3.6000e+02 -1.9714e+03 4.9435e+00 --3.6000e+02 -1.9429e+03 4.8411e+00 --3.6000e+02 -1.9143e+03 4.7346e+00 --3.6000e+02 -1.8857e+03 4.6237e+00 --3.6000e+02 -1.8571e+03 4.5081e+00 --3.6000e+02 -1.8286e+03 4.3875e+00 --3.6000e+02 -1.8000e+03 4.2616e+00 --3.6000e+02 -1.7714e+03 4.1300e+00 --3.6000e+02 -1.7429e+03 3.9924e+00 --3.6000e+02 -1.7143e+03 3.8483e+00 --3.6000e+02 -1.6857e+03 3.6973e+00 --3.6000e+02 -1.6571e+03 3.5388e+00 --3.6000e+02 -1.6286e+03 3.3724e+00 --3.6000e+02 -1.6000e+03 3.1974e+00 --3.6000e+02 -1.5714e+03 3.0132e+00 --3.6000e+02 -1.5429e+03 2.8189e+00 --3.6000e+02 -1.5143e+03 2.6139e+00 --3.6000e+02 -1.4857e+03 2.3971e+00 --3.6000e+02 -1.4571e+03 2.1677e+00 --3.6000e+02 -1.4286e+03 1.9244e+00 --3.6000e+02 -1.4000e+03 1.6659e+00 --3.6000e+02 -1.3714e+03 1.3910e+00 --3.6000e+02 -1.3429e+03 1.0980e+00 --3.6000e+02 -1.3143e+03 7.8505e-01 --3.6000e+02 -1.2857e+03 4.5020e-01 --3.6000e+02 -1.2571e+03 9.1122e-02 --3.6000e+02 -1.2286e+03 -2.9483e-01 --3.6000e+02 -1.2000e+03 -7.1066e-01 --3.6000e+02 -1.1714e+03 -1.1599e+00 --3.6000e+02 -1.1429e+03 -1.6464e+00 --3.6000e+02 -1.1143e+03 -2.1749e+00 --3.6000e+02 -1.0857e+03 -2.7509e+00 --3.6000e+02 -1.0571e+03 -3.3806e+00 --3.6000e+02 -1.0286e+03 -4.0716e+00 --3.6000e+02 -1.0000e+03 -4.8325e+00 --3.6000e+02 -9.7143e+02 -5.6739e+00 --3.6000e+02 -9.4286e+02 -6.6084e+00 --3.6000e+02 -9.1429e+02 -7.6508e+00 --3.6000e+02 -8.8571e+02 -8.8192e+00 --3.6000e+02 -8.5714e+02 -1.0136e+01 --3.6000e+02 -8.2857e+02 -1.1626e+01 --3.6000e+02 -8.0000e+02 -1.3324e+01 --3.6000e+02 -7.7143e+02 -1.5266e+01 --3.6000e+02 -7.4286e+02 -1.7501e+01 --3.6000e+02 -7.1429e+02 -2.0082e+01 --3.6000e+02 -6.8571e+02 -2.3073e+01 --3.6000e+02 -6.5714e+02 -2.6542e+01 --3.6000e+02 -6.2857e+02 -3.0556e+01 --3.6000e+02 -6.0000e+02 -3.5164e+01 --3.6000e+02 -5.7143e+02 -4.0381e+01 --3.6000e+02 -5.4286e+02 -4.6154e+01 --3.6000e+02 -5.1429e+02 -5.2343e+01 --3.6000e+02 -4.8571e+02 -5.8724e+01 --3.6000e+02 -4.5714e+02 -6.5027e+01 --3.6000e+02 -4.2857e+02 -7.0993e+01 --3.6000e+02 -4.0000e+02 -7.6439e+01 --3.6000e+02 -3.7143e+02 -8.1268e+01 --3.6000e+02 -3.4286e+02 -8.5461e+01 --3.6000e+02 -3.1429e+02 -8.9051e+01 --3.6000e+02 -2.8571e+02 -9.2096e+01 --3.6000e+02 -2.5714e+02 -9.4663e+01 --3.6000e+02 -2.2857e+02 -9.6812e+01 --3.6000e+02 -2.0000e+02 -9.8598e+01 --3.6000e+02 -1.7143e+02 -1.0007e+02 --3.6000e+02 -1.4286e+02 -1.0126e+02 --3.6000e+02 -1.1429e+02 -1.0220e+02 --3.6000e+02 -8.5714e+01 -1.0291e+02 --3.6000e+02 -5.7143e+01 -1.0341e+02 --3.6000e+02 -2.8571e+01 -1.0370e+02 --3.6000e+02 0.0000e+00 -1.0380e+02 --3.6000e+02 2.8571e+01 -1.0370e+02 --3.6000e+02 5.7143e+01 -1.0341e+02 --3.6000e+02 8.5714e+01 -1.0291e+02 --3.6000e+02 1.1429e+02 -1.0220e+02 --3.6000e+02 1.4286e+02 -1.0126e+02 --3.6000e+02 1.7143e+02 -1.0007e+02 --3.6000e+02 2.0000e+02 -9.8598e+01 --3.6000e+02 2.2857e+02 -9.6812e+01 --3.6000e+02 2.5714e+02 -9.4663e+01 --3.6000e+02 2.8571e+02 -9.2096e+01 --3.6000e+02 3.1429e+02 -8.9051e+01 --3.6000e+02 3.4286e+02 -8.5461e+01 --3.6000e+02 3.7143e+02 -8.1268e+01 --3.6000e+02 4.0000e+02 -7.6439e+01 --3.6000e+02 4.2857e+02 -7.0993e+01 --3.6000e+02 4.5714e+02 -6.5027e+01 --3.6000e+02 4.8571e+02 -5.8724e+01 --3.6000e+02 5.1429e+02 -5.2343e+01 --3.6000e+02 5.4286e+02 -4.6154e+01 --3.6000e+02 5.7143e+02 -4.0381e+01 --3.6000e+02 6.0000e+02 -3.5164e+01 --3.6000e+02 6.2857e+02 -3.0556e+01 --3.6000e+02 6.5714e+02 -2.6542e+01 --3.6000e+02 6.8571e+02 -2.3073e+01 --3.6000e+02 7.1429e+02 -2.0082e+01 --3.6000e+02 7.4286e+02 -1.7501e+01 --3.6000e+02 7.7143e+02 -1.5266e+01 --3.6000e+02 8.0000e+02 -1.3324e+01 --3.6000e+02 8.2857e+02 -1.1626e+01 --3.6000e+02 8.5714e+02 -1.0136e+01 --3.6000e+02 8.8571e+02 -8.8192e+00 --3.6000e+02 9.1429e+02 -7.6508e+00 --3.6000e+02 9.4286e+02 -6.6084e+00 --3.6000e+02 9.7143e+02 -5.6739e+00 --3.6000e+02 1.0000e+03 -4.8325e+00 --3.6000e+02 1.0286e+03 -4.0716e+00 --3.6000e+02 1.0571e+03 -3.3806e+00 --3.6000e+02 1.0857e+03 -2.7509e+00 --3.6000e+02 1.1143e+03 -2.1749e+00 --3.6000e+02 1.1429e+03 -1.6464e+00 --3.6000e+02 1.1714e+03 -1.1599e+00 --3.6000e+02 1.2000e+03 -7.1066e-01 --3.6000e+02 1.2286e+03 -2.9483e-01 --3.6000e+02 1.2571e+03 9.1122e-02 --3.6000e+02 1.2857e+03 4.5020e-01 --3.6000e+02 1.3143e+03 7.8505e-01 --3.6000e+02 1.3429e+03 1.0980e+00 --3.6000e+02 1.3714e+03 1.3910e+00 --3.6000e+02 1.4000e+03 1.6659e+00 --3.6000e+02 1.4286e+03 1.9244e+00 --3.6000e+02 1.4571e+03 2.1677e+00 --3.6000e+02 1.4857e+03 2.3971e+00 --3.6000e+02 1.5143e+03 2.6139e+00 --3.6000e+02 1.5429e+03 2.8189e+00 --3.6000e+02 1.5714e+03 3.0132e+00 --3.6000e+02 1.6000e+03 3.1974e+00 --3.6000e+02 1.6286e+03 3.3724e+00 --3.6000e+02 1.6571e+03 3.5388e+00 --3.6000e+02 1.6857e+03 3.6973e+00 --3.6000e+02 1.7143e+03 3.8483e+00 --3.6000e+02 1.7429e+03 3.9924e+00 --3.6000e+02 1.7714e+03 4.1300e+00 --3.6000e+02 1.8000e+03 4.2616e+00 --3.6000e+02 1.8286e+03 4.3875e+00 --3.6000e+02 1.8571e+03 4.5081e+00 --3.6000e+02 1.8857e+03 4.6237e+00 --3.6000e+02 1.9143e+03 4.7346e+00 --3.6000e+02 1.9429e+03 4.8411e+00 --3.6000e+02 1.9714e+03 4.9435e+00 --3.6000e+02 2.0000e+03 5.0419e+00 --3.3000e+02 -2.0000e+03 5.0243e+00 --3.3000e+02 -1.9714e+03 4.9249e+00 --3.3000e+02 -1.9429e+03 4.8215e+00 --3.3000e+02 -1.9143e+03 4.7139e+00 --3.3000e+02 -1.8857e+03 4.6018e+00 --3.3000e+02 -1.8571e+03 4.4849e+00 --3.3000e+02 -1.8286e+03 4.3629e+00 --3.3000e+02 -1.8000e+03 4.2355e+00 --3.3000e+02 -1.7714e+03 4.1023e+00 --3.3000e+02 -1.7429e+03 3.9629e+00 --3.3000e+02 -1.7143e+03 3.8169e+00 --3.3000e+02 -1.6857e+03 3.6638e+00 --3.3000e+02 -1.6571e+03 3.5031e+00 --3.3000e+02 -1.6286e+03 3.3342e+00 --3.3000e+02 -1.6000e+03 3.1565e+00 --3.3000e+02 -1.5714e+03 2.9692e+00 --3.3000e+02 -1.5429e+03 2.7717e+00 --3.3000e+02 -1.5143e+03 2.5630e+00 --3.3000e+02 -1.4857e+03 2.3423e+00 --3.3000e+02 -1.4571e+03 2.1084e+00 --3.3000e+02 -1.4286e+03 1.8601e+00 --3.3000e+02 -1.4000e+03 1.5963e+00 --3.3000e+02 -1.3714e+03 1.3152e+00 --3.3000e+02 -1.3429e+03 1.0154e+00 --3.3000e+02 -1.3143e+03 6.9477e-01 --3.3000e+02 -1.2857e+03 3.5128e-01 --3.3000e+02 -1.2571e+03 -1.7572e-02 --3.3000e+02 -1.2286e+03 -4.1460e-01 --3.3000e+02 -1.2000e+03 -8.4306e-01 --3.3000e+02 -1.1714e+03 -1.3067e+00 --3.3000e+02 -1.1429e+03 -1.8098e+00 --3.3000e+02 -1.1143e+03 -2.3575e+00 --3.3000e+02 -1.0857e+03 -2.9556e+00 --3.3000e+02 -1.0571e+03 -3.6112e+00 --3.3000e+02 -1.0286e+03 -4.3324e+00 --3.3000e+02 -1.0000e+03 -5.1290e+00 --3.3000e+02 -9.7143e+02 -6.0127e+00 --3.3000e+02 -9.4286e+02 -6.9975e+00 --3.3000e+02 -9.1429e+02 -8.1004e+00 --3.3000e+02 -8.8571e+02 -9.3419e+00 --3.3000e+02 -8.5714e+02 -1.0747e+01 --3.3000e+02 -8.2857e+02 -1.2346e+01 --3.3000e+02 -8.0000e+02 -1.4177e+01 --3.3000e+02 -7.7143e+02 -1.6285e+01 --3.3000e+02 -7.4286e+02 -1.8724e+01 --3.3000e+02 -7.1429e+02 -2.1559e+01 --3.3000e+02 -6.8571e+02 -2.4863e+01 --3.3000e+02 -6.5714e+02 -2.8711e+01 --3.3000e+02 -6.2857e+02 -3.3173e+01 --3.3000e+02 -6.0000e+02 -3.8290e+01 --3.3000e+02 -5.7143e+02 -4.4043e+01 --3.3000e+02 -5.4286e+02 -5.0326e+01 --3.3000e+02 -5.1429e+02 -5.6925e+01 --3.3000e+02 -4.8571e+02 -6.3554e+01 --3.3000e+02 -4.5714e+02 -6.9913e+01 --3.3000e+02 -4.2857e+02 -7.5768e+01 --3.3000e+02 -4.0000e+02 -8.0982e+01 --3.3000e+02 -3.7143e+02 -8.5519e+01 --3.3000e+02 -3.4286e+02 -8.9404e+01 --3.3000e+02 -3.1429e+02 -9.2701e+01 --3.3000e+02 -2.8571e+02 -9.5482e+01 --3.3000e+02 -2.5714e+02 -9.7819e+01 --3.3000e+02 -2.2857e+02 -9.9775e+01 --3.3000e+02 -2.0000e+02 -1.0140e+02 --3.3000e+02 -1.7143e+02 -1.0274e+02 --3.3000e+02 -1.4286e+02 -1.0383e+02 --3.3000e+02 -1.1429e+02 -1.0469e+02 --3.3000e+02 -8.5714e+01 -1.0534e+02 --3.3000e+02 -5.7143e+01 -1.0580e+02 --3.3000e+02 -2.8571e+01 -1.0607e+02 --3.3000e+02 0.0000e+00 -1.0616e+02 --3.3000e+02 2.8571e+01 -1.0607e+02 --3.3000e+02 5.7143e+01 -1.0580e+02 --3.3000e+02 8.5714e+01 -1.0534e+02 --3.3000e+02 1.1429e+02 -1.0469e+02 --3.3000e+02 1.4286e+02 -1.0383e+02 --3.3000e+02 1.7143e+02 -1.0274e+02 --3.3000e+02 2.0000e+02 -1.0140e+02 --3.3000e+02 2.2857e+02 -9.9775e+01 --3.3000e+02 2.5714e+02 -9.7819e+01 --3.3000e+02 2.8571e+02 -9.5482e+01 --3.3000e+02 3.1429e+02 -9.2701e+01 --3.3000e+02 3.4286e+02 -8.9404e+01 --3.3000e+02 3.7143e+02 -8.5519e+01 --3.3000e+02 4.0000e+02 -8.0982e+01 --3.3000e+02 4.2857e+02 -7.5768e+01 --3.3000e+02 4.5714e+02 -6.9913e+01 --3.3000e+02 4.8571e+02 -6.3554e+01 --3.3000e+02 5.1429e+02 -5.6925e+01 --3.3000e+02 5.4286e+02 -5.0326e+01 --3.3000e+02 5.7143e+02 -4.4043e+01 --3.3000e+02 6.0000e+02 -3.8290e+01 --3.3000e+02 6.2857e+02 -3.3173e+01 --3.3000e+02 6.5714e+02 -2.8711e+01 --3.3000e+02 6.8571e+02 -2.4863e+01 --3.3000e+02 7.1429e+02 -2.1559e+01 --3.3000e+02 7.4286e+02 -1.8724e+01 --3.3000e+02 7.7143e+02 -1.6285e+01 --3.3000e+02 8.0000e+02 -1.4177e+01 --3.3000e+02 8.2857e+02 -1.2346e+01 --3.3000e+02 8.5714e+02 -1.0747e+01 --3.3000e+02 8.8571e+02 -9.3419e+00 --3.3000e+02 9.1429e+02 -8.1004e+00 --3.3000e+02 9.4286e+02 -6.9975e+00 --3.3000e+02 9.7143e+02 -6.0127e+00 --3.3000e+02 1.0000e+03 -5.1290e+00 --3.3000e+02 1.0286e+03 -4.3324e+00 --3.3000e+02 1.0571e+03 -3.6112e+00 --3.3000e+02 1.0857e+03 -2.9556e+00 --3.3000e+02 1.1143e+03 -2.3575e+00 --3.3000e+02 1.1429e+03 -1.8098e+00 --3.3000e+02 1.1714e+03 -1.3067e+00 --3.3000e+02 1.2000e+03 -8.4306e-01 --3.3000e+02 1.2286e+03 -4.1460e-01 --3.3000e+02 1.2571e+03 -1.7572e-02 --3.3000e+02 1.2857e+03 3.5128e-01 --3.3000e+02 1.3143e+03 6.9477e-01 --3.3000e+02 1.3429e+03 1.0154e+00 --3.3000e+02 1.3714e+03 1.3152e+00 --3.3000e+02 1.4000e+03 1.5963e+00 --3.3000e+02 1.4286e+03 1.8601e+00 --3.3000e+02 1.4571e+03 2.1084e+00 --3.3000e+02 1.4857e+03 2.3423e+00 --3.3000e+02 1.5143e+03 2.5630e+00 --3.3000e+02 1.5429e+03 2.7717e+00 --3.3000e+02 1.5714e+03 2.9692e+00 --3.3000e+02 1.6000e+03 3.1565e+00 --3.3000e+02 1.6286e+03 3.3342e+00 --3.3000e+02 1.6571e+03 3.5031e+00 --3.3000e+02 1.6857e+03 3.6638e+00 --3.3000e+02 1.7143e+03 3.8169e+00 --3.3000e+02 1.7429e+03 3.9629e+00 --3.3000e+02 1.7714e+03 4.1023e+00 --3.3000e+02 1.8000e+03 4.2355e+00 --3.3000e+02 1.8286e+03 4.3629e+00 --3.3000e+02 1.8571e+03 4.4849e+00 --3.3000e+02 1.8857e+03 4.6018e+00 --3.3000e+02 1.9143e+03 4.7139e+00 --3.3000e+02 1.9429e+03 4.8215e+00 --3.3000e+02 1.9714e+03 4.9249e+00 --3.3000e+02 2.0000e+03 5.0243e+00 --3.0000e+02 -2.0000e+03 5.0081e+00 --3.0000e+02 -1.9714e+03 4.9079e+00 --3.0000e+02 -1.9429e+03 4.8035e+00 --3.0000e+02 -1.9143e+03 4.6949e+00 --3.0000e+02 -1.8857e+03 4.5816e+00 --3.0000e+02 -1.8571e+03 4.4635e+00 --3.0000e+02 -1.8286e+03 4.3403e+00 --3.0000e+02 -1.8000e+03 4.2114e+00 --3.0000e+02 -1.7714e+03 4.0767e+00 --3.0000e+02 -1.7429e+03 3.9357e+00 --3.0000e+02 -1.7143e+03 3.7879e+00 --3.0000e+02 -1.6857e+03 3.6328e+00 --3.0000e+02 -1.6571e+03 3.4700e+00 --3.0000e+02 -1.6286e+03 3.2988e+00 --3.0000e+02 -1.6000e+03 3.1185e+00 --3.0000e+02 -1.5714e+03 2.9285e+00 --3.0000e+02 -1.5429e+03 2.7278e+00 --3.0000e+02 -1.5143e+03 2.5158e+00 --3.0000e+02 -1.4857e+03 2.2913e+00 --3.0000e+02 -1.4571e+03 2.0532e+00 --3.0000e+02 -1.4286e+03 1.8004e+00 --3.0000e+02 -1.4000e+03 1.5313e+00 --3.0000e+02 -1.3714e+03 1.2445e+00 --3.0000e+02 -1.3429e+03 9.3820e-01 --3.0000e+02 -1.3143e+03 6.1034e-01 --3.0000e+02 -1.2857e+03 2.5865e-01 --3.0000e+02 -1.2571e+03 -1.1948e-01 --3.0000e+02 -1.2286e+03 -5.2707e-01 --3.0000e+02 -1.2000e+03 -9.6758e-01 --3.0000e+02 -1.1714e+03 -1.4450e+00 --3.0000e+02 -1.1429e+03 -1.9640e+00 --3.0000e+02 -1.1143e+03 -2.5301e+00 --3.0000e+02 -1.0857e+03 -3.1497e+00 --3.0000e+02 -1.0571e+03 -3.8303e+00 --3.0000e+02 -1.0286e+03 -4.5809e+00 --3.0000e+02 -1.0000e+03 -5.4124e+00 --3.0000e+02 -9.7143e+02 -6.3375e+00 --3.0000e+02 -9.4286e+02 -7.3720e+00 --3.0000e+02 -9.1429e+02 -8.5348e+00 --3.0000e+02 -8.8571e+02 -9.8491e+00 --3.0000e+02 -8.5714e+02 -1.1343e+01 --3.0000e+02 -8.2857e+02 -1.3052e+01 --3.0000e+02 -8.0000e+02 -1.5019e+01 --3.0000e+02 -7.7143e+02 -1.7295e+01 --3.0000e+02 -7.4286e+02 -1.9944e+01 --3.0000e+02 -7.1429e+02 -2.3040e+01 --3.0000e+02 -6.8571e+02 -2.6665e+01 --3.0000e+02 -6.5714e+02 -3.0902e+01 --3.0000e+02 -6.2857e+02 -3.5816e+01 --3.0000e+02 -6.0000e+02 -4.1430e+01 --3.0000e+02 -5.7143e+02 -4.7681e+01 --3.0000e+02 -5.4286e+02 -5.4393e+01 --3.0000e+02 -5.1429e+02 -6.1284e+01 --3.0000e+02 -4.8571e+02 -6.8019e+01 --3.0000e+02 -4.5714e+02 -7.4307e+01 --3.0000e+02 -4.2857e+02 -7.9957e+01 --3.0000e+02 -4.0000e+02 -8.4893e+01 --3.0000e+02 -3.7143e+02 -8.9128e+01 --3.0000e+02 -3.4286e+02 -9.2722e+01 --3.0000e+02 -3.1429e+02 -9.5755e+01 --3.0000e+02 -2.8571e+02 -9.8309e+01 --3.0000e+02 -2.5714e+02 -1.0045e+02 --3.0000e+02 -2.2857e+02 -1.0225e+02 --3.0000e+02 -2.0000e+02 -1.0375e+02 --3.0000e+02 -1.7143e+02 -1.0499e+02 --3.0000e+02 -1.4286e+02 -1.0599e+02 --3.0000e+02 -1.1429e+02 -1.0679e+02 --3.0000e+02 -8.5714e+01 -1.0740e+02 --3.0000e+02 -5.7143e+01 -1.0783e+02 --3.0000e+02 -2.8571e+01 -1.0808e+02 --3.0000e+02 0.0000e+00 -1.0817e+02 --3.0000e+02 2.8571e+01 -1.0808e+02 --3.0000e+02 5.7143e+01 -1.0783e+02 --3.0000e+02 8.5714e+01 -1.0740e+02 --3.0000e+02 1.1429e+02 -1.0679e+02 --3.0000e+02 1.4286e+02 -1.0599e+02 --3.0000e+02 1.7143e+02 -1.0499e+02 --3.0000e+02 2.0000e+02 -1.0375e+02 --3.0000e+02 2.2857e+02 -1.0225e+02 --3.0000e+02 2.5714e+02 -1.0045e+02 --3.0000e+02 2.8571e+02 -9.8309e+01 --3.0000e+02 3.1429e+02 -9.5755e+01 --3.0000e+02 3.4286e+02 -9.2722e+01 --3.0000e+02 3.7143e+02 -8.9128e+01 --3.0000e+02 4.0000e+02 -8.4893e+01 --3.0000e+02 4.2857e+02 -7.9957e+01 --3.0000e+02 4.5714e+02 -7.4307e+01 --3.0000e+02 4.8571e+02 -6.8019e+01 --3.0000e+02 5.1429e+02 -6.1284e+01 --3.0000e+02 5.4286e+02 -5.4393e+01 --3.0000e+02 5.7143e+02 -4.7681e+01 --3.0000e+02 6.0000e+02 -4.1430e+01 --3.0000e+02 6.2857e+02 -3.5816e+01 --3.0000e+02 6.5714e+02 -3.0902e+01 --3.0000e+02 6.8571e+02 -2.6665e+01 --3.0000e+02 7.1429e+02 -2.3040e+01 --3.0000e+02 7.4286e+02 -1.9944e+01 --3.0000e+02 7.7143e+02 -1.7295e+01 --3.0000e+02 8.0000e+02 -1.5019e+01 --3.0000e+02 8.2857e+02 -1.3052e+01 --3.0000e+02 8.5714e+02 -1.1343e+01 --3.0000e+02 8.8571e+02 -9.8491e+00 --3.0000e+02 9.1429e+02 -8.5348e+00 --3.0000e+02 9.4286e+02 -7.3720e+00 --3.0000e+02 9.7143e+02 -6.3375e+00 --3.0000e+02 1.0000e+03 -5.4124e+00 --3.0000e+02 1.0286e+03 -4.5809e+00 --3.0000e+02 1.0571e+03 -3.8303e+00 --3.0000e+02 1.0857e+03 -3.1497e+00 --3.0000e+02 1.1143e+03 -2.5301e+00 --3.0000e+02 1.1429e+03 -1.9640e+00 --3.0000e+02 1.1714e+03 -1.4450e+00 --3.0000e+02 1.2000e+03 -9.6758e-01 --3.0000e+02 1.2286e+03 -5.2707e-01 --3.0000e+02 1.2571e+03 -1.1948e-01 --3.0000e+02 1.2857e+03 2.5865e-01 --3.0000e+02 1.3143e+03 6.1034e-01 --3.0000e+02 1.3429e+03 9.3820e-01 --3.0000e+02 1.3714e+03 1.2445e+00 --3.0000e+02 1.4000e+03 1.5313e+00 --3.0000e+02 1.4286e+03 1.8004e+00 --3.0000e+02 1.4571e+03 2.0532e+00 --3.0000e+02 1.4857e+03 2.2913e+00 --3.0000e+02 1.5143e+03 2.5158e+00 --3.0000e+02 1.5429e+03 2.7278e+00 --3.0000e+02 1.5714e+03 2.9285e+00 --3.0000e+02 1.6000e+03 3.1185e+00 --3.0000e+02 1.6286e+03 3.2988e+00 --3.0000e+02 1.6571e+03 3.4700e+00 --3.0000e+02 1.6857e+03 3.6328e+00 --3.0000e+02 1.7143e+03 3.7879e+00 --3.0000e+02 1.7429e+03 3.9357e+00 --3.0000e+02 1.7714e+03 4.0767e+00 --3.0000e+02 1.8000e+03 4.2114e+00 --3.0000e+02 1.8286e+03 4.3403e+00 --3.0000e+02 1.8571e+03 4.4635e+00 --3.0000e+02 1.8857e+03 4.5816e+00 --3.0000e+02 1.9143e+03 4.6949e+00 --3.0000e+02 1.9429e+03 4.8035e+00 --3.0000e+02 1.9714e+03 4.9079e+00 --3.0000e+02 2.0000e+03 5.0081e+00 --2.7000e+02 -2.0000e+03 4.9934e+00 --2.7000e+02 -1.9714e+03 4.8923e+00 --2.7000e+02 -1.9429e+03 4.7870e+00 --2.7000e+02 -1.9143e+03 4.6774e+00 --2.7000e+02 -1.8857e+03 4.5632e+00 --2.7000e+02 -1.8571e+03 4.4440e+00 --2.7000e+02 -1.8286e+03 4.3195e+00 --2.7000e+02 -1.8000e+03 4.1894e+00 --2.7000e+02 -1.7714e+03 4.0533e+00 --2.7000e+02 -1.7429e+03 3.9108e+00 --2.7000e+02 -1.7143e+03 3.7613e+00 --2.7000e+02 -1.6857e+03 3.6045e+00 --2.7000e+02 -1.6571e+03 3.4397e+00 --2.7000e+02 -1.6286e+03 3.2663e+00 --2.7000e+02 -1.6000e+03 3.0837e+00 --2.7000e+02 -1.5714e+03 2.8910e+00 --2.7000e+02 -1.5429e+03 2.6876e+00 --2.7000e+02 -1.5143e+03 2.4724e+00 --2.7000e+02 -1.4857e+03 2.2444e+00 --2.7000e+02 -1.4571e+03 2.0024e+00 --2.7000e+02 -1.4286e+03 1.7453e+00 --2.7000e+02 -1.4000e+03 1.4714e+00 --2.7000e+02 -1.3714e+03 1.1793e+00 --2.7000e+02 -1.3429e+03 8.6691e-01 --2.7000e+02 -1.3143e+03 5.3225e-01 --2.7000e+02 -1.2857e+03 1.7288e-01 --2.7000e+02 -1.2571e+03 -2.1397e-01 --2.7000e+02 -1.2286e+03 -6.3149e-01 --2.7000e+02 -1.2000e+03 -1.0834e+00 --2.7000e+02 -1.1714e+03 -1.5739e+00 --2.7000e+02 -1.1429e+03 -2.1080e+00 --2.7000e+02 -1.1143e+03 -2.6915e+00 --2.7000e+02 -1.0857e+03 -3.3315e+00 --2.7000e+02 -1.0571e+03 -4.0360e+00 --2.7000e+02 -1.0286e+03 -4.8149e+00 --2.7000e+02 -1.0000e+03 -5.6799e+00 --2.7000e+02 -9.7143e+02 -6.6452e+00 --2.7000e+02 -9.4286e+02 -7.7279e+00 --2.7000e+02 -9.1429e+02 -8.9492e+00 --2.7000e+02 -8.8571e+02 -1.0335e+01 --2.7000e+02 -8.5714e+02 -1.1917e+01 --2.7000e+02 -8.2857e+02 -1.3735e+01 --2.7000e+02 -8.0000e+02 -1.5837e+01 --2.7000e+02 -7.7143e+02 -1.8282e+01 --2.7000e+02 -7.4286e+02 -2.1143e+01 --2.7000e+02 -7.1429e+02 -2.4503e+01 --2.7000e+02 -6.8571e+02 -2.8451e+01 --2.7000e+02 -6.5714e+02 -3.3075e+01 --2.7000e+02 -6.2857e+02 -3.8433e+01 --2.7000e+02 -6.0000e+02 -4.4514e+01 --2.7000e+02 -5.7143e+02 -5.1202e+01 --2.7000e+02 -5.4286e+02 -5.8248e+01 --2.7000e+02 -5.1429e+02 -6.5308e+01 --2.7000e+02 -4.8571e+02 -7.2033e+01 --2.7000e+02 -4.5714e+02 -7.8162e+01 --2.7000e+02 -4.2857e+02 -8.3561e+01 --2.7000e+02 -4.0000e+02 -8.8210e+01 --2.7000e+02 -3.7143e+02 -9.2160e+01 --2.7000e+02 -3.4286e+02 -9.5495e+01 --2.7000e+02 -3.1429e+02 -9.8302e+01 --2.7000e+02 -2.8571e+02 -1.0067e+02 --2.7000e+02 -2.5714e+02 -1.0265e+02 --2.7000e+02 -2.2857e+02 -1.0432e+02 --2.7000e+02 -2.0000e+02 -1.0572e+02 --2.7000e+02 -1.7143e+02 -1.0688e+02 --2.7000e+02 -1.4286e+02 -1.0782e+02 --2.7000e+02 -1.1429e+02 -1.0858e+02 --2.7000e+02 -8.5714e+01 -1.0915e+02 --2.7000e+02 -5.7143e+01 -1.0956e+02 --2.7000e+02 -2.8571e+01 -1.0980e+02 --2.7000e+02 0.0000e+00 -1.0988e+02 --2.7000e+02 2.8571e+01 -1.0980e+02 --2.7000e+02 5.7143e+01 -1.0956e+02 --2.7000e+02 8.5714e+01 -1.0915e+02 --2.7000e+02 1.1429e+02 -1.0858e+02 --2.7000e+02 1.4286e+02 -1.0782e+02 --2.7000e+02 1.7143e+02 -1.0688e+02 --2.7000e+02 2.0000e+02 -1.0572e+02 --2.7000e+02 2.2857e+02 -1.0432e+02 --2.7000e+02 2.5714e+02 -1.0265e+02 --2.7000e+02 2.8571e+02 -1.0067e+02 --2.7000e+02 3.1429e+02 -9.8302e+01 --2.7000e+02 3.4286e+02 -9.5495e+01 --2.7000e+02 3.7143e+02 -9.2160e+01 --2.7000e+02 4.0000e+02 -8.8210e+01 --2.7000e+02 4.2857e+02 -8.3561e+01 --2.7000e+02 4.5714e+02 -7.8162e+01 --2.7000e+02 4.8571e+02 -7.2033e+01 --2.7000e+02 5.1429e+02 -6.5308e+01 --2.7000e+02 5.4286e+02 -5.8248e+01 --2.7000e+02 5.7143e+02 -5.1202e+01 --2.7000e+02 6.0000e+02 -4.4514e+01 --2.7000e+02 6.2857e+02 -3.8433e+01 --2.7000e+02 6.5714e+02 -3.3075e+01 --2.7000e+02 6.8571e+02 -2.8451e+01 --2.7000e+02 7.1429e+02 -2.4503e+01 --2.7000e+02 7.4286e+02 -2.1143e+01 --2.7000e+02 7.7143e+02 -1.8282e+01 --2.7000e+02 8.0000e+02 -1.5837e+01 --2.7000e+02 8.2857e+02 -1.3735e+01 --2.7000e+02 8.5714e+02 -1.1917e+01 --2.7000e+02 8.8571e+02 -1.0335e+01 --2.7000e+02 9.1429e+02 -8.9492e+00 --2.7000e+02 9.4286e+02 -7.7279e+00 --2.7000e+02 9.7143e+02 -6.6452e+00 --2.7000e+02 1.0000e+03 -5.6799e+00 --2.7000e+02 1.0286e+03 -4.8149e+00 --2.7000e+02 1.0571e+03 -4.0360e+00 --2.7000e+02 1.0857e+03 -3.3315e+00 --2.7000e+02 1.1143e+03 -2.6915e+00 --2.7000e+02 1.1429e+03 -2.1080e+00 --2.7000e+02 1.1714e+03 -1.5739e+00 --2.7000e+02 1.2000e+03 -1.0834e+00 --2.7000e+02 1.2286e+03 -6.3149e-01 --2.7000e+02 1.2571e+03 -2.1397e-01 --2.7000e+02 1.2857e+03 1.7288e-01 --2.7000e+02 1.3143e+03 5.3225e-01 --2.7000e+02 1.3429e+03 8.6691e-01 --2.7000e+02 1.3714e+03 1.1793e+00 --2.7000e+02 1.4000e+03 1.4714e+00 --2.7000e+02 1.4286e+03 1.7453e+00 --2.7000e+02 1.4571e+03 2.0024e+00 --2.7000e+02 1.4857e+03 2.2444e+00 --2.7000e+02 1.5143e+03 2.4724e+00 --2.7000e+02 1.5429e+03 2.6876e+00 --2.7000e+02 1.5714e+03 2.8910e+00 --2.7000e+02 1.6000e+03 3.0837e+00 --2.7000e+02 1.6286e+03 3.2663e+00 --2.7000e+02 1.6571e+03 3.4397e+00 --2.7000e+02 1.6857e+03 3.6045e+00 --2.7000e+02 1.7143e+03 3.7613e+00 --2.7000e+02 1.7429e+03 3.9108e+00 --2.7000e+02 1.7714e+03 4.0533e+00 --2.7000e+02 1.8000e+03 4.1894e+00 --2.7000e+02 1.8286e+03 4.3195e+00 --2.7000e+02 1.8571e+03 4.4440e+00 --2.7000e+02 1.8857e+03 4.5632e+00 --2.7000e+02 1.9143e+03 4.6774e+00 --2.7000e+02 1.9429e+03 4.7870e+00 --2.7000e+02 1.9714e+03 4.8923e+00 --2.7000e+02 2.0000e+03 4.9934e+00 --2.4000e+02 -2.0000e+03 4.9801e+00 --2.4000e+02 -1.9714e+03 4.8782e+00 --2.4000e+02 -1.9429e+03 4.7722e+00 --2.4000e+02 -1.9143e+03 4.6617e+00 --2.4000e+02 -1.8857e+03 4.5466e+00 --2.4000e+02 -1.8571e+03 4.4264e+00 --2.4000e+02 -1.8286e+03 4.3008e+00 --2.4000e+02 -1.8000e+03 4.1696e+00 --2.4000e+02 -1.7714e+03 4.0322e+00 --2.4000e+02 -1.7429e+03 3.8882e+00 --2.4000e+02 -1.7143e+03 3.7373e+00 --2.4000e+02 -1.6857e+03 3.5788e+00 --2.4000e+02 -1.6571e+03 3.4122e+00 --2.4000e+02 -1.6286e+03 3.2369e+00 --2.4000e+02 -1.6000e+03 3.0521e+00 --2.4000e+02 -1.5714e+03 2.8571e+00 --2.4000e+02 -1.5429e+03 2.6510e+00 --2.4000e+02 -1.5143e+03 2.4329e+00 --2.4000e+02 -1.4857e+03 2.2018e+00 --2.4000e+02 -1.4571e+03 1.9563e+00 --2.4000e+02 -1.4286e+03 1.6952e+00 --2.4000e+02 -1.4000e+03 1.4169e+00 --2.4000e+02 -1.3714e+03 1.1198e+00 --2.4000e+02 -1.3429e+03 8.0189e-01 --2.4000e+02 -1.3143e+03 4.6097e-01 --2.4000e+02 -1.2857e+03 9.4502e-02 --2.4000e+02 -1.2571e+03 -3.0042e-01 --2.4000e+02 -1.2286e+03 -7.2715e-01 --2.4000e+02 -1.2000e+03 -1.1896e+00 --2.4000e+02 -1.1714e+03 -1.6922e+00 --2.4000e+02 -1.1429e+03 -2.2404e+00 --2.4000e+02 -1.1143e+03 -2.8403e+00 --2.4000e+02 -1.0857e+03 -3.4995e+00 --2.4000e+02 -1.0571e+03 -4.2265e+00 --2.4000e+02 -1.0286e+03 -5.0321e+00 --2.4000e+02 -1.0000e+03 -5.9288e+00 --2.4000e+02 -9.7143e+02 -6.9322e+00 --2.4000e+02 -9.4286e+02 -8.0611e+00 --2.4000e+02 -9.1429e+02 -9.3385e+00 --2.4000e+02 -8.8571e+02 -1.0793e+01 --2.4000e+02 -8.5714e+02 -1.2460e+01 --2.4000e+02 -8.2857e+02 -1.4384e+01 --2.4000e+02 -8.0000e+02 -1.6618e+01 --2.4000e+02 -7.7143e+02 -1.9230e+01 --2.4000e+02 -7.4286e+02 -2.2300e+01 --2.4000e+02 -7.1429e+02 -2.5920e+01 --2.4000e+02 -6.8571e+02 -3.0187e+01 --2.4000e+02 -6.5714e+02 -3.5188e+01 --2.4000e+02 -6.2857e+02 -4.0964e+01 --2.4000e+02 -6.0000e+02 -4.7468e+01 --2.4000e+02 -5.7143e+02 -5.4518e+01 --2.4000e+02 -5.4286e+02 -6.1797e+01 --2.4000e+02 -5.1429e+02 -6.8923e+01 --2.4000e+02 -4.8571e+02 -7.5553e+01 --2.4000e+02 -4.5714e+02 -8.1476e+01 --2.4000e+02 -4.2857e+02 -8.6613e+01 --2.4000e+02 -4.0000e+02 -9.0991e+01 --2.4000e+02 -3.7143e+02 -9.4689e+01 --2.4000e+02 -3.4286e+02 -9.7801e+01 --2.4000e+02 -3.1429e+02 -1.0042e+02 --2.4000e+02 -2.8571e+02 -1.0263e+02 --2.4000e+02 -2.5714e+02 -1.0449e+02 --2.4000e+02 -2.2857e+02 -1.0606e+02 --2.4000e+02 -2.0000e+02 -1.0738e+02 --2.4000e+02 -1.7143e+02 -1.0847e+02 --2.4000e+02 -1.4286e+02 -1.0938e+02 --2.4000e+02 -1.1429e+02 -1.1010e+02 --2.4000e+02 -8.5714e+01 -1.1066e+02 --2.4000e+02 -5.7143e+01 -1.1105e+02 --2.4000e+02 -2.8571e+01 -1.1128e+02 --2.4000e+02 0.0000e+00 -1.1136e+02 --2.4000e+02 2.8571e+01 -1.1128e+02 --2.4000e+02 5.7143e+01 -1.1105e+02 --2.4000e+02 8.5714e+01 -1.1066e+02 --2.4000e+02 1.1429e+02 -1.1010e+02 --2.4000e+02 1.4286e+02 -1.0938e+02 --2.4000e+02 1.7143e+02 -1.0847e+02 --2.4000e+02 2.0000e+02 -1.0738e+02 --2.4000e+02 2.2857e+02 -1.0606e+02 --2.4000e+02 2.5714e+02 -1.0449e+02 --2.4000e+02 2.8571e+02 -1.0263e+02 --2.4000e+02 3.1429e+02 -1.0042e+02 --2.4000e+02 3.4286e+02 -9.7801e+01 --2.4000e+02 3.7143e+02 -9.4689e+01 --2.4000e+02 4.0000e+02 -9.0991e+01 --2.4000e+02 4.2857e+02 -8.6613e+01 --2.4000e+02 4.5714e+02 -8.1476e+01 --2.4000e+02 4.8571e+02 -7.5553e+01 --2.4000e+02 5.1429e+02 -6.8923e+01 --2.4000e+02 5.4286e+02 -6.1797e+01 --2.4000e+02 5.7143e+02 -5.4518e+01 --2.4000e+02 6.0000e+02 -4.7468e+01 --2.4000e+02 6.2857e+02 -4.0964e+01 --2.4000e+02 6.5714e+02 -3.5188e+01 --2.4000e+02 6.8571e+02 -3.0187e+01 --2.4000e+02 7.1429e+02 -2.5920e+01 --2.4000e+02 7.4286e+02 -2.2300e+01 --2.4000e+02 7.7143e+02 -1.9230e+01 --2.4000e+02 8.0000e+02 -1.6618e+01 --2.4000e+02 8.2857e+02 -1.4384e+01 --2.4000e+02 8.5714e+02 -1.2460e+01 --2.4000e+02 8.8571e+02 -1.0793e+01 --2.4000e+02 9.1429e+02 -9.3385e+00 --2.4000e+02 9.4286e+02 -8.0611e+00 --2.4000e+02 9.7143e+02 -6.9322e+00 --2.4000e+02 1.0000e+03 -5.9288e+00 --2.4000e+02 1.0286e+03 -5.0321e+00 --2.4000e+02 1.0571e+03 -4.2265e+00 --2.4000e+02 1.0857e+03 -3.4995e+00 --2.4000e+02 1.1143e+03 -2.8403e+00 --2.4000e+02 1.1429e+03 -2.2404e+00 --2.4000e+02 1.1714e+03 -1.6922e+00 --2.4000e+02 1.2000e+03 -1.1896e+00 --2.4000e+02 1.2286e+03 -7.2715e-01 --2.4000e+02 1.2571e+03 -3.0042e-01 --2.4000e+02 1.2857e+03 9.4502e-02 --2.4000e+02 1.3143e+03 4.6097e-01 --2.4000e+02 1.3429e+03 8.0189e-01 --2.4000e+02 1.3714e+03 1.1198e+00 --2.4000e+02 1.4000e+03 1.4169e+00 --2.4000e+02 1.4286e+03 1.6952e+00 --2.4000e+02 1.4571e+03 1.9563e+00 --2.4000e+02 1.4857e+03 2.2018e+00 --2.4000e+02 1.5143e+03 2.4329e+00 --2.4000e+02 1.5429e+03 2.6510e+00 --2.4000e+02 1.5714e+03 2.8571e+00 --2.4000e+02 1.6000e+03 3.0521e+00 --2.4000e+02 1.6286e+03 3.2369e+00 --2.4000e+02 1.6571e+03 3.4122e+00 --2.4000e+02 1.6857e+03 3.5788e+00 --2.4000e+02 1.7143e+03 3.7373e+00 --2.4000e+02 1.7429e+03 3.8882e+00 --2.4000e+02 1.7714e+03 4.0322e+00 --2.4000e+02 1.8000e+03 4.1696e+00 --2.4000e+02 1.8286e+03 4.3008e+00 --2.4000e+02 1.8571e+03 4.4264e+00 --2.4000e+02 1.8857e+03 4.5466e+00 --2.4000e+02 1.9143e+03 4.6617e+00 --2.4000e+02 1.9429e+03 4.7722e+00 --2.4000e+02 1.9714e+03 4.8782e+00 --2.4000e+02 2.0000e+03 4.9801e+00 --2.1000e+02 -2.0000e+03 4.9682e+00 --2.1000e+02 -1.9714e+03 4.8657e+00 --2.1000e+02 -1.9429e+03 4.7590e+00 --2.1000e+02 -1.9143e+03 4.6478e+00 --2.1000e+02 -1.8857e+03 4.5318e+00 --2.1000e+02 -1.8571e+03 4.4107e+00 --2.1000e+02 -1.8286e+03 4.2842e+00 --2.1000e+02 -1.8000e+03 4.1519e+00 --2.1000e+02 -1.7714e+03 4.0133e+00 --2.1000e+02 -1.7429e+03 3.8682e+00 --2.1000e+02 -1.7143e+03 3.7159e+00 --2.1000e+02 -1.6857e+03 3.5559e+00 --2.1000e+02 -1.6571e+03 3.3877e+00 --2.1000e+02 -1.6286e+03 3.2106e+00 --2.1000e+02 -1.6000e+03 3.0239e+00 --2.1000e+02 -1.5714e+03 2.8268e+00 --2.1000e+02 -1.5429e+03 2.6184e+00 --2.1000e+02 -1.5143e+03 2.3977e+00 --2.1000e+02 -1.4857e+03 2.1636e+00 --2.1000e+02 -1.4571e+03 1.9150e+00 --2.1000e+02 -1.4286e+03 1.6503e+00 --2.1000e+02 -1.4000e+03 1.3681e+00 --2.1000e+02 -1.3714e+03 1.0665e+00 --2.1000e+02 -1.3429e+03 7.4354e-01 --2.1000e+02 -1.3143e+03 3.9693e-01 --2.1000e+02 -1.2857e+03 2.4017e-02 --2.1000e+02 -1.2571e+03 -3.7824e-01 --2.1000e+02 -1.2286e+03 -8.1336e-01 --2.1000e+02 -1.2000e+03 -1.2854e+00 --2.1000e+02 -1.1714e+03 -1.7992e+00 --2.1000e+02 -1.1429e+03 -2.3603e+00 --2.1000e+02 -1.1143e+03 -2.9752e+00 --2.1000e+02 -1.0857e+03 -3.6520e+00 --2.1000e+02 -1.0571e+03 -4.3998e+00 --2.1000e+02 -1.0286e+03 -5.2301e+00 --2.1000e+02 -1.0000e+03 -6.1564e+00 --2.1000e+02 -9.7143e+02 -7.1954e+00 --2.1000e+02 -9.4286e+02 -8.3674e+00 --2.1000e+02 -9.1429e+02 -9.6976e+00 --2.1000e+02 -8.8571e+02 -1.1217e+01 --2.1000e+02 -8.5714e+02 -1.2965e+01 --2.1000e+02 -8.2857e+02 -1.4990e+01 --2.1000e+02 -8.0000e+02 -1.7351e+01 --2.1000e+02 -7.7143e+02 -2.0123e+01 --2.1000e+02 -7.4286e+02 -2.3394e+01 --2.1000e+02 -7.1429e+02 -2.7264e+01 --2.1000e+02 -6.8571e+02 -3.1836e+01 --2.1000e+02 -6.5714e+02 -3.7191e+01 --2.1000e+02 -6.2857e+02 -4.3351e+01 --2.1000e+02 -6.0000e+02 -5.0220e+01 --2.1000e+02 -5.7143e+02 -5.7553e+01 --2.1000e+02 -5.4286e+02 -6.4976e+01 --2.1000e+02 -5.1429e+02 -7.2086e+01 --2.1000e+02 -4.8571e+02 -7.8573e+01 --2.1000e+02 -4.5714e+02 -8.4273e+01 --2.1000e+02 -4.2857e+02 -8.9162e+01 --2.1000e+02 -4.0000e+02 -9.3298e+01 --2.1000e+02 -3.7143e+02 -9.6779e+01 --2.1000e+02 -3.4286e+02 -9.9706e+01 --2.1000e+02 -3.1429e+02 -1.0217e+02 --2.1000e+02 -2.8571e+02 -1.0425e+02 --2.1000e+02 -2.5714e+02 -1.0602e+02 --2.1000e+02 -2.2857e+02 -1.0751e+02 --2.1000e+02 -2.0000e+02 -1.0877e+02 --2.1000e+02 -1.7143e+02 -1.0982e+02 --2.1000e+02 -1.4286e+02 -1.1070e+02 --2.1000e+02 -1.1429e+02 -1.1140e+02 --2.1000e+02 -8.5714e+01 -1.1195e+02 --2.1000e+02 -5.7143e+01 -1.1234e+02 --2.1000e+02 -2.8571e+01 -1.1257e+02 --2.1000e+02 0.0000e+00 -1.1265e+02 --2.1000e+02 2.8571e+01 -1.1257e+02 --2.1000e+02 5.7143e+01 -1.1234e+02 --2.1000e+02 8.5714e+01 -1.1195e+02 --2.1000e+02 1.1429e+02 -1.1140e+02 --2.1000e+02 1.4286e+02 -1.1070e+02 --2.1000e+02 1.7143e+02 -1.0982e+02 --2.1000e+02 2.0000e+02 -1.0877e+02 --2.1000e+02 2.2857e+02 -1.0751e+02 --2.1000e+02 2.5714e+02 -1.0602e+02 --2.1000e+02 2.8571e+02 -1.0425e+02 --2.1000e+02 3.1429e+02 -1.0217e+02 --2.1000e+02 3.4286e+02 -9.9706e+01 --2.1000e+02 3.7143e+02 -9.6779e+01 --2.1000e+02 4.0000e+02 -9.3298e+01 --2.1000e+02 4.2857e+02 -8.9162e+01 --2.1000e+02 4.5714e+02 -8.4273e+01 --2.1000e+02 4.8571e+02 -7.8573e+01 --2.1000e+02 5.1429e+02 -7.2086e+01 --2.1000e+02 5.4286e+02 -6.4976e+01 --2.1000e+02 5.7143e+02 -5.7553e+01 --2.1000e+02 6.0000e+02 -5.0220e+01 --2.1000e+02 6.2857e+02 -4.3351e+01 --2.1000e+02 6.5714e+02 -3.7191e+01 --2.1000e+02 6.8571e+02 -3.1836e+01 --2.1000e+02 7.1429e+02 -2.7264e+01 --2.1000e+02 7.4286e+02 -2.3394e+01 --2.1000e+02 7.7143e+02 -2.0123e+01 --2.1000e+02 8.0000e+02 -1.7351e+01 --2.1000e+02 8.2857e+02 -1.4990e+01 --2.1000e+02 8.5714e+02 -1.2965e+01 --2.1000e+02 8.8571e+02 -1.1217e+01 --2.1000e+02 9.1429e+02 -9.6976e+00 --2.1000e+02 9.4286e+02 -8.3674e+00 --2.1000e+02 9.7143e+02 -7.1954e+00 --2.1000e+02 1.0000e+03 -6.1564e+00 --2.1000e+02 1.0286e+03 -5.2301e+00 --2.1000e+02 1.0571e+03 -4.3998e+00 --2.1000e+02 1.0857e+03 -3.6520e+00 --2.1000e+02 1.1143e+03 -2.9752e+00 --2.1000e+02 1.1429e+03 -2.3603e+00 --2.1000e+02 1.1714e+03 -1.7992e+00 --2.1000e+02 1.2000e+03 -1.2854e+00 --2.1000e+02 1.2286e+03 -8.1336e-01 --2.1000e+02 1.2571e+03 -3.7824e-01 --2.1000e+02 1.2857e+03 2.4017e-02 --2.1000e+02 1.3143e+03 3.9693e-01 --2.1000e+02 1.3429e+03 7.4354e-01 --2.1000e+02 1.3714e+03 1.0665e+00 --2.1000e+02 1.4000e+03 1.3681e+00 --2.1000e+02 1.4286e+03 1.6503e+00 --2.1000e+02 1.4571e+03 1.9150e+00 --2.1000e+02 1.4857e+03 2.1636e+00 --2.1000e+02 1.5143e+03 2.3977e+00 --2.1000e+02 1.5429e+03 2.6184e+00 --2.1000e+02 1.5714e+03 2.8268e+00 --2.1000e+02 1.6000e+03 3.0239e+00 --2.1000e+02 1.6286e+03 3.2106e+00 --2.1000e+02 1.6571e+03 3.3877e+00 --2.1000e+02 1.6857e+03 3.5559e+00 --2.1000e+02 1.7143e+03 3.7159e+00 --2.1000e+02 1.7429e+03 3.8682e+00 --2.1000e+02 1.7714e+03 4.0133e+00 --2.1000e+02 1.8000e+03 4.1519e+00 --2.1000e+02 1.8286e+03 4.2842e+00 --2.1000e+02 1.8571e+03 4.4107e+00 --2.1000e+02 1.8857e+03 4.5318e+00 --2.1000e+02 1.9143e+03 4.6478e+00 --2.1000e+02 1.9429e+03 4.7590e+00 --2.1000e+02 1.9714e+03 4.8657e+00 --2.1000e+02 2.0000e+03 4.9682e+00 --1.8000e+02 -2.0000e+03 4.9579e+00 --1.8000e+02 -1.9714e+03 4.8548e+00 --1.8000e+02 -1.9429e+03 4.7475e+00 --1.8000e+02 -1.9143e+03 4.6356e+00 --1.8000e+02 -1.8857e+03 4.5189e+00 --1.8000e+02 -1.8571e+03 4.3970e+00 --1.8000e+02 -1.8286e+03 4.2696e+00 --1.8000e+02 -1.8000e+03 4.1364e+00 --1.8000e+02 -1.7714e+03 3.9969e+00 --1.8000e+02 -1.7429e+03 3.8507e+00 --1.8000e+02 -1.7143e+03 3.6972e+00 --1.8000e+02 -1.6857e+03 3.5359e+00 --1.8000e+02 -1.6571e+03 3.3663e+00 --1.8000e+02 -1.6286e+03 3.1877e+00 --1.8000e+02 -1.6000e+03 2.9993e+00 --1.8000e+02 -1.5714e+03 2.8003e+00 --1.8000e+02 -1.5429e+03 2.5898e+00 --1.8000e+02 -1.5143e+03 2.3668e+00 --1.8000e+02 -1.4857e+03 2.1302e+00 --1.8000e+02 -1.4571e+03 1.8787e+00 --1.8000e+02 -1.4286e+03 1.6109e+00 --1.8000e+02 -1.4000e+03 1.3251e+00 --1.8000e+02 -1.3714e+03 1.0196e+00 --1.8000e+02 -1.3429e+03 6.9220e-01 --1.8000e+02 -1.3143e+03 3.4054e-01 --1.8000e+02 -1.2857e+03 -3.8104e-02 --1.8000e+02 -1.2571e+03 -4.4690e-01 --1.8000e+02 -1.2286e+03 -8.8950e-01 --1.8000e+02 -1.2000e+03 -1.3702e+00 --1.8000e+02 -1.1714e+03 -1.8939e+00 --1.8000e+02 -1.1429e+03 -2.4665e+00 --1.8000e+02 -1.1143e+03 -3.0950e+00 --1.8000e+02 -1.0857e+03 -3.7876e+00 --1.8000e+02 -1.0571e+03 -4.5542e+00 --1.8000e+02 -1.0286e+03 -5.4069e+00 --1.8000e+02 -1.0000e+03 -6.3600e+00 --1.8000e+02 -9.7143e+02 -7.4313e+00 --1.8000e+02 -9.4286e+02 -8.6428e+00 --1.8000e+02 -9.1429e+02 -1.0021e+01 --1.8000e+02 -8.8571e+02 -1.1601e+01 --1.8000e+02 -8.5714e+02 -1.3423e+01 --1.8000e+02 -8.2857e+02 -1.5542e+01 --1.8000e+02 -8.0000e+02 -1.8021e+01 --1.8000e+02 -7.7143e+02 -2.0943e+01 --1.8000e+02 -7.4286e+02 -2.4402e+01 --1.8000e+02 -7.1429e+02 -2.8506e+01 --1.8000e+02 -6.8571e+02 -3.3360e+01 --1.8000e+02 -6.5714e+02 -3.9039e+01 --1.8000e+02 -6.2857e+02 -4.5536e+01 --1.8000e+02 -6.0000e+02 -5.2708e+01 --1.8000e+02 -5.7143e+02 -6.0248e+01 --1.8000e+02 -5.4286e+02 -6.7742e+01 --1.8000e+02 -5.1429e+02 -7.4786e+01 --1.8000e+02 -4.8571e+02 -8.1106e+01 --1.8000e+02 -4.5714e+02 -8.6592e+01 --1.8000e+02 -4.2857e+02 -9.1259e+01 --1.8000e+02 -4.0000e+02 -9.5189e+01 --1.8000e+02 -3.7143e+02 -9.8490e+01 --1.8000e+02 -3.4286e+02 -1.0127e+02 --1.8000e+02 -3.1429e+02 -1.0361e+02 --1.8000e+02 -2.8571e+02 -1.0559e+02 --1.8000e+02 -2.5714e+02 -1.0728e+02 --1.8000e+02 -2.2857e+02 -1.0871e+02 --1.8000e+02 -2.0000e+02 -1.0993e+02 --1.8000e+02 -1.7143e+02 -1.1096e+02 --1.8000e+02 -1.4286e+02 -1.1182e+02 --1.8000e+02 -1.1429e+02 -1.1252e+02 --1.8000e+02 -8.5714e+01 -1.1307e+02 --1.8000e+02 -5.7143e+01 -1.1346e+02 --1.8000e+02 -2.8571e+01 -1.1370e+02 --1.8000e+02 0.0000e+00 -1.1378e+02 --1.8000e+02 2.8571e+01 -1.1370e+02 --1.8000e+02 5.7143e+01 -1.1346e+02 --1.8000e+02 8.5714e+01 -1.1307e+02 --1.8000e+02 1.1429e+02 -1.1252e+02 --1.8000e+02 1.4286e+02 -1.1182e+02 --1.8000e+02 1.7143e+02 -1.1096e+02 --1.8000e+02 2.0000e+02 -1.0993e+02 --1.8000e+02 2.2857e+02 -1.0871e+02 --1.8000e+02 2.5714e+02 -1.0728e+02 --1.8000e+02 2.8571e+02 -1.0559e+02 --1.8000e+02 3.1429e+02 -1.0361e+02 --1.8000e+02 3.4286e+02 -1.0127e+02 --1.8000e+02 3.7143e+02 -9.8490e+01 --1.8000e+02 4.0000e+02 -9.5189e+01 --1.8000e+02 4.2857e+02 -9.1259e+01 --1.8000e+02 4.5714e+02 -8.6592e+01 --1.8000e+02 4.8571e+02 -8.1106e+01 --1.8000e+02 5.1429e+02 -7.4786e+01 --1.8000e+02 5.4286e+02 -6.7742e+01 --1.8000e+02 5.7143e+02 -6.0248e+01 --1.8000e+02 6.0000e+02 -5.2708e+01 --1.8000e+02 6.2857e+02 -4.5536e+01 --1.8000e+02 6.5714e+02 -3.9039e+01 --1.8000e+02 6.8571e+02 -3.3360e+01 --1.8000e+02 7.1429e+02 -2.8506e+01 --1.8000e+02 7.4286e+02 -2.4402e+01 --1.8000e+02 7.7143e+02 -2.0943e+01 --1.8000e+02 8.0000e+02 -1.8021e+01 --1.8000e+02 8.2857e+02 -1.5542e+01 --1.8000e+02 8.5714e+02 -1.3423e+01 --1.8000e+02 8.8571e+02 -1.1601e+01 --1.8000e+02 9.1429e+02 -1.0021e+01 --1.8000e+02 9.4286e+02 -8.6428e+00 --1.8000e+02 9.7143e+02 -7.4313e+00 --1.8000e+02 1.0000e+03 -6.3600e+00 --1.8000e+02 1.0286e+03 -5.4069e+00 --1.8000e+02 1.0571e+03 -4.5542e+00 --1.8000e+02 1.0857e+03 -3.7876e+00 --1.8000e+02 1.1143e+03 -3.0950e+00 --1.8000e+02 1.1429e+03 -2.4665e+00 --1.8000e+02 1.1714e+03 -1.8939e+00 --1.8000e+02 1.2000e+03 -1.3702e+00 --1.8000e+02 1.2286e+03 -8.8950e-01 --1.8000e+02 1.2571e+03 -4.4690e-01 --1.8000e+02 1.2857e+03 -3.8104e-02 --1.8000e+02 1.3143e+03 3.4054e-01 --1.8000e+02 1.3429e+03 6.9220e-01 --1.8000e+02 1.3714e+03 1.0196e+00 --1.8000e+02 1.4000e+03 1.3251e+00 --1.8000e+02 1.4286e+03 1.6109e+00 --1.8000e+02 1.4571e+03 1.8787e+00 --1.8000e+02 1.4857e+03 2.1302e+00 --1.8000e+02 1.5143e+03 2.3668e+00 --1.8000e+02 1.5429e+03 2.5898e+00 --1.8000e+02 1.5714e+03 2.8003e+00 --1.8000e+02 1.6000e+03 2.9993e+00 --1.8000e+02 1.6286e+03 3.1877e+00 --1.8000e+02 1.6571e+03 3.3663e+00 --1.8000e+02 1.6857e+03 3.5359e+00 --1.8000e+02 1.7143e+03 3.6972e+00 --1.8000e+02 1.7429e+03 3.8507e+00 --1.8000e+02 1.7714e+03 3.9969e+00 --1.8000e+02 1.8000e+03 4.1364e+00 --1.8000e+02 1.8286e+03 4.2696e+00 --1.8000e+02 1.8571e+03 4.3970e+00 --1.8000e+02 1.8857e+03 4.5189e+00 --1.8000e+02 1.9143e+03 4.6356e+00 --1.8000e+02 1.9429e+03 4.7475e+00 --1.8000e+02 1.9714e+03 4.8548e+00 --1.8000e+02 2.0000e+03 4.9579e+00 --1.5000e+02 -2.0000e+03 4.9491e+00 --1.5000e+02 -1.9714e+03 4.8456e+00 --1.5000e+02 -1.9429e+03 4.7377e+00 --1.5000e+02 -1.9143e+03 4.6252e+00 --1.5000e+02 -1.8857e+03 4.5079e+00 --1.5000e+02 -1.8571e+03 4.3854e+00 --1.5000e+02 -1.8286e+03 4.2573e+00 --1.5000e+02 -1.8000e+03 4.1233e+00 --1.5000e+02 -1.7714e+03 3.9829e+00 --1.5000e+02 -1.7429e+03 3.8357e+00 --1.5000e+02 -1.7143e+03 3.6812e+00 --1.5000e+02 -1.6857e+03 3.5189e+00 --1.5000e+02 -1.6571e+03 3.3481e+00 --1.5000e+02 -1.6286e+03 3.1681e+00 --1.5000e+02 -1.6000e+03 2.9782e+00 --1.5000e+02 -1.5714e+03 2.7776e+00 --1.5000e+02 -1.5429e+03 2.5654e+00 --1.5000e+02 -1.5143e+03 2.3404e+00 --1.5000e+02 -1.4857e+03 2.1017e+00 --1.5000e+02 -1.4571e+03 1.8477e+00 --1.5000e+02 -1.4286e+03 1.5772e+00 --1.5000e+02 -1.4000e+03 1.2884e+00 --1.5000e+02 -1.3714e+03 9.7945e-01 --1.5000e+02 -1.3429e+03 6.4819e-01 --1.5000e+02 -1.3143e+03 2.9217e-01 --1.5000e+02 -1.2857e+03 -9.1437e-02 --1.5000e+02 -1.2571e+03 -5.0589e-01 --1.5000e+02 -1.2286e+03 -9.5498e-01 --1.5000e+02 -1.2000e+03 -1.4431e+00 --1.5000e+02 -1.1714e+03 -1.9755e+00 --1.5000e+02 -1.1429e+03 -2.5582e+00 --1.5000e+02 -1.1143e+03 -3.1985e+00 --1.5000e+02 -1.0857e+03 -3.9049e+00 --1.5000e+02 -1.0571e+03 -4.6880e+00 --1.5000e+02 -1.0286e+03 -5.5603e+00 --1.5000e+02 -1.0000e+03 -6.5370e+00 --1.5000e+02 -9.7143e+02 -7.6370e+00 --1.5000e+02 -9.4286e+02 -8.8833e+00 --1.5000e+02 -9.1429e+02 -1.0305e+01 --1.5000e+02 -8.8571e+02 -1.1938e+01 --1.5000e+02 -8.5714e+02 -1.3827e+01 --1.5000e+02 -8.2857e+02 -1.6030e+01 --1.5000e+02 -8.0000e+02 -1.8616e+01 --1.5000e+02 -7.7143e+02 -2.1672e+01 --1.5000e+02 -7.4286e+02 -2.5301e+01 --1.5000e+02 -7.1429e+02 -2.9616e+01 --1.5000e+02 -6.8571e+02 -3.4723e+01 --1.5000e+02 -6.5714e+02 -4.0685e+01 --1.5000e+02 -6.2857e+02 -4.7468e+01 --1.5000e+02 -6.0000e+02 -5.4880e+01 --1.5000e+02 -5.7143e+02 -6.2563e+01 --1.5000e+02 -5.4286e+02 -7.0074e+01 --1.5000e+02 -5.1429e+02 -7.7025e+01 --1.5000e+02 -4.8571e+02 -8.3182e+01 --1.5000e+02 -4.5714e+02 -8.8476e+01 --1.5000e+02 -4.2857e+02 -9.2953e+01 --1.5000e+02 -4.0000e+02 -9.6713e+01 --1.5000e+02 -3.7143e+02 -9.9869e+01 --1.5000e+02 -3.4286e+02 -1.0252e+02 --1.5000e+02 -3.1429e+02 -1.0477e+02 --1.5000e+02 -2.8571e+02 -1.0668e+02 --1.5000e+02 -2.5714e+02 -1.0831e+02 --1.5000e+02 -2.2857e+02 -1.0970e+02 --1.5000e+02 -2.0000e+02 -1.1089e+02 --1.5000e+02 -1.7143e+02 -1.1191e+02 --1.5000e+02 -1.4286e+02 -1.1276e+02 --1.5000e+02 -1.1429e+02 -1.1347e+02 --1.5000e+02 -8.5714e+01 -1.1403e+02 --1.5000e+02 -5.7143e+01 -1.1444e+02 --1.5000e+02 -2.8571e+01 -1.1469e+02 --1.5000e+02 0.0000e+00 -1.1478e+02 --1.5000e+02 2.8571e+01 -1.1469e+02 --1.5000e+02 5.7143e+01 -1.1444e+02 --1.5000e+02 8.5714e+01 -1.1403e+02 --1.5000e+02 1.1429e+02 -1.1347e+02 --1.5000e+02 1.4286e+02 -1.1276e+02 --1.5000e+02 1.7143e+02 -1.1191e+02 --1.5000e+02 2.0000e+02 -1.1089e+02 --1.5000e+02 2.2857e+02 -1.0970e+02 --1.5000e+02 2.5714e+02 -1.0831e+02 --1.5000e+02 2.8571e+02 -1.0668e+02 --1.5000e+02 3.1429e+02 -1.0477e+02 --1.5000e+02 3.4286e+02 -1.0252e+02 --1.5000e+02 3.7143e+02 -9.9869e+01 --1.5000e+02 4.0000e+02 -9.6713e+01 --1.5000e+02 4.2857e+02 -9.2953e+01 --1.5000e+02 4.5714e+02 -8.8476e+01 --1.5000e+02 4.8571e+02 -8.3182e+01 --1.5000e+02 5.1429e+02 -7.7025e+01 --1.5000e+02 5.4286e+02 -7.0074e+01 --1.5000e+02 5.7143e+02 -6.2563e+01 --1.5000e+02 6.0000e+02 -5.4880e+01 --1.5000e+02 6.2857e+02 -4.7468e+01 --1.5000e+02 6.5714e+02 -4.0685e+01 --1.5000e+02 6.8571e+02 -3.4723e+01 --1.5000e+02 7.1429e+02 -2.9616e+01 --1.5000e+02 7.4286e+02 -2.5301e+01 --1.5000e+02 7.7143e+02 -2.1672e+01 --1.5000e+02 8.0000e+02 -1.8616e+01 --1.5000e+02 8.2857e+02 -1.6030e+01 --1.5000e+02 8.5714e+02 -1.3827e+01 --1.5000e+02 8.8571e+02 -1.1938e+01 --1.5000e+02 9.1429e+02 -1.0305e+01 --1.5000e+02 9.4286e+02 -8.8833e+00 --1.5000e+02 9.7143e+02 -7.6370e+00 --1.5000e+02 1.0000e+03 -6.5370e+00 --1.5000e+02 1.0286e+03 -5.5603e+00 --1.5000e+02 1.0571e+03 -4.6880e+00 --1.5000e+02 1.0857e+03 -3.9049e+00 --1.5000e+02 1.1143e+03 -3.1985e+00 --1.5000e+02 1.1429e+03 -2.5582e+00 --1.5000e+02 1.1714e+03 -1.9755e+00 --1.5000e+02 1.2000e+03 -1.4431e+00 --1.5000e+02 1.2286e+03 -9.5498e-01 --1.5000e+02 1.2571e+03 -5.0589e-01 --1.5000e+02 1.2857e+03 -9.1437e-02 --1.5000e+02 1.3143e+03 2.9217e-01 --1.5000e+02 1.3429e+03 6.4819e-01 --1.5000e+02 1.3714e+03 9.7945e-01 --1.5000e+02 1.4000e+03 1.2884e+00 --1.5000e+02 1.4286e+03 1.5772e+00 --1.5000e+02 1.4571e+03 1.8477e+00 --1.5000e+02 1.4857e+03 2.1017e+00 --1.5000e+02 1.5143e+03 2.3404e+00 --1.5000e+02 1.5429e+03 2.5654e+00 --1.5000e+02 1.5714e+03 2.7776e+00 --1.5000e+02 1.6000e+03 2.9782e+00 --1.5000e+02 1.6286e+03 3.1681e+00 --1.5000e+02 1.6571e+03 3.3481e+00 --1.5000e+02 1.6857e+03 3.5189e+00 --1.5000e+02 1.7143e+03 3.6812e+00 --1.5000e+02 1.7429e+03 3.8357e+00 --1.5000e+02 1.7714e+03 3.9829e+00 --1.5000e+02 1.8000e+03 4.1233e+00 --1.5000e+02 1.8286e+03 4.2573e+00 --1.5000e+02 1.8571e+03 4.3854e+00 --1.5000e+02 1.8857e+03 4.5079e+00 --1.5000e+02 1.9143e+03 4.6252e+00 --1.5000e+02 1.9429e+03 4.7377e+00 --1.5000e+02 1.9714e+03 4.8456e+00 --1.5000e+02 2.0000e+03 4.9491e+00 --1.2000e+02 -2.0000e+03 4.9419e+00 --1.2000e+02 -1.9714e+03 4.8379e+00 --1.2000e+02 -1.9429e+03 4.7296e+00 --1.2000e+02 -1.9143e+03 4.6167e+00 --1.2000e+02 -1.8857e+03 4.4989e+00 --1.2000e+02 -1.8571e+03 4.3758e+00 --1.2000e+02 -1.8286e+03 4.2471e+00 --1.2000e+02 -1.8000e+03 4.1124e+00 --1.2000e+02 -1.7714e+03 3.9714e+00 --1.2000e+02 -1.7429e+03 3.8234e+00 --1.2000e+02 -1.7143e+03 3.6681e+00 --1.2000e+02 -1.6857e+03 3.5049e+00 --1.2000e+02 -1.6571e+03 3.3330e+00 --1.2000e+02 -1.6286e+03 3.1520e+00 --1.2000e+02 -1.6000e+03 2.9609e+00 --1.2000e+02 -1.5714e+03 2.7590e+00 --1.2000e+02 -1.5429e+03 2.5452e+00 --1.2000e+02 -1.5143e+03 2.3187e+00 --1.2000e+02 -1.4857e+03 2.0781e+00 --1.2000e+02 -1.4571e+03 1.8222e+00 --1.2000e+02 -1.4286e+03 1.5494e+00 --1.2000e+02 -1.4000e+03 1.2580e+00 --1.2000e+02 -1.3714e+03 9.4624e-01 --1.2000e+02 -1.3429e+03 6.1178e-01 --1.2000e+02 -1.3143e+03 2.5213e-01 --1.2000e+02 -1.2857e+03 -1.3561e-01 --1.2000e+02 -1.2571e+03 -5.5478e-01 --1.2000e+02 -1.2286e+03 -1.0093e+00 --1.2000e+02 -1.2000e+03 -1.5037e+00 --1.2000e+02 -1.1714e+03 -2.0433e+00 --1.2000e+02 -1.1429e+03 -2.6344e+00 --1.2000e+02 -1.1143e+03 -3.2846e+00 --1.2000e+02 -1.0857e+03 -4.0028e+00 --1.2000e+02 -1.0571e+03 -4.7997e+00 --1.2000e+02 -1.0286e+03 -5.6885e+00 --1.2000e+02 -1.0000e+03 -6.6852e+00 --1.2000e+02 -9.7143e+02 -7.8095e+00 --1.2000e+02 -9.4286e+02 -9.0855e+00 --1.2000e+02 -9.1429e+02 -1.0544e+01 --1.2000e+02 -8.8571e+02 -1.2222e+01 --1.2000e+02 -8.5714e+02 -1.4169e+01 --1.2000e+02 -8.2857e+02 -1.6444e+01 --1.2000e+02 -8.0000e+02 -1.9122e+01 --1.2000e+02 -7.7143e+02 -2.2295e+01 --1.2000e+02 -7.4286e+02 -2.6071e+01 --1.2000e+02 -7.1429e+02 -3.0568e+01 --1.2000e+02 -6.8571e+02 -3.5889e+01 --1.2000e+02 -6.5714e+02 -4.2089e+01 --1.2000e+02 -6.2857e+02 -4.9103e+01 --1.2000e+02 -6.0000e+02 -5.6697e+01 --1.2000e+02 -5.7143e+02 -6.4471e+01 --1.2000e+02 -5.4286e+02 -7.1969e+01 --1.2000e+02 -5.1429e+02 -7.8821e+01 --1.2000e+02 -4.8571e+02 -8.4829e+01 --1.2000e+02 -4.5714e+02 -8.9961e+01 --1.2000e+02 -4.2857e+02 -9.4285e+01 --1.2000e+02 -4.0000e+02 -9.7910e+01 --1.2000e+02 -3.7143e+02 -1.0095e+02 --1.2000e+02 -3.4286e+02 -1.0352e+02 --1.2000e+02 -3.1429e+02 -1.0569e+02 --1.2000e+02 -2.8571e+02 -1.0754e+02 --1.2000e+02 -2.5714e+02 -1.0913e+02 --1.2000e+02 -2.2857e+02 -1.1049e+02 --1.2000e+02 -2.0000e+02 -1.1167e+02 --1.2000e+02 -1.7143e+02 -1.1268e+02 --1.2000e+02 -1.4286e+02 -1.1354e+02 --1.2000e+02 -1.1429e+02 -1.1427e+02 --1.2000e+02 -8.5714e+01 -1.1486e+02 --1.2000e+02 -5.7143e+01 -1.1529e+02 --1.2000e+02 -2.8571e+01 -1.1557e+02 --1.2000e+02 0.0000e+00 -1.1566e+02 --1.2000e+02 2.8571e+01 -1.1557e+02 --1.2000e+02 5.7143e+01 -1.1529e+02 --1.2000e+02 8.5714e+01 -1.1486e+02 --1.2000e+02 1.1429e+02 -1.1427e+02 --1.2000e+02 1.4286e+02 -1.1354e+02 --1.2000e+02 1.7143e+02 -1.1268e+02 --1.2000e+02 2.0000e+02 -1.1167e+02 --1.2000e+02 2.2857e+02 -1.1049e+02 --1.2000e+02 2.5714e+02 -1.0913e+02 --1.2000e+02 2.8571e+02 -1.0754e+02 --1.2000e+02 3.1429e+02 -1.0569e+02 --1.2000e+02 3.4286e+02 -1.0352e+02 --1.2000e+02 3.7143e+02 -1.0095e+02 --1.2000e+02 4.0000e+02 -9.7910e+01 --1.2000e+02 4.2857e+02 -9.4285e+01 --1.2000e+02 4.5714e+02 -8.9961e+01 --1.2000e+02 4.8571e+02 -8.4829e+01 --1.2000e+02 5.1429e+02 -7.8821e+01 --1.2000e+02 5.4286e+02 -7.1969e+01 --1.2000e+02 5.7143e+02 -6.4471e+01 --1.2000e+02 6.0000e+02 -5.6697e+01 --1.2000e+02 6.2857e+02 -4.9103e+01 --1.2000e+02 6.5714e+02 -4.2089e+01 --1.2000e+02 6.8571e+02 -3.5889e+01 --1.2000e+02 7.1429e+02 -3.0568e+01 --1.2000e+02 7.4286e+02 -2.6071e+01 --1.2000e+02 7.7143e+02 -2.2295e+01 --1.2000e+02 8.0000e+02 -1.9122e+01 --1.2000e+02 8.2857e+02 -1.6444e+01 --1.2000e+02 8.5714e+02 -1.4169e+01 --1.2000e+02 8.8571e+02 -1.2222e+01 --1.2000e+02 9.1429e+02 -1.0544e+01 --1.2000e+02 9.4286e+02 -9.0855e+00 --1.2000e+02 9.7143e+02 -7.8095e+00 --1.2000e+02 1.0000e+03 -6.6852e+00 --1.2000e+02 1.0286e+03 -5.6885e+00 --1.2000e+02 1.0571e+03 -4.7997e+00 --1.2000e+02 1.0857e+03 -4.0028e+00 --1.2000e+02 1.1143e+03 -3.2846e+00 --1.2000e+02 1.1429e+03 -2.6344e+00 --1.2000e+02 1.1714e+03 -2.0433e+00 --1.2000e+02 1.2000e+03 -1.5037e+00 --1.2000e+02 1.2286e+03 -1.0093e+00 --1.2000e+02 1.2571e+03 -5.5478e-01 --1.2000e+02 1.2857e+03 -1.3561e-01 --1.2000e+02 1.3143e+03 2.5213e-01 --1.2000e+02 1.3429e+03 6.1178e-01 --1.2000e+02 1.3714e+03 9.4624e-01 --1.2000e+02 1.4000e+03 1.2580e+00 --1.2000e+02 1.4286e+03 1.5494e+00 --1.2000e+02 1.4571e+03 1.8222e+00 --1.2000e+02 1.4857e+03 2.0781e+00 --1.2000e+02 1.5143e+03 2.3187e+00 --1.2000e+02 1.5429e+03 2.5452e+00 --1.2000e+02 1.5714e+03 2.7590e+00 --1.2000e+02 1.6000e+03 2.9609e+00 --1.2000e+02 1.6286e+03 3.1520e+00 --1.2000e+02 1.6571e+03 3.3330e+00 --1.2000e+02 1.6857e+03 3.5049e+00 --1.2000e+02 1.7143e+03 3.6681e+00 --1.2000e+02 1.7429e+03 3.8234e+00 --1.2000e+02 1.7714e+03 3.9714e+00 --1.2000e+02 1.8000e+03 4.1124e+00 --1.2000e+02 1.8286e+03 4.2471e+00 --1.2000e+02 1.8571e+03 4.3758e+00 --1.2000e+02 1.8857e+03 4.4989e+00 --1.2000e+02 1.9143e+03 4.6167e+00 --1.2000e+02 1.9429e+03 4.7296e+00 --1.2000e+02 1.9714e+03 4.8379e+00 --1.2000e+02 2.0000e+03 4.9419e+00 --9.0000e+01 -2.0000e+03 4.9363e+00 --9.0000e+01 -1.9714e+03 4.8320e+00 --9.0000e+01 -1.9429e+03 4.7233e+00 --9.0000e+01 -1.9143e+03 4.6100e+00 --9.0000e+01 -1.8857e+03 4.4918e+00 --9.0000e+01 -1.8571e+03 4.3683e+00 --9.0000e+01 -1.8286e+03 4.2391e+00 --9.0000e+01 -1.8000e+03 4.1040e+00 --9.0000e+01 -1.7714e+03 3.9624e+00 --9.0000e+01 -1.7429e+03 3.8138e+00 --9.0000e+01 -1.7143e+03 3.6579e+00 --9.0000e+01 -1.6857e+03 3.4939e+00 --9.0000e+01 -1.6571e+03 3.3213e+00 --9.0000e+01 -1.6286e+03 3.1393e+00 --9.0000e+01 -1.6000e+03 2.9473e+00 --9.0000e+01 -1.5714e+03 2.7444e+00 --9.0000e+01 -1.5429e+03 2.5295e+00 --9.0000e+01 -1.5143e+03 2.3016e+00 --9.0000e+01 -1.4857e+03 2.0596e+00 --9.0000e+01 -1.4571e+03 1.8021e+00 --9.0000e+01 -1.4286e+03 1.5276e+00 --9.0000e+01 -1.4000e+03 1.2342e+00 --9.0000e+01 -1.3714e+03 9.2020e-01 --9.0000e+01 -1.3429e+03 5.8321e-01 --9.0000e+01 -1.3143e+03 2.2070e-01 --9.0000e+01 -1.2857e+03 -1.7030e-01 --9.0000e+01 -1.2571e+03 -5.9321e-01 --9.0000e+01 -1.2286e+03 -1.0520e+00 --9.0000e+01 -1.2000e+03 -1.5513e+00 --9.0000e+01 -1.1714e+03 -2.0967e+00 --9.0000e+01 -1.1429e+03 -2.6945e+00 --9.0000e+01 -1.1143e+03 -3.3525e+00 --9.0000e+01 -1.0857e+03 -4.0800e+00 --9.0000e+01 -1.0571e+03 -4.8880e+00 --9.0000e+01 -1.0286e+03 -5.7901e+00 --9.0000e+01 -1.0000e+03 -6.8027e+00 --9.0000e+01 -9.7143e+02 -7.9464e+00 --9.0000e+01 -9.4286e+02 -9.2463e+00 --9.0000e+01 -9.1429e+02 -1.0734e+01 --9.0000e+01 -8.8571e+02 -1.2449e+01 --9.0000e+01 -8.5714e+02 -1.4442e+01 --9.0000e+01 -8.2857e+02 -1.6776e+01 --9.0000e+01 -8.0000e+02 -1.9529e+01 --9.0000e+01 -7.7143e+02 -2.2796e+01 --9.0000e+01 -7.4286e+02 -2.6692e+01 --9.0000e+01 -7.1429e+02 -3.1335e+01 --9.0000e+01 -6.8571e+02 -3.6830e+01 --9.0000e+01 -6.5714e+02 -4.3217e+01 --9.0000e+01 -6.2857e+02 -5.0408e+01 --9.0000e+01 -6.0000e+02 -5.8132e+01 --9.0000e+01 -5.7143e+02 -6.5960e+01 --9.0000e+01 -5.4286e+02 -7.3430e+01 --9.0000e+01 -5.1429e+02 -8.0191e+01 --9.0000e+01 -4.8571e+02 -8.6078e+01 --9.0000e+01 -4.5714e+02 -9.1083e+01 --9.0000e+01 -4.2857e+02 -9.5288e+01 --9.0000e+01 -4.0000e+02 -9.8810e+01 --9.0000e+01 -3.7143e+02 -1.0177e+02 --9.0000e+01 -3.4286e+02 -1.0426e+02 --9.0000e+01 -3.1429e+02 -1.0638e+02 --9.0000e+01 -2.8571e+02 -1.0819e+02 --9.0000e+01 -2.5714e+02 -1.0975e+02 --9.0000e+01 -2.2857e+02 -1.1110e+02 --9.0000e+01 -2.0000e+02 -1.1227e+02 --9.0000e+01 -1.7143e+02 -1.1329e+02 --9.0000e+01 -1.4286e+02 -1.1416e+02 --9.0000e+01 -1.1429e+02 -1.1492e+02 --9.0000e+01 -8.5714e+01 -1.1554e+02 --9.0000e+01 -5.7143e+01 -1.1603e+02 --9.0000e+01 -2.8571e+01 -1.1634e+02 --9.0000e+01 0.0000e+00 -1.1645e+02 --9.0000e+01 2.8571e+01 -1.1634e+02 --9.0000e+01 5.7143e+01 -1.1603e+02 --9.0000e+01 8.5714e+01 -1.1554e+02 --9.0000e+01 1.1429e+02 -1.1492e+02 --9.0000e+01 1.4286e+02 -1.1416e+02 --9.0000e+01 1.7143e+02 -1.1329e+02 --9.0000e+01 2.0000e+02 -1.1227e+02 --9.0000e+01 2.2857e+02 -1.1110e+02 --9.0000e+01 2.5714e+02 -1.0975e+02 --9.0000e+01 2.8571e+02 -1.0819e+02 --9.0000e+01 3.1429e+02 -1.0638e+02 --9.0000e+01 3.4286e+02 -1.0426e+02 --9.0000e+01 3.7143e+02 -1.0177e+02 --9.0000e+01 4.0000e+02 -9.8810e+01 --9.0000e+01 4.2857e+02 -9.5288e+01 --9.0000e+01 4.5714e+02 -9.1083e+01 --9.0000e+01 4.8571e+02 -8.6078e+01 --9.0000e+01 5.1429e+02 -8.0191e+01 --9.0000e+01 5.4286e+02 -7.3430e+01 --9.0000e+01 5.7143e+02 -6.5960e+01 --9.0000e+01 6.0000e+02 -5.8132e+01 --9.0000e+01 6.2857e+02 -5.0408e+01 --9.0000e+01 6.5714e+02 -4.3217e+01 --9.0000e+01 6.8571e+02 -3.6830e+01 --9.0000e+01 7.1429e+02 -3.1335e+01 --9.0000e+01 7.4286e+02 -2.6692e+01 --9.0000e+01 7.7143e+02 -2.2796e+01 --9.0000e+01 8.0000e+02 -1.9529e+01 --9.0000e+01 8.2857e+02 -1.6776e+01 --9.0000e+01 8.5714e+02 -1.4442e+01 --9.0000e+01 8.8571e+02 -1.2449e+01 --9.0000e+01 9.1429e+02 -1.0734e+01 --9.0000e+01 9.4286e+02 -9.2463e+00 --9.0000e+01 9.7143e+02 -7.9464e+00 --9.0000e+01 1.0000e+03 -6.8027e+00 --9.0000e+01 1.0286e+03 -5.7901e+00 --9.0000e+01 1.0571e+03 -4.8880e+00 --9.0000e+01 1.0857e+03 -4.0800e+00 --9.0000e+01 1.1143e+03 -3.3525e+00 --9.0000e+01 1.1429e+03 -2.6945e+00 --9.0000e+01 1.1714e+03 -2.0967e+00 --9.0000e+01 1.2000e+03 -1.5513e+00 --9.0000e+01 1.2286e+03 -1.0520e+00 --9.0000e+01 1.2571e+03 -5.9321e-01 --9.0000e+01 1.2857e+03 -1.7030e-01 --9.0000e+01 1.3143e+03 2.2070e-01 --9.0000e+01 1.3429e+03 5.8321e-01 --9.0000e+01 1.3714e+03 9.2020e-01 --9.0000e+01 1.4000e+03 1.2342e+00 --9.0000e+01 1.4286e+03 1.5276e+00 --9.0000e+01 1.4571e+03 1.8021e+00 --9.0000e+01 1.4857e+03 2.0596e+00 --9.0000e+01 1.5143e+03 2.3016e+00 --9.0000e+01 1.5429e+03 2.5295e+00 --9.0000e+01 1.5714e+03 2.7444e+00 --9.0000e+01 1.6000e+03 2.9473e+00 --9.0000e+01 1.6286e+03 3.1393e+00 --9.0000e+01 1.6571e+03 3.3213e+00 --9.0000e+01 1.6857e+03 3.4939e+00 --9.0000e+01 1.7143e+03 3.6579e+00 --9.0000e+01 1.7429e+03 3.8138e+00 --9.0000e+01 1.7714e+03 3.9624e+00 --9.0000e+01 1.8000e+03 4.1040e+00 --9.0000e+01 1.8286e+03 4.2391e+00 --9.0000e+01 1.8571e+03 4.3683e+00 --9.0000e+01 1.8857e+03 4.4918e+00 --9.0000e+01 1.9143e+03 4.6100e+00 --9.0000e+01 1.9429e+03 4.7233e+00 --9.0000e+01 1.9714e+03 4.8320e+00 --9.0000e+01 2.0000e+03 4.9363e+00 --6.0000e+01 -2.0000e+03 4.9323e+00 --6.0000e+01 -1.9714e+03 4.8277e+00 --6.0000e+01 -1.9429e+03 4.7188e+00 --6.0000e+01 -1.9143e+03 4.6053e+00 --6.0000e+01 -1.8857e+03 4.4867e+00 --6.0000e+01 -1.8571e+03 4.3629e+00 --6.0000e+01 -1.8286e+03 4.2334e+00 --6.0000e+01 -1.8000e+03 4.0979e+00 --6.0000e+01 -1.7714e+03 3.9559e+00 --6.0000e+01 -1.7429e+03 3.8069e+00 --6.0000e+01 -1.7143e+03 3.6505e+00 --6.0000e+01 -1.6857e+03 3.4860e+00 --6.0000e+01 -1.6571e+03 3.3128e+00 --6.0000e+01 -1.6286e+03 3.1303e+00 --6.0000e+01 -1.6000e+03 2.9376e+00 --6.0000e+01 -1.5714e+03 2.7339e+00 --6.0000e+01 -1.5429e+03 2.5182e+00 --6.0000e+01 -1.5143e+03 2.2894e+00 --6.0000e+01 -1.4857e+03 2.0464e+00 --6.0000e+01 -1.4571e+03 1.7877e+00 --6.0000e+01 -1.4286e+03 1.5119e+00 --6.0000e+01 -1.4000e+03 1.2171e+00 --6.0000e+01 -1.3714e+03 9.0148e-01 --6.0000e+01 -1.3429e+03 5.6267e-01 --6.0000e+01 -1.3143e+03 1.9809e-01 --6.0000e+01 -1.2857e+03 -1.9527e-01 --6.0000e+01 -1.2571e+03 -6.2087e-01 --6.0000e+01 -1.2286e+03 -1.0828e+00 --6.0000e+01 -1.2000e+03 -1.5857e+00 --6.0000e+01 -1.1714e+03 -2.1352e+00 --6.0000e+01 -1.1429e+03 -2.7379e+00 --6.0000e+01 -1.1143e+03 -3.4016e+00 --6.0000e+01 -1.0857e+03 -4.1358e+00 --6.0000e+01 -1.0571e+03 -4.9518e+00 --6.0000e+01 -1.0286e+03 -5.8635e+00 --6.0000e+01 -1.0000e+03 -6.8878e+00 --6.0000e+01 -9.7143e+02 -8.0457e+00 --6.0000e+01 -9.4286e+02 -9.3630e+00 --6.0000e+01 -9.1429e+02 -1.0872e+01 --6.0000e+01 -8.8571e+02 -1.2615e+01 --6.0000e+01 -8.5714e+02 -1.4642e+01 --6.0000e+01 -8.2857e+02 -1.7019e+01 --6.0000e+01 -8.0000e+02 -1.9826e+01 --6.0000e+01 -7.7143e+02 -2.3164e+01 --6.0000e+01 -7.4286e+02 -2.7148e+01 --6.0000e+01 -7.1429e+02 -3.1899e+01 --6.0000e+01 -6.8571e+02 -3.7520e+01 --6.0000e+01 -6.5714e+02 -4.4042e+01 --6.0000e+01 -6.2857e+02 -5.1357e+01 --6.0000e+01 -6.0000e+02 -5.9167e+01 --6.0000e+01 -5.7143e+02 -6.7024e+01 --6.0000e+01 -5.4286e+02 -7.4464e+01 --6.0000e+01 -5.1429e+02 -8.1155e+01 --6.0000e+01 -4.8571e+02 -8.6952e+01 --6.0000e+01 -4.5714e+02 -9.1865e+01 --6.0000e+01 -4.2857e+02 -9.5987e+01 --6.0000e+01 -4.0000e+02 -9.9438e+01 --6.0000e+01 -3.7143e+02 -1.0234e+02 --6.0000e+01 -3.4286e+02 -1.0479e+02 --6.0000e+01 -3.1429e+02 -1.0687e+02 --6.0000e+01 -2.8571e+02 -1.0865e+02 --6.0000e+01 -2.5714e+02 -1.1019e+02 --6.0000e+01 -2.2857e+02 -1.1153e+02 --6.0000e+01 -2.0000e+02 -1.1270e+02 --6.0000e+01 -1.7143e+02 -1.1372e+02 --6.0000e+01 -1.4286e+02 -1.1462e+02 --6.0000e+01 -1.1429e+02 -1.1540e+02 --6.0000e+01 -8.5714e+01 -1.1608e+02 --6.0000e+01 -5.7143e+01 -1.1663e+02 --6.0000e+01 -2.8571e+01 -1.1702e+02 --6.0000e+01 0.0000e+00 -1.1716e+02 --6.0000e+01 2.8571e+01 -1.1702e+02 --6.0000e+01 5.7143e+01 -1.1663e+02 --6.0000e+01 8.5714e+01 -1.1608e+02 --6.0000e+01 1.1429e+02 -1.1540e+02 --6.0000e+01 1.4286e+02 -1.1462e+02 --6.0000e+01 1.7143e+02 -1.1372e+02 --6.0000e+01 2.0000e+02 -1.1270e+02 --6.0000e+01 2.2857e+02 -1.1153e+02 --6.0000e+01 2.5714e+02 -1.1019e+02 --6.0000e+01 2.8571e+02 -1.0865e+02 --6.0000e+01 3.1429e+02 -1.0687e+02 --6.0000e+01 3.4286e+02 -1.0479e+02 --6.0000e+01 3.7143e+02 -1.0234e+02 --6.0000e+01 4.0000e+02 -9.9438e+01 --6.0000e+01 4.2857e+02 -9.5987e+01 --6.0000e+01 4.5714e+02 -9.1865e+01 --6.0000e+01 4.8571e+02 -8.6952e+01 --6.0000e+01 5.1429e+02 -8.1155e+01 --6.0000e+01 5.4286e+02 -7.4464e+01 --6.0000e+01 5.7143e+02 -6.7024e+01 --6.0000e+01 6.0000e+02 -5.9167e+01 --6.0000e+01 6.2857e+02 -5.1357e+01 --6.0000e+01 6.5714e+02 -4.4042e+01 --6.0000e+01 6.8571e+02 -3.7520e+01 --6.0000e+01 7.1429e+02 -3.1899e+01 --6.0000e+01 7.4286e+02 -2.7148e+01 --6.0000e+01 7.7143e+02 -2.3164e+01 --6.0000e+01 8.0000e+02 -1.9826e+01 --6.0000e+01 8.2857e+02 -1.7019e+01 --6.0000e+01 8.5714e+02 -1.4642e+01 --6.0000e+01 8.8571e+02 -1.2615e+01 --6.0000e+01 9.1429e+02 -1.0872e+01 --6.0000e+01 9.4286e+02 -9.3630e+00 --6.0000e+01 9.7143e+02 -8.0457e+00 --6.0000e+01 1.0000e+03 -6.8878e+00 --6.0000e+01 1.0286e+03 -5.8635e+00 --6.0000e+01 1.0571e+03 -4.9518e+00 --6.0000e+01 1.0857e+03 -4.1358e+00 --6.0000e+01 1.1143e+03 -3.4016e+00 --6.0000e+01 1.1429e+03 -2.7379e+00 --6.0000e+01 1.1714e+03 -2.1352e+00 --6.0000e+01 1.2000e+03 -1.5857e+00 --6.0000e+01 1.2286e+03 -1.0828e+00 --6.0000e+01 1.2571e+03 -6.2087e-01 --6.0000e+01 1.2857e+03 -1.9527e-01 --6.0000e+01 1.3143e+03 1.9809e-01 --6.0000e+01 1.3429e+03 5.6267e-01 --6.0000e+01 1.3714e+03 9.0148e-01 --6.0000e+01 1.4000e+03 1.2171e+00 --6.0000e+01 1.4286e+03 1.5119e+00 --6.0000e+01 1.4571e+03 1.7877e+00 --6.0000e+01 1.4857e+03 2.0464e+00 --6.0000e+01 1.5143e+03 2.2894e+00 --6.0000e+01 1.5429e+03 2.5182e+00 --6.0000e+01 1.5714e+03 2.7339e+00 --6.0000e+01 1.6000e+03 2.9376e+00 --6.0000e+01 1.6286e+03 3.1303e+00 --6.0000e+01 1.6571e+03 3.3128e+00 --6.0000e+01 1.6857e+03 3.4860e+00 --6.0000e+01 1.7143e+03 3.6505e+00 --6.0000e+01 1.7429e+03 3.8069e+00 --6.0000e+01 1.7714e+03 3.9559e+00 --6.0000e+01 1.8000e+03 4.0979e+00 --6.0000e+01 1.8286e+03 4.2334e+00 --6.0000e+01 1.8571e+03 4.3629e+00 --6.0000e+01 1.8857e+03 4.4867e+00 --6.0000e+01 1.9143e+03 4.6053e+00 --6.0000e+01 1.9429e+03 4.7188e+00 --6.0000e+01 1.9714e+03 4.8277e+00 --6.0000e+01 2.0000e+03 4.9323e+00 --3.0000e+01 -2.0000e+03 4.9299e+00 --3.0000e+01 -1.9714e+03 4.8252e+00 --3.0000e+01 -1.9429e+03 4.7161e+00 --3.0000e+01 -1.9143e+03 4.6024e+00 --3.0000e+01 -1.8857e+03 4.4837e+00 --3.0000e+01 -1.8571e+03 4.3597e+00 --3.0000e+01 -1.8286e+03 4.2300e+00 --3.0000e+01 -1.8000e+03 4.0943e+00 --3.0000e+01 -1.7714e+03 3.9520e+00 --3.0000e+01 -1.7429e+03 3.8028e+00 --3.0000e+01 -1.7143e+03 3.6461e+00 --3.0000e+01 -1.6857e+03 3.4813e+00 --3.0000e+01 -1.6571e+03 3.3078e+00 --3.0000e+01 -1.6286e+03 3.1249e+00 --3.0000e+01 -1.6000e+03 2.9317e+00 --3.0000e+01 -1.5714e+03 2.7276e+00 --3.0000e+01 -1.5429e+03 2.5114e+00 --3.0000e+01 -1.5143e+03 2.2820e+00 --3.0000e+01 -1.4857e+03 2.0384e+00 --3.0000e+01 -1.4571e+03 1.7790e+00 --3.0000e+01 -1.4286e+03 1.5024e+00 --3.0000e+01 -1.4000e+03 1.2068e+00 --3.0000e+01 -1.3714e+03 8.9021e-01 --3.0000e+01 -1.3429e+03 5.5029e-01 --3.0000e+01 -1.3143e+03 1.8446e-01 --3.0000e+01 -1.2857e+03 -2.1032e-01 --3.0000e+01 -1.2571e+03 -6.3755e-01 --3.0000e+01 -1.2286e+03 -1.1013e+00 --3.0000e+01 -1.2000e+03 -1.6064e+00 --3.0000e+01 -1.1714e+03 -2.1584e+00 --3.0000e+01 -1.1429e+03 -2.7641e+00 --3.0000e+01 -1.1143e+03 -3.4312e+00 --3.0000e+01 -1.0857e+03 -4.1695e+00 --3.0000e+01 -1.0571e+03 -4.9904e+00 --3.0000e+01 -1.0286e+03 -5.9080e+00 --3.0000e+01 -1.0000e+03 -6.9394e+00 --3.0000e+01 -9.7143e+02 -8.1059e+00 --3.0000e+01 -9.4286e+02 -9.4338e+00 --3.0000e+01 -9.1429e+02 -1.0956e+01 --3.0000e+01 -8.8571e+02 -1.2715e+01 --3.0000e+01 -8.5714e+02 -1.4763e+01 --3.0000e+01 -8.2857e+02 -1.7166e+01 --3.0000e+01 -8.0000e+02 -2.0008e+01 --3.0000e+01 -7.7143e+02 -2.3388e+01 --3.0000e+01 -7.4286e+02 -2.7426e+01 --3.0000e+01 -7.1429e+02 -3.2244e+01 --3.0000e+01 -6.8571e+02 -3.7942e+01 --3.0000e+01 -6.5714e+02 -4.4545e+01 --3.0000e+01 -6.2857e+02 -5.1932e+01 --3.0000e+01 -6.0000e+02 -5.9791e+01 --3.0000e+01 -5.7143e+02 -6.7662e+01 --3.0000e+01 -5.4286e+02 -7.5081e+01 --3.0000e+01 -5.1429e+02 -8.1727e+01 --3.0000e+01 -4.8571e+02 -8.7469e+01 --3.0000e+01 -4.5714e+02 -9.2327e+01 --3.0000e+01 -4.2857e+02 -9.6400e+01 --3.0000e+01 -4.0000e+02 -9.9809e+01 --3.0000e+01 -3.7143e+02 -1.0267e+02 --3.0000e+01 -3.4286e+02 -1.0509e+02 --3.0000e+01 -3.1429e+02 -1.0716e+02 --3.0000e+01 -2.8571e+02 -1.0892e+02 --3.0000e+01 -2.5714e+02 -1.1046e+02 --3.0000e+01 -2.2857e+02 -1.1179e+02 --3.0000e+01 -2.0000e+02 -1.1296e+02 --3.0000e+01 -1.7143e+02 -1.1399e+02 --3.0000e+01 -1.4286e+02 -1.1490e+02 --3.0000e+01 -1.1429e+02 -1.1571e+02 --3.0000e+01 -8.5714e+01 -1.1643e+02 --3.0000e+01 -5.7143e+01 -1.1706e+02 --3.0000e+01 -2.8571e+01 -1.1757e+02 --3.0000e+01 0.0000e+00 -1.1780e+02 --3.0000e+01 2.8571e+01 -1.1757e+02 --3.0000e+01 5.7143e+01 -1.1706e+02 --3.0000e+01 8.5714e+01 -1.1643e+02 --3.0000e+01 1.1429e+02 -1.1571e+02 --3.0000e+01 1.4286e+02 -1.1490e+02 --3.0000e+01 1.7143e+02 -1.1399e+02 --3.0000e+01 2.0000e+02 -1.1296e+02 --3.0000e+01 2.2857e+02 -1.1179e+02 --3.0000e+01 2.5714e+02 -1.1046e+02 --3.0000e+01 2.8571e+02 -1.0892e+02 --3.0000e+01 3.1429e+02 -1.0716e+02 --3.0000e+01 3.4286e+02 -1.0509e+02 --3.0000e+01 3.7143e+02 -1.0267e+02 --3.0000e+01 4.0000e+02 -9.9809e+01 --3.0000e+01 4.2857e+02 -9.6400e+01 --3.0000e+01 4.5714e+02 -9.2327e+01 --3.0000e+01 4.8571e+02 -8.7469e+01 --3.0000e+01 5.1429e+02 -8.1727e+01 --3.0000e+01 5.4286e+02 -7.5081e+01 --3.0000e+01 5.7143e+02 -6.7662e+01 --3.0000e+01 6.0000e+02 -5.9791e+01 --3.0000e+01 6.2857e+02 -5.1932e+01 --3.0000e+01 6.5714e+02 -4.4545e+01 --3.0000e+01 6.8571e+02 -3.7942e+01 --3.0000e+01 7.1429e+02 -3.2244e+01 --3.0000e+01 7.4286e+02 -2.7426e+01 --3.0000e+01 7.7143e+02 -2.3388e+01 --3.0000e+01 8.0000e+02 -2.0008e+01 --3.0000e+01 8.2857e+02 -1.7166e+01 --3.0000e+01 8.5714e+02 -1.4763e+01 --3.0000e+01 8.8571e+02 -1.2715e+01 --3.0000e+01 9.1429e+02 -1.0956e+01 --3.0000e+01 9.4286e+02 -9.4338e+00 --3.0000e+01 9.7143e+02 -8.1059e+00 --3.0000e+01 1.0000e+03 -6.9394e+00 --3.0000e+01 1.0286e+03 -5.9080e+00 --3.0000e+01 1.0571e+03 -4.9904e+00 --3.0000e+01 1.0857e+03 -4.1695e+00 --3.0000e+01 1.1143e+03 -3.4312e+00 --3.0000e+01 1.1429e+03 -2.7641e+00 --3.0000e+01 1.1714e+03 -2.1584e+00 --3.0000e+01 1.2000e+03 -1.6064e+00 --3.0000e+01 1.2286e+03 -1.1013e+00 --3.0000e+01 1.2571e+03 -6.3755e-01 --3.0000e+01 1.2857e+03 -2.1032e-01 --3.0000e+01 1.3143e+03 1.8446e-01 --3.0000e+01 1.3429e+03 5.5029e-01 --3.0000e+01 1.3714e+03 8.9021e-01 --3.0000e+01 1.4000e+03 1.2068e+00 --3.0000e+01 1.4286e+03 1.5024e+00 --3.0000e+01 1.4571e+03 1.7790e+00 --3.0000e+01 1.4857e+03 2.0384e+00 --3.0000e+01 1.5143e+03 2.2820e+00 --3.0000e+01 1.5429e+03 2.5114e+00 --3.0000e+01 1.5714e+03 2.7276e+00 --3.0000e+01 1.6000e+03 2.9317e+00 --3.0000e+01 1.6286e+03 3.1249e+00 --3.0000e+01 1.6571e+03 3.3078e+00 --3.0000e+01 1.6857e+03 3.4813e+00 --3.0000e+01 1.7143e+03 3.6461e+00 --3.0000e+01 1.7429e+03 3.8028e+00 --3.0000e+01 1.7714e+03 3.9520e+00 --3.0000e+01 1.8000e+03 4.0943e+00 --3.0000e+01 1.8286e+03 4.2300e+00 --3.0000e+01 1.8571e+03 4.3597e+00 --3.0000e+01 1.8857e+03 4.4837e+00 --3.0000e+01 1.9143e+03 4.6024e+00 --3.0000e+01 1.9429e+03 4.7161e+00 --3.0000e+01 1.9714e+03 4.8252e+00 --3.0000e+01 2.0000e+03 4.9299e+00 -0.0000e+00 -2.0000e+03 4.9290e+00 -0.0000e+00 -1.9714e+03 4.8243e+00 -0.0000e+00 -1.9429e+03 4.7152e+00 -0.0000e+00 -1.9143e+03 4.6015e+00 -0.0000e+00 -1.8857e+03 4.4827e+00 -0.0000e+00 -1.8571e+03 4.3586e+00 -0.0000e+00 -1.8286e+03 4.2289e+00 -0.0000e+00 -1.8000e+03 4.0931e+00 -0.0000e+00 -1.7714e+03 3.9507e+00 -0.0000e+00 -1.7429e+03 3.8014e+00 -0.0000e+00 -1.7143e+03 3.6446e+00 -0.0000e+00 -1.6857e+03 3.4797e+00 -0.0000e+00 -1.6571e+03 3.3061e+00 -0.0000e+00 -1.6286e+03 3.1230e+00 -0.0000e+00 -1.6000e+03 2.9298e+00 -0.0000e+00 -1.5714e+03 2.7255e+00 -0.0000e+00 -1.5429e+03 2.5091e+00 -0.0000e+00 -1.5143e+03 2.2796e+00 -0.0000e+00 -1.4857e+03 2.0357e+00 -0.0000e+00 -1.4571e+03 1.7761e+00 -0.0000e+00 -1.4286e+03 1.4993e+00 -0.0000e+00 -1.4000e+03 1.2034e+00 -0.0000e+00 -1.3714e+03 8.8644e-01 -0.0000e+00 -1.3429e+03 5.4616e-01 -0.0000e+00 -1.3143e+03 1.7990e-01 -0.0000e+00 -1.2857e+03 -2.1535e-01 -0.0000e+00 -1.2571e+03 -6.4313e-01 -0.0000e+00 -1.2286e+03 -1.1075e+00 -0.0000e+00 -1.2000e+03 -1.6133e+00 -0.0000e+00 -1.1714e+03 -2.1662e+00 -0.0000e+00 -1.1429e+03 -2.7728e+00 -0.0000e+00 -1.1143e+03 -3.4412e+00 -0.0000e+00 -1.0857e+03 -4.1808e+00 -0.0000e+00 -1.0571e+03 -5.0034e+00 -0.0000e+00 -1.0286e+03 -5.9229e+00 -0.0000e+00 -1.0000e+03 -6.9567e+00 -0.0000e+00 -9.7143e+02 -8.1260e+00 -0.0000e+00 -9.4286e+02 -9.4576e+00 -0.0000e+00 -9.1429e+02 -1.0985e+01 -0.0000e+00 -8.8571e+02 -1.2749e+01 -0.0000e+00 -8.5714e+02 -1.4804e+01 -0.0000e+00 -8.2857e+02 -1.7216e+01 -0.0000e+00 -8.0000e+02 -2.0069e+01 -0.0000e+00 -7.7143e+02 -2.3464e+01 -0.0000e+00 -7.4286e+02 -2.7520e+01 -0.0000e+00 -7.1429e+02 -3.2360e+01 -0.0000e+00 -6.8571e+02 -3.8083e+01 -0.0000e+00 -6.5714e+02 -4.4714e+01 -0.0000e+00 -6.2857e+02 -5.2125e+01 -0.0000e+00 -6.0000e+02 -6.0000e+01 -0.0000e+00 -5.7143e+02 -6.7875e+01 -0.0000e+00 -5.4286e+02 -7.5286e+01 -0.0000e+00 -5.1429e+02 -8.1917e+01 -0.0000e+00 -4.8571e+02 -8.7640e+01 -0.0000e+00 -4.5714e+02 -9.2480e+01 -0.0000e+00 -4.2857e+02 -9.6536e+01 -0.0000e+00 -4.0000e+02 -9.9931e+01 -0.0000e+00 -3.7143e+02 -1.0278e+02 -0.0000e+00 -3.4286e+02 -1.0520e+02 -0.0000e+00 -3.1429e+02 -1.0725e+02 -0.0000e+00 -2.8571e+02 -1.0902e+02 -0.0000e+00 -2.5714e+02 -1.1054e+02 -0.0000e+00 -2.2857e+02 -1.1187e+02 -0.0000e+00 -2.0000e+02 -1.1304e+02 -0.0000e+00 -1.7143e+02 -1.1408e+02 -0.0000e+00 -1.4286e+02 -1.1500e+02 -0.0000e+00 -1.1429e+02 -1.1582e+02 -0.0000e+00 -8.5714e+01 -1.1656e+02 -0.0000e+00 -5.7143e+01 -1.1723e+02 -0.0000e+00 -2.8571e+01 -1.1783e+02 -0.0000e+00 0.0000e+00 -1.1839e+02 -0.0000e+00 2.8571e+01 -1.1783e+02 -0.0000e+00 5.7143e+01 -1.1723e+02 -0.0000e+00 8.5714e+01 -1.1656e+02 -0.0000e+00 1.1429e+02 -1.1582e+02 -0.0000e+00 1.4286e+02 -1.1500e+02 -0.0000e+00 1.7143e+02 -1.1408e+02 -0.0000e+00 2.0000e+02 -1.1304e+02 -0.0000e+00 2.2857e+02 -1.1187e+02 -0.0000e+00 2.5714e+02 -1.1054e+02 -0.0000e+00 2.8571e+02 -1.0902e+02 -0.0000e+00 3.1429e+02 -1.0725e+02 -0.0000e+00 3.4286e+02 -1.0520e+02 -0.0000e+00 3.7143e+02 -1.0278e+02 -0.0000e+00 4.0000e+02 -9.9931e+01 -0.0000e+00 4.2857e+02 -9.6536e+01 -0.0000e+00 4.5714e+02 -9.2480e+01 -0.0000e+00 4.8571e+02 -8.7640e+01 -0.0000e+00 5.1429e+02 -8.1917e+01 -0.0000e+00 5.4286e+02 -7.5286e+01 -0.0000e+00 5.7143e+02 -6.7875e+01 -0.0000e+00 6.0000e+02 -6.0000e+01 -0.0000e+00 6.2857e+02 -5.2125e+01 -0.0000e+00 6.5714e+02 -4.4714e+01 -0.0000e+00 6.8571e+02 -3.8083e+01 -0.0000e+00 7.1429e+02 -3.2360e+01 -0.0000e+00 7.4286e+02 -2.7520e+01 -0.0000e+00 7.7143e+02 -2.3464e+01 -0.0000e+00 8.0000e+02 -2.0069e+01 -0.0000e+00 8.2857e+02 -1.7216e+01 -0.0000e+00 8.5714e+02 -1.4804e+01 -0.0000e+00 8.8571e+02 -1.2749e+01 -0.0000e+00 9.1429e+02 -1.0985e+01 -0.0000e+00 9.4286e+02 -9.4576e+00 -0.0000e+00 9.7143e+02 -8.1260e+00 -0.0000e+00 1.0000e+03 -6.9567e+00 -0.0000e+00 1.0286e+03 -5.9229e+00 -0.0000e+00 1.0571e+03 -5.0034e+00 -0.0000e+00 1.0857e+03 -4.1808e+00 -0.0000e+00 1.1143e+03 -3.4412e+00 -0.0000e+00 1.1429e+03 -2.7728e+00 -0.0000e+00 1.1714e+03 -2.1662e+00 -0.0000e+00 1.2000e+03 -1.6133e+00 -0.0000e+00 1.2286e+03 -1.1075e+00 -0.0000e+00 1.2571e+03 -6.4313e-01 -0.0000e+00 1.2857e+03 -2.1535e-01 -0.0000e+00 1.3143e+03 1.7990e-01 -0.0000e+00 1.3429e+03 5.4616e-01 -0.0000e+00 1.3714e+03 8.8644e-01 -0.0000e+00 1.4000e+03 1.2034e+00 -0.0000e+00 1.4286e+03 1.4993e+00 -0.0000e+00 1.4571e+03 1.7761e+00 -0.0000e+00 1.4857e+03 2.0357e+00 -0.0000e+00 1.5143e+03 2.2796e+00 -0.0000e+00 1.5429e+03 2.5091e+00 -0.0000e+00 1.5714e+03 2.7255e+00 -0.0000e+00 1.6000e+03 2.9298e+00 -0.0000e+00 1.6286e+03 3.1230e+00 -0.0000e+00 1.6571e+03 3.3061e+00 -0.0000e+00 1.6857e+03 3.4797e+00 -0.0000e+00 1.7143e+03 3.6446e+00 -0.0000e+00 1.7429e+03 3.8014e+00 -0.0000e+00 1.7714e+03 3.9507e+00 -0.0000e+00 1.8000e+03 4.0931e+00 -0.0000e+00 1.8286e+03 4.2289e+00 -0.0000e+00 1.8571e+03 4.3586e+00 -0.0000e+00 1.8857e+03 4.4827e+00 -0.0000e+00 1.9143e+03 4.6015e+00 -0.0000e+00 1.9429e+03 4.7152e+00 -0.0000e+00 1.9714e+03 4.8243e+00 -0.0000e+00 2.0000e+03 4.9290e+00 -3.0000e+01 -2.0000e+03 4.9299e+00 -3.0000e+01 -1.9714e+03 4.8252e+00 -3.0000e+01 -1.9429e+03 4.7161e+00 -3.0000e+01 -1.9143e+03 4.6024e+00 -3.0000e+01 -1.8857e+03 4.4837e+00 -3.0000e+01 -1.8571e+03 4.3597e+00 -3.0000e+01 -1.8286e+03 4.2300e+00 -3.0000e+01 -1.8000e+03 4.0943e+00 -3.0000e+01 -1.7714e+03 3.9520e+00 -3.0000e+01 -1.7429e+03 3.8028e+00 -3.0000e+01 -1.7143e+03 3.6461e+00 -3.0000e+01 -1.6857e+03 3.4813e+00 -3.0000e+01 -1.6571e+03 3.3078e+00 -3.0000e+01 -1.6286e+03 3.1249e+00 -3.0000e+01 -1.6000e+03 2.9317e+00 -3.0000e+01 -1.5714e+03 2.7276e+00 -3.0000e+01 -1.5429e+03 2.5114e+00 -3.0000e+01 -1.5143e+03 2.2820e+00 -3.0000e+01 -1.4857e+03 2.0384e+00 -3.0000e+01 -1.4571e+03 1.7790e+00 -3.0000e+01 -1.4286e+03 1.5024e+00 -3.0000e+01 -1.4000e+03 1.2068e+00 -3.0000e+01 -1.3714e+03 8.9021e-01 -3.0000e+01 -1.3429e+03 5.5029e-01 -3.0000e+01 -1.3143e+03 1.8446e-01 -3.0000e+01 -1.2857e+03 -2.1032e-01 -3.0000e+01 -1.2571e+03 -6.3755e-01 -3.0000e+01 -1.2286e+03 -1.1013e+00 -3.0000e+01 -1.2000e+03 -1.6064e+00 -3.0000e+01 -1.1714e+03 -2.1584e+00 -3.0000e+01 -1.1429e+03 -2.7641e+00 -3.0000e+01 -1.1143e+03 -3.4312e+00 -3.0000e+01 -1.0857e+03 -4.1695e+00 -3.0000e+01 -1.0571e+03 -4.9904e+00 -3.0000e+01 -1.0286e+03 -5.9080e+00 -3.0000e+01 -1.0000e+03 -6.9394e+00 -3.0000e+01 -9.7143e+02 -8.1059e+00 -3.0000e+01 -9.4286e+02 -9.4338e+00 -3.0000e+01 -9.1429e+02 -1.0956e+01 -3.0000e+01 -8.8571e+02 -1.2715e+01 -3.0000e+01 -8.5714e+02 -1.4763e+01 -3.0000e+01 -8.2857e+02 -1.7166e+01 -3.0000e+01 -8.0000e+02 -2.0008e+01 -3.0000e+01 -7.7143e+02 -2.3388e+01 -3.0000e+01 -7.4286e+02 -2.7426e+01 -3.0000e+01 -7.1429e+02 -3.2244e+01 -3.0000e+01 -6.8571e+02 -3.7942e+01 -3.0000e+01 -6.5714e+02 -4.4545e+01 -3.0000e+01 -6.2857e+02 -5.1932e+01 -3.0000e+01 -6.0000e+02 -5.9791e+01 -3.0000e+01 -5.7143e+02 -6.7662e+01 -3.0000e+01 -5.4286e+02 -7.5081e+01 -3.0000e+01 -5.1429e+02 -8.1727e+01 -3.0000e+01 -4.8571e+02 -8.7469e+01 -3.0000e+01 -4.5714e+02 -9.2327e+01 -3.0000e+01 -4.2857e+02 -9.6400e+01 -3.0000e+01 -4.0000e+02 -9.9809e+01 -3.0000e+01 -3.7143e+02 -1.0267e+02 -3.0000e+01 -3.4286e+02 -1.0509e+02 -3.0000e+01 -3.1429e+02 -1.0716e+02 -3.0000e+01 -2.8571e+02 -1.0892e+02 -3.0000e+01 -2.5714e+02 -1.1046e+02 -3.0000e+01 -2.2857e+02 -1.1179e+02 -3.0000e+01 -2.0000e+02 -1.1296e+02 -3.0000e+01 -1.7143e+02 -1.1399e+02 -3.0000e+01 -1.4286e+02 -1.1490e+02 -3.0000e+01 -1.1429e+02 -1.1571e+02 -3.0000e+01 -8.5714e+01 -1.1643e+02 -3.0000e+01 -5.7143e+01 -1.1706e+02 -3.0000e+01 -2.8571e+01 -1.1757e+02 -3.0000e+01 0.0000e+00 -1.1780e+02 -3.0000e+01 2.8571e+01 -1.1757e+02 -3.0000e+01 5.7143e+01 -1.1706e+02 -3.0000e+01 8.5714e+01 -1.1643e+02 -3.0000e+01 1.1429e+02 -1.1571e+02 -3.0000e+01 1.4286e+02 -1.1490e+02 -3.0000e+01 1.7143e+02 -1.1399e+02 -3.0000e+01 2.0000e+02 -1.1296e+02 -3.0000e+01 2.2857e+02 -1.1179e+02 -3.0000e+01 2.5714e+02 -1.1046e+02 -3.0000e+01 2.8571e+02 -1.0892e+02 -3.0000e+01 3.1429e+02 -1.0716e+02 -3.0000e+01 3.4286e+02 -1.0509e+02 -3.0000e+01 3.7143e+02 -1.0267e+02 -3.0000e+01 4.0000e+02 -9.9809e+01 -3.0000e+01 4.2857e+02 -9.6400e+01 -3.0000e+01 4.5714e+02 -9.2327e+01 -3.0000e+01 4.8571e+02 -8.7469e+01 -3.0000e+01 5.1429e+02 -8.1727e+01 -3.0000e+01 5.4286e+02 -7.5081e+01 -3.0000e+01 5.7143e+02 -6.7662e+01 -3.0000e+01 6.0000e+02 -5.9791e+01 -3.0000e+01 6.2857e+02 -5.1932e+01 -3.0000e+01 6.5714e+02 -4.4545e+01 -3.0000e+01 6.8571e+02 -3.7942e+01 -3.0000e+01 7.1429e+02 -3.2244e+01 -3.0000e+01 7.4286e+02 -2.7426e+01 -3.0000e+01 7.7143e+02 -2.3388e+01 -3.0000e+01 8.0000e+02 -2.0008e+01 -3.0000e+01 8.2857e+02 -1.7166e+01 -3.0000e+01 8.5714e+02 -1.4763e+01 -3.0000e+01 8.8571e+02 -1.2715e+01 -3.0000e+01 9.1429e+02 -1.0956e+01 -3.0000e+01 9.4286e+02 -9.4338e+00 -3.0000e+01 9.7143e+02 -8.1059e+00 -3.0000e+01 1.0000e+03 -6.9394e+00 -3.0000e+01 1.0286e+03 -5.9080e+00 -3.0000e+01 1.0571e+03 -4.9904e+00 -3.0000e+01 1.0857e+03 -4.1695e+00 -3.0000e+01 1.1143e+03 -3.4312e+00 -3.0000e+01 1.1429e+03 -2.7641e+00 -3.0000e+01 1.1714e+03 -2.1584e+00 -3.0000e+01 1.2000e+03 -1.6064e+00 -3.0000e+01 1.2286e+03 -1.1013e+00 -3.0000e+01 1.2571e+03 -6.3755e-01 -3.0000e+01 1.2857e+03 -2.1032e-01 -3.0000e+01 1.3143e+03 1.8446e-01 -3.0000e+01 1.3429e+03 5.5029e-01 -3.0000e+01 1.3714e+03 8.9021e-01 -3.0000e+01 1.4000e+03 1.2068e+00 -3.0000e+01 1.4286e+03 1.5024e+00 -3.0000e+01 1.4571e+03 1.7790e+00 -3.0000e+01 1.4857e+03 2.0384e+00 -3.0000e+01 1.5143e+03 2.2820e+00 -3.0000e+01 1.5429e+03 2.5114e+00 -3.0000e+01 1.5714e+03 2.7276e+00 -3.0000e+01 1.6000e+03 2.9317e+00 -3.0000e+01 1.6286e+03 3.1249e+00 -3.0000e+01 1.6571e+03 3.3078e+00 -3.0000e+01 1.6857e+03 3.4813e+00 -3.0000e+01 1.7143e+03 3.6461e+00 -3.0000e+01 1.7429e+03 3.8028e+00 -3.0000e+01 1.7714e+03 3.9520e+00 -3.0000e+01 1.8000e+03 4.0943e+00 -3.0000e+01 1.8286e+03 4.2300e+00 -3.0000e+01 1.8571e+03 4.3597e+00 -3.0000e+01 1.8857e+03 4.4837e+00 -3.0000e+01 1.9143e+03 4.6024e+00 -3.0000e+01 1.9429e+03 4.7161e+00 -3.0000e+01 1.9714e+03 4.8252e+00 -3.0000e+01 2.0000e+03 4.9299e+00 -6.0000e+01 -2.0000e+03 4.9323e+00 -6.0000e+01 -1.9714e+03 4.8277e+00 -6.0000e+01 -1.9429e+03 4.7188e+00 -6.0000e+01 -1.9143e+03 4.6053e+00 -6.0000e+01 -1.8857e+03 4.4867e+00 -6.0000e+01 -1.8571e+03 4.3629e+00 -6.0000e+01 -1.8286e+03 4.2334e+00 -6.0000e+01 -1.8000e+03 4.0979e+00 -6.0000e+01 -1.7714e+03 3.9559e+00 -6.0000e+01 -1.7429e+03 3.8069e+00 -6.0000e+01 -1.7143e+03 3.6505e+00 -6.0000e+01 -1.6857e+03 3.4860e+00 -6.0000e+01 -1.6571e+03 3.3128e+00 -6.0000e+01 -1.6286e+03 3.1303e+00 -6.0000e+01 -1.6000e+03 2.9376e+00 -6.0000e+01 -1.5714e+03 2.7339e+00 -6.0000e+01 -1.5429e+03 2.5182e+00 -6.0000e+01 -1.5143e+03 2.2894e+00 -6.0000e+01 -1.4857e+03 2.0464e+00 -6.0000e+01 -1.4571e+03 1.7877e+00 -6.0000e+01 -1.4286e+03 1.5119e+00 -6.0000e+01 -1.4000e+03 1.2171e+00 -6.0000e+01 -1.3714e+03 9.0148e-01 -6.0000e+01 -1.3429e+03 5.6267e-01 -6.0000e+01 -1.3143e+03 1.9809e-01 -6.0000e+01 -1.2857e+03 -1.9527e-01 -6.0000e+01 -1.2571e+03 -6.2087e-01 -6.0000e+01 -1.2286e+03 -1.0828e+00 -6.0000e+01 -1.2000e+03 -1.5857e+00 -6.0000e+01 -1.1714e+03 -2.1352e+00 -6.0000e+01 -1.1429e+03 -2.7379e+00 -6.0000e+01 -1.1143e+03 -3.4016e+00 -6.0000e+01 -1.0857e+03 -4.1358e+00 -6.0000e+01 -1.0571e+03 -4.9518e+00 -6.0000e+01 -1.0286e+03 -5.8635e+00 -6.0000e+01 -1.0000e+03 -6.8878e+00 -6.0000e+01 -9.7143e+02 -8.0457e+00 -6.0000e+01 -9.4286e+02 -9.3630e+00 -6.0000e+01 -9.1429e+02 -1.0872e+01 -6.0000e+01 -8.8571e+02 -1.2615e+01 -6.0000e+01 -8.5714e+02 -1.4642e+01 -6.0000e+01 -8.2857e+02 -1.7019e+01 -6.0000e+01 -8.0000e+02 -1.9826e+01 -6.0000e+01 -7.7143e+02 -2.3164e+01 -6.0000e+01 -7.4286e+02 -2.7148e+01 -6.0000e+01 -7.1429e+02 -3.1899e+01 -6.0000e+01 -6.8571e+02 -3.7520e+01 -6.0000e+01 -6.5714e+02 -4.4042e+01 -6.0000e+01 -6.2857e+02 -5.1357e+01 -6.0000e+01 -6.0000e+02 -5.9167e+01 -6.0000e+01 -5.7143e+02 -6.7024e+01 -6.0000e+01 -5.4286e+02 -7.4464e+01 -6.0000e+01 -5.1429e+02 -8.1155e+01 -6.0000e+01 -4.8571e+02 -8.6952e+01 -6.0000e+01 -4.5714e+02 -9.1865e+01 -6.0000e+01 -4.2857e+02 -9.5987e+01 -6.0000e+01 -4.0000e+02 -9.9438e+01 -6.0000e+01 -3.7143e+02 -1.0234e+02 -6.0000e+01 -3.4286e+02 -1.0479e+02 -6.0000e+01 -3.1429e+02 -1.0687e+02 -6.0000e+01 -2.8571e+02 -1.0865e+02 -6.0000e+01 -2.5714e+02 -1.1019e+02 -6.0000e+01 -2.2857e+02 -1.1153e+02 -6.0000e+01 -2.0000e+02 -1.1270e+02 -6.0000e+01 -1.7143e+02 -1.1372e+02 -6.0000e+01 -1.4286e+02 -1.1462e+02 -6.0000e+01 -1.1429e+02 -1.1540e+02 -6.0000e+01 -8.5714e+01 -1.1608e+02 -6.0000e+01 -5.7143e+01 -1.1663e+02 -6.0000e+01 -2.8571e+01 -1.1702e+02 -6.0000e+01 0.0000e+00 -1.1716e+02 -6.0000e+01 2.8571e+01 -1.1702e+02 -6.0000e+01 5.7143e+01 -1.1663e+02 -6.0000e+01 8.5714e+01 -1.1608e+02 -6.0000e+01 1.1429e+02 -1.1540e+02 -6.0000e+01 1.4286e+02 -1.1462e+02 -6.0000e+01 1.7143e+02 -1.1372e+02 -6.0000e+01 2.0000e+02 -1.1270e+02 -6.0000e+01 2.2857e+02 -1.1153e+02 -6.0000e+01 2.5714e+02 -1.1019e+02 -6.0000e+01 2.8571e+02 -1.0865e+02 -6.0000e+01 3.1429e+02 -1.0687e+02 -6.0000e+01 3.4286e+02 -1.0479e+02 -6.0000e+01 3.7143e+02 -1.0234e+02 -6.0000e+01 4.0000e+02 -9.9438e+01 -6.0000e+01 4.2857e+02 -9.5987e+01 -6.0000e+01 4.5714e+02 -9.1865e+01 -6.0000e+01 4.8571e+02 -8.6952e+01 -6.0000e+01 5.1429e+02 -8.1155e+01 -6.0000e+01 5.4286e+02 -7.4464e+01 -6.0000e+01 5.7143e+02 -6.7024e+01 -6.0000e+01 6.0000e+02 -5.9167e+01 -6.0000e+01 6.2857e+02 -5.1357e+01 -6.0000e+01 6.5714e+02 -4.4042e+01 -6.0000e+01 6.8571e+02 -3.7520e+01 -6.0000e+01 7.1429e+02 -3.1899e+01 -6.0000e+01 7.4286e+02 -2.7148e+01 -6.0000e+01 7.7143e+02 -2.3164e+01 -6.0000e+01 8.0000e+02 -1.9826e+01 -6.0000e+01 8.2857e+02 -1.7019e+01 -6.0000e+01 8.5714e+02 -1.4642e+01 -6.0000e+01 8.8571e+02 -1.2615e+01 -6.0000e+01 9.1429e+02 -1.0872e+01 -6.0000e+01 9.4286e+02 -9.3630e+00 -6.0000e+01 9.7143e+02 -8.0457e+00 -6.0000e+01 1.0000e+03 -6.8878e+00 -6.0000e+01 1.0286e+03 -5.8635e+00 -6.0000e+01 1.0571e+03 -4.9518e+00 -6.0000e+01 1.0857e+03 -4.1358e+00 -6.0000e+01 1.1143e+03 -3.4016e+00 -6.0000e+01 1.1429e+03 -2.7379e+00 -6.0000e+01 1.1714e+03 -2.1352e+00 -6.0000e+01 1.2000e+03 -1.5857e+00 -6.0000e+01 1.2286e+03 -1.0828e+00 -6.0000e+01 1.2571e+03 -6.2087e-01 -6.0000e+01 1.2857e+03 -1.9527e-01 -6.0000e+01 1.3143e+03 1.9809e-01 -6.0000e+01 1.3429e+03 5.6267e-01 -6.0000e+01 1.3714e+03 9.0148e-01 -6.0000e+01 1.4000e+03 1.2171e+00 -6.0000e+01 1.4286e+03 1.5119e+00 -6.0000e+01 1.4571e+03 1.7877e+00 -6.0000e+01 1.4857e+03 2.0464e+00 -6.0000e+01 1.5143e+03 2.2894e+00 -6.0000e+01 1.5429e+03 2.5182e+00 -6.0000e+01 1.5714e+03 2.7339e+00 -6.0000e+01 1.6000e+03 2.9376e+00 -6.0000e+01 1.6286e+03 3.1303e+00 -6.0000e+01 1.6571e+03 3.3128e+00 -6.0000e+01 1.6857e+03 3.4860e+00 -6.0000e+01 1.7143e+03 3.6505e+00 -6.0000e+01 1.7429e+03 3.8069e+00 -6.0000e+01 1.7714e+03 3.9559e+00 -6.0000e+01 1.8000e+03 4.0979e+00 -6.0000e+01 1.8286e+03 4.2334e+00 -6.0000e+01 1.8571e+03 4.3629e+00 -6.0000e+01 1.8857e+03 4.4867e+00 -6.0000e+01 1.9143e+03 4.6053e+00 -6.0000e+01 1.9429e+03 4.7188e+00 -6.0000e+01 1.9714e+03 4.8277e+00 -6.0000e+01 2.0000e+03 4.9323e+00 -9.0000e+01 -2.0000e+03 4.9363e+00 -9.0000e+01 -1.9714e+03 4.8320e+00 -9.0000e+01 -1.9429e+03 4.7233e+00 -9.0000e+01 -1.9143e+03 4.6100e+00 -9.0000e+01 -1.8857e+03 4.4918e+00 -9.0000e+01 -1.8571e+03 4.3683e+00 -9.0000e+01 -1.8286e+03 4.2391e+00 -9.0000e+01 -1.8000e+03 4.1040e+00 -9.0000e+01 -1.7714e+03 3.9624e+00 -9.0000e+01 -1.7429e+03 3.8138e+00 -9.0000e+01 -1.7143e+03 3.6579e+00 -9.0000e+01 -1.6857e+03 3.4939e+00 -9.0000e+01 -1.6571e+03 3.3213e+00 -9.0000e+01 -1.6286e+03 3.1393e+00 -9.0000e+01 -1.6000e+03 2.9473e+00 -9.0000e+01 -1.5714e+03 2.7444e+00 -9.0000e+01 -1.5429e+03 2.5295e+00 -9.0000e+01 -1.5143e+03 2.3016e+00 -9.0000e+01 -1.4857e+03 2.0596e+00 -9.0000e+01 -1.4571e+03 1.8021e+00 -9.0000e+01 -1.4286e+03 1.5276e+00 -9.0000e+01 -1.4000e+03 1.2342e+00 -9.0000e+01 -1.3714e+03 9.2020e-01 -9.0000e+01 -1.3429e+03 5.8321e-01 -9.0000e+01 -1.3143e+03 2.2070e-01 -9.0000e+01 -1.2857e+03 -1.7030e-01 -9.0000e+01 -1.2571e+03 -5.9321e-01 -9.0000e+01 -1.2286e+03 -1.0520e+00 -9.0000e+01 -1.2000e+03 -1.5513e+00 -9.0000e+01 -1.1714e+03 -2.0967e+00 -9.0000e+01 -1.1429e+03 -2.6945e+00 -9.0000e+01 -1.1143e+03 -3.3525e+00 -9.0000e+01 -1.0857e+03 -4.0800e+00 -9.0000e+01 -1.0571e+03 -4.8880e+00 -9.0000e+01 -1.0286e+03 -5.7901e+00 -9.0000e+01 -1.0000e+03 -6.8027e+00 -9.0000e+01 -9.7143e+02 -7.9464e+00 -9.0000e+01 -9.4286e+02 -9.2463e+00 -9.0000e+01 -9.1429e+02 -1.0734e+01 -9.0000e+01 -8.8571e+02 -1.2449e+01 -9.0000e+01 -8.5714e+02 -1.4442e+01 -9.0000e+01 -8.2857e+02 -1.6776e+01 -9.0000e+01 -8.0000e+02 -1.9529e+01 -9.0000e+01 -7.7143e+02 -2.2796e+01 -9.0000e+01 -7.4286e+02 -2.6692e+01 -9.0000e+01 -7.1429e+02 -3.1335e+01 -9.0000e+01 -6.8571e+02 -3.6830e+01 -9.0000e+01 -6.5714e+02 -4.3217e+01 -9.0000e+01 -6.2857e+02 -5.0408e+01 -9.0000e+01 -6.0000e+02 -5.8132e+01 -9.0000e+01 -5.7143e+02 -6.5960e+01 -9.0000e+01 -5.4286e+02 -7.3430e+01 -9.0000e+01 -5.1429e+02 -8.0191e+01 -9.0000e+01 -4.8571e+02 -8.6078e+01 -9.0000e+01 -4.5714e+02 -9.1083e+01 -9.0000e+01 -4.2857e+02 -9.5288e+01 -9.0000e+01 -4.0000e+02 -9.8810e+01 -9.0000e+01 -3.7143e+02 -1.0177e+02 -9.0000e+01 -3.4286e+02 -1.0426e+02 -9.0000e+01 -3.1429e+02 -1.0638e+02 -9.0000e+01 -2.8571e+02 -1.0819e+02 -9.0000e+01 -2.5714e+02 -1.0975e+02 -9.0000e+01 -2.2857e+02 -1.1110e+02 -9.0000e+01 -2.0000e+02 -1.1227e+02 -9.0000e+01 -1.7143e+02 -1.1329e+02 -9.0000e+01 -1.4286e+02 -1.1416e+02 -9.0000e+01 -1.1429e+02 -1.1492e+02 -9.0000e+01 -8.5714e+01 -1.1554e+02 -9.0000e+01 -5.7143e+01 -1.1603e+02 -9.0000e+01 -2.8571e+01 -1.1634e+02 -9.0000e+01 0.0000e+00 -1.1645e+02 -9.0000e+01 2.8571e+01 -1.1634e+02 -9.0000e+01 5.7143e+01 -1.1603e+02 -9.0000e+01 8.5714e+01 -1.1554e+02 -9.0000e+01 1.1429e+02 -1.1492e+02 -9.0000e+01 1.4286e+02 -1.1416e+02 -9.0000e+01 1.7143e+02 -1.1329e+02 -9.0000e+01 2.0000e+02 -1.1227e+02 -9.0000e+01 2.2857e+02 -1.1110e+02 -9.0000e+01 2.5714e+02 -1.0975e+02 -9.0000e+01 2.8571e+02 -1.0819e+02 -9.0000e+01 3.1429e+02 -1.0638e+02 -9.0000e+01 3.4286e+02 -1.0426e+02 -9.0000e+01 3.7143e+02 -1.0177e+02 -9.0000e+01 4.0000e+02 -9.8810e+01 -9.0000e+01 4.2857e+02 -9.5288e+01 -9.0000e+01 4.5714e+02 -9.1083e+01 -9.0000e+01 4.8571e+02 -8.6078e+01 -9.0000e+01 5.1429e+02 -8.0191e+01 -9.0000e+01 5.4286e+02 -7.3430e+01 -9.0000e+01 5.7143e+02 -6.5960e+01 -9.0000e+01 6.0000e+02 -5.8132e+01 -9.0000e+01 6.2857e+02 -5.0408e+01 -9.0000e+01 6.5714e+02 -4.3217e+01 -9.0000e+01 6.8571e+02 -3.6830e+01 -9.0000e+01 7.1429e+02 -3.1335e+01 -9.0000e+01 7.4286e+02 -2.6692e+01 -9.0000e+01 7.7143e+02 -2.2796e+01 -9.0000e+01 8.0000e+02 -1.9529e+01 -9.0000e+01 8.2857e+02 -1.6776e+01 -9.0000e+01 8.5714e+02 -1.4442e+01 -9.0000e+01 8.8571e+02 -1.2449e+01 -9.0000e+01 9.1429e+02 -1.0734e+01 -9.0000e+01 9.4286e+02 -9.2463e+00 -9.0000e+01 9.7143e+02 -7.9464e+00 -9.0000e+01 1.0000e+03 -6.8027e+00 -9.0000e+01 1.0286e+03 -5.7901e+00 -9.0000e+01 1.0571e+03 -4.8880e+00 -9.0000e+01 1.0857e+03 -4.0800e+00 -9.0000e+01 1.1143e+03 -3.3525e+00 -9.0000e+01 1.1429e+03 -2.6945e+00 -9.0000e+01 1.1714e+03 -2.0967e+00 -9.0000e+01 1.2000e+03 -1.5513e+00 -9.0000e+01 1.2286e+03 -1.0520e+00 -9.0000e+01 1.2571e+03 -5.9321e-01 -9.0000e+01 1.2857e+03 -1.7030e-01 -9.0000e+01 1.3143e+03 2.2070e-01 -9.0000e+01 1.3429e+03 5.8321e-01 -9.0000e+01 1.3714e+03 9.2020e-01 -9.0000e+01 1.4000e+03 1.2342e+00 -9.0000e+01 1.4286e+03 1.5276e+00 -9.0000e+01 1.4571e+03 1.8021e+00 -9.0000e+01 1.4857e+03 2.0596e+00 -9.0000e+01 1.5143e+03 2.3016e+00 -9.0000e+01 1.5429e+03 2.5295e+00 -9.0000e+01 1.5714e+03 2.7444e+00 -9.0000e+01 1.6000e+03 2.9473e+00 -9.0000e+01 1.6286e+03 3.1393e+00 -9.0000e+01 1.6571e+03 3.3213e+00 -9.0000e+01 1.6857e+03 3.4939e+00 -9.0000e+01 1.7143e+03 3.6579e+00 -9.0000e+01 1.7429e+03 3.8138e+00 -9.0000e+01 1.7714e+03 3.9624e+00 -9.0000e+01 1.8000e+03 4.1040e+00 -9.0000e+01 1.8286e+03 4.2391e+00 -9.0000e+01 1.8571e+03 4.3683e+00 -9.0000e+01 1.8857e+03 4.4918e+00 -9.0000e+01 1.9143e+03 4.6100e+00 -9.0000e+01 1.9429e+03 4.7233e+00 -9.0000e+01 1.9714e+03 4.8320e+00 -9.0000e+01 2.0000e+03 4.9363e+00 -1.2000e+02 -2.0000e+03 4.9419e+00 -1.2000e+02 -1.9714e+03 4.8379e+00 -1.2000e+02 -1.9429e+03 4.7296e+00 -1.2000e+02 -1.9143e+03 4.6167e+00 -1.2000e+02 -1.8857e+03 4.4989e+00 -1.2000e+02 -1.8571e+03 4.3758e+00 -1.2000e+02 -1.8286e+03 4.2471e+00 -1.2000e+02 -1.8000e+03 4.1124e+00 -1.2000e+02 -1.7714e+03 3.9714e+00 -1.2000e+02 -1.7429e+03 3.8234e+00 -1.2000e+02 -1.7143e+03 3.6681e+00 -1.2000e+02 -1.6857e+03 3.5049e+00 -1.2000e+02 -1.6571e+03 3.3330e+00 -1.2000e+02 -1.6286e+03 3.1520e+00 -1.2000e+02 -1.6000e+03 2.9609e+00 -1.2000e+02 -1.5714e+03 2.7590e+00 -1.2000e+02 -1.5429e+03 2.5452e+00 -1.2000e+02 -1.5143e+03 2.3187e+00 -1.2000e+02 -1.4857e+03 2.0781e+00 -1.2000e+02 -1.4571e+03 1.8222e+00 -1.2000e+02 -1.4286e+03 1.5494e+00 -1.2000e+02 -1.4000e+03 1.2580e+00 -1.2000e+02 -1.3714e+03 9.4624e-01 -1.2000e+02 -1.3429e+03 6.1178e-01 -1.2000e+02 -1.3143e+03 2.5213e-01 -1.2000e+02 -1.2857e+03 -1.3561e-01 -1.2000e+02 -1.2571e+03 -5.5478e-01 -1.2000e+02 -1.2286e+03 -1.0093e+00 -1.2000e+02 -1.2000e+03 -1.5037e+00 -1.2000e+02 -1.1714e+03 -2.0433e+00 -1.2000e+02 -1.1429e+03 -2.6344e+00 -1.2000e+02 -1.1143e+03 -3.2846e+00 -1.2000e+02 -1.0857e+03 -4.0028e+00 -1.2000e+02 -1.0571e+03 -4.7997e+00 -1.2000e+02 -1.0286e+03 -5.6885e+00 -1.2000e+02 -1.0000e+03 -6.6852e+00 -1.2000e+02 -9.7143e+02 -7.8095e+00 -1.2000e+02 -9.4286e+02 -9.0855e+00 -1.2000e+02 -9.1429e+02 -1.0544e+01 -1.2000e+02 -8.8571e+02 -1.2222e+01 -1.2000e+02 -8.5714e+02 -1.4169e+01 -1.2000e+02 -8.2857e+02 -1.6444e+01 -1.2000e+02 -8.0000e+02 -1.9122e+01 -1.2000e+02 -7.7143e+02 -2.2295e+01 -1.2000e+02 -7.4286e+02 -2.6071e+01 -1.2000e+02 -7.1429e+02 -3.0568e+01 -1.2000e+02 -6.8571e+02 -3.5889e+01 -1.2000e+02 -6.5714e+02 -4.2089e+01 -1.2000e+02 -6.2857e+02 -4.9103e+01 -1.2000e+02 -6.0000e+02 -5.6697e+01 -1.2000e+02 -5.7143e+02 -6.4471e+01 -1.2000e+02 -5.4286e+02 -7.1969e+01 -1.2000e+02 -5.1429e+02 -7.8821e+01 -1.2000e+02 -4.8571e+02 -8.4829e+01 -1.2000e+02 -4.5714e+02 -8.9961e+01 -1.2000e+02 -4.2857e+02 -9.4285e+01 -1.2000e+02 -4.0000e+02 -9.7910e+01 -1.2000e+02 -3.7143e+02 -1.0095e+02 -1.2000e+02 -3.4286e+02 -1.0352e+02 -1.2000e+02 -3.1429e+02 -1.0569e+02 -1.2000e+02 -2.8571e+02 -1.0754e+02 -1.2000e+02 -2.5714e+02 -1.0913e+02 -1.2000e+02 -2.2857e+02 -1.1049e+02 -1.2000e+02 -2.0000e+02 -1.1167e+02 -1.2000e+02 -1.7143e+02 -1.1268e+02 -1.2000e+02 -1.4286e+02 -1.1354e+02 -1.2000e+02 -1.1429e+02 -1.1427e+02 -1.2000e+02 -8.5714e+01 -1.1486e+02 -1.2000e+02 -5.7143e+01 -1.1529e+02 -1.2000e+02 -2.8571e+01 -1.1557e+02 -1.2000e+02 0.0000e+00 -1.1566e+02 -1.2000e+02 2.8571e+01 -1.1557e+02 -1.2000e+02 5.7143e+01 -1.1529e+02 -1.2000e+02 8.5714e+01 -1.1486e+02 -1.2000e+02 1.1429e+02 -1.1427e+02 -1.2000e+02 1.4286e+02 -1.1354e+02 -1.2000e+02 1.7143e+02 -1.1268e+02 -1.2000e+02 2.0000e+02 -1.1167e+02 -1.2000e+02 2.2857e+02 -1.1049e+02 -1.2000e+02 2.5714e+02 -1.0913e+02 -1.2000e+02 2.8571e+02 -1.0754e+02 -1.2000e+02 3.1429e+02 -1.0569e+02 -1.2000e+02 3.4286e+02 -1.0352e+02 -1.2000e+02 3.7143e+02 -1.0095e+02 -1.2000e+02 4.0000e+02 -9.7910e+01 -1.2000e+02 4.2857e+02 -9.4285e+01 -1.2000e+02 4.5714e+02 -8.9961e+01 -1.2000e+02 4.8571e+02 -8.4829e+01 -1.2000e+02 5.1429e+02 -7.8821e+01 -1.2000e+02 5.4286e+02 -7.1969e+01 -1.2000e+02 5.7143e+02 -6.4471e+01 -1.2000e+02 6.0000e+02 -5.6697e+01 -1.2000e+02 6.2857e+02 -4.9103e+01 -1.2000e+02 6.5714e+02 -4.2089e+01 -1.2000e+02 6.8571e+02 -3.5889e+01 -1.2000e+02 7.1429e+02 -3.0568e+01 -1.2000e+02 7.4286e+02 -2.6071e+01 -1.2000e+02 7.7143e+02 -2.2295e+01 -1.2000e+02 8.0000e+02 -1.9122e+01 -1.2000e+02 8.2857e+02 -1.6444e+01 -1.2000e+02 8.5714e+02 -1.4169e+01 -1.2000e+02 8.8571e+02 -1.2222e+01 -1.2000e+02 9.1429e+02 -1.0544e+01 -1.2000e+02 9.4286e+02 -9.0855e+00 -1.2000e+02 9.7143e+02 -7.8095e+00 -1.2000e+02 1.0000e+03 -6.6852e+00 -1.2000e+02 1.0286e+03 -5.6885e+00 -1.2000e+02 1.0571e+03 -4.7997e+00 -1.2000e+02 1.0857e+03 -4.0028e+00 -1.2000e+02 1.1143e+03 -3.2846e+00 -1.2000e+02 1.1429e+03 -2.6344e+00 -1.2000e+02 1.1714e+03 -2.0433e+00 -1.2000e+02 1.2000e+03 -1.5037e+00 -1.2000e+02 1.2286e+03 -1.0093e+00 -1.2000e+02 1.2571e+03 -5.5478e-01 -1.2000e+02 1.2857e+03 -1.3561e-01 -1.2000e+02 1.3143e+03 2.5213e-01 -1.2000e+02 1.3429e+03 6.1178e-01 -1.2000e+02 1.3714e+03 9.4624e-01 -1.2000e+02 1.4000e+03 1.2580e+00 -1.2000e+02 1.4286e+03 1.5494e+00 -1.2000e+02 1.4571e+03 1.8222e+00 -1.2000e+02 1.4857e+03 2.0781e+00 -1.2000e+02 1.5143e+03 2.3187e+00 -1.2000e+02 1.5429e+03 2.5452e+00 -1.2000e+02 1.5714e+03 2.7590e+00 -1.2000e+02 1.6000e+03 2.9609e+00 -1.2000e+02 1.6286e+03 3.1520e+00 -1.2000e+02 1.6571e+03 3.3330e+00 -1.2000e+02 1.6857e+03 3.5049e+00 -1.2000e+02 1.7143e+03 3.6681e+00 -1.2000e+02 1.7429e+03 3.8234e+00 -1.2000e+02 1.7714e+03 3.9714e+00 -1.2000e+02 1.8000e+03 4.1124e+00 -1.2000e+02 1.8286e+03 4.2471e+00 -1.2000e+02 1.8571e+03 4.3758e+00 -1.2000e+02 1.8857e+03 4.4989e+00 -1.2000e+02 1.9143e+03 4.6167e+00 -1.2000e+02 1.9429e+03 4.7296e+00 -1.2000e+02 1.9714e+03 4.8379e+00 -1.2000e+02 2.0000e+03 4.9419e+00 -1.5000e+02 -2.0000e+03 4.9491e+00 -1.5000e+02 -1.9714e+03 4.8456e+00 -1.5000e+02 -1.9429e+03 4.7377e+00 -1.5000e+02 -1.9143e+03 4.6252e+00 -1.5000e+02 -1.8857e+03 4.5079e+00 -1.5000e+02 -1.8571e+03 4.3854e+00 -1.5000e+02 -1.8286e+03 4.2573e+00 -1.5000e+02 -1.8000e+03 4.1233e+00 -1.5000e+02 -1.7714e+03 3.9829e+00 -1.5000e+02 -1.7429e+03 3.8357e+00 -1.5000e+02 -1.7143e+03 3.6812e+00 -1.5000e+02 -1.6857e+03 3.5189e+00 -1.5000e+02 -1.6571e+03 3.3481e+00 -1.5000e+02 -1.6286e+03 3.1681e+00 -1.5000e+02 -1.6000e+03 2.9782e+00 -1.5000e+02 -1.5714e+03 2.7776e+00 -1.5000e+02 -1.5429e+03 2.5654e+00 -1.5000e+02 -1.5143e+03 2.3404e+00 -1.5000e+02 -1.4857e+03 2.1017e+00 -1.5000e+02 -1.4571e+03 1.8477e+00 -1.5000e+02 -1.4286e+03 1.5772e+00 -1.5000e+02 -1.4000e+03 1.2884e+00 -1.5000e+02 -1.3714e+03 9.7945e-01 -1.5000e+02 -1.3429e+03 6.4819e-01 -1.5000e+02 -1.3143e+03 2.9217e-01 -1.5000e+02 -1.2857e+03 -9.1437e-02 -1.5000e+02 -1.2571e+03 -5.0589e-01 -1.5000e+02 -1.2286e+03 -9.5498e-01 -1.5000e+02 -1.2000e+03 -1.4431e+00 -1.5000e+02 -1.1714e+03 -1.9755e+00 -1.5000e+02 -1.1429e+03 -2.5582e+00 -1.5000e+02 -1.1143e+03 -3.1985e+00 -1.5000e+02 -1.0857e+03 -3.9049e+00 -1.5000e+02 -1.0571e+03 -4.6880e+00 -1.5000e+02 -1.0286e+03 -5.5603e+00 -1.5000e+02 -1.0000e+03 -6.5370e+00 -1.5000e+02 -9.7143e+02 -7.6370e+00 -1.5000e+02 -9.4286e+02 -8.8833e+00 -1.5000e+02 -9.1429e+02 -1.0305e+01 -1.5000e+02 -8.8571e+02 -1.1938e+01 -1.5000e+02 -8.5714e+02 -1.3827e+01 -1.5000e+02 -8.2857e+02 -1.6030e+01 -1.5000e+02 -8.0000e+02 -1.8616e+01 -1.5000e+02 -7.7143e+02 -2.1672e+01 -1.5000e+02 -7.4286e+02 -2.5301e+01 -1.5000e+02 -7.1429e+02 -2.9616e+01 -1.5000e+02 -6.8571e+02 -3.4723e+01 -1.5000e+02 -6.5714e+02 -4.0685e+01 -1.5000e+02 -6.2857e+02 -4.7468e+01 -1.5000e+02 -6.0000e+02 -5.4880e+01 -1.5000e+02 -5.7143e+02 -6.2563e+01 -1.5000e+02 -5.4286e+02 -7.0074e+01 -1.5000e+02 -5.1429e+02 -7.7025e+01 -1.5000e+02 -4.8571e+02 -8.3182e+01 -1.5000e+02 -4.5714e+02 -8.8476e+01 -1.5000e+02 -4.2857e+02 -9.2953e+01 -1.5000e+02 -4.0000e+02 -9.6713e+01 -1.5000e+02 -3.7143e+02 -9.9869e+01 -1.5000e+02 -3.4286e+02 -1.0252e+02 -1.5000e+02 -3.1429e+02 -1.0477e+02 -1.5000e+02 -2.8571e+02 -1.0668e+02 -1.5000e+02 -2.5714e+02 -1.0831e+02 -1.5000e+02 -2.2857e+02 -1.0970e+02 -1.5000e+02 -2.0000e+02 -1.1089e+02 -1.5000e+02 -1.7143e+02 -1.1191e+02 -1.5000e+02 -1.4286e+02 -1.1276e+02 -1.5000e+02 -1.1429e+02 -1.1347e+02 -1.5000e+02 -8.5714e+01 -1.1403e+02 -1.5000e+02 -5.7143e+01 -1.1444e+02 -1.5000e+02 -2.8571e+01 -1.1469e+02 -1.5000e+02 0.0000e+00 -1.1478e+02 -1.5000e+02 2.8571e+01 -1.1469e+02 -1.5000e+02 5.7143e+01 -1.1444e+02 -1.5000e+02 8.5714e+01 -1.1403e+02 -1.5000e+02 1.1429e+02 -1.1347e+02 -1.5000e+02 1.4286e+02 -1.1276e+02 -1.5000e+02 1.7143e+02 -1.1191e+02 -1.5000e+02 2.0000e+02 -1.1089e+02 -1.5000e+02 2.2857e+02 -1.0970e+02 -1.5000e+02 2.5714e+02 -1.0831e+02 -1.5000e+02 2.8571e+02 -1.0668e+02 -1.5000e+02 3.1429e+02 -1.0477e+02 -1.5000e+02 3.4286e+02 -1.0252e+02 -1.5000e+02 3.7143e+02 -9.9869e+01 -1.5000e+02 4.0000e+02 -9.6713e+01 -1.5000e+02 4.2857e+02 -9.2953e+01 -1.5000e+02 4.5714e+02 -8.8476e+01 -1.5000e+02 4.8571e+02 -8.3182e+01 -1.5000e+02 5.1429e+02 -7.7025e+01 -1.5000e+02 5.4286e+02 -7.0074e+01 -1.5000e+02 5.7143e+02 -6.2563e+01 -1.5000e+02 6.0000e+02 -5.4880e+01 -1.5000e+02 6.2857e+02 -4.7468e+01 -1.5000e+02 6.5714e+02 -4.0685e+01 -1.5000e+02 6.8571e+02 -3.4723e+01 -1.5000e+02 7.1429e+02 -2.9616e+01 -1.5000e+02 7.4286e+02 -2.5301e+01 -1.5000e+02 7.7143e+02 -2.1672e+01 -1.5000e+02 8.0000e+02 -1.8616e+01 -1.5000e+02 8.2857e+02 -1.6030e+01 -1.5000e+02 8.5714e+02 -1.3827e+01 -1.5000e+02 8.8571e+02 -1.1938e+01 -1.5000e+02 9.1429e+02 -1.0305e+01 -1.5000e+02 9.4286e+02 -8.8833e+00 -1.5000e+02 9.7143e+02 -7.6370e+00 -1.5000e+02 1.0000e+03 -6.5370e+00 -1.5000e+02 1.0286e+03 -5.5603e+00 -1.5000e+02 1.0571e+03 -4.6880e+00 -1.5000e+02 1.0857e+03 -3.9049e+00 -1.5000e+02 1.1143e+03 -3.1985e+00 -1.5000e+02 1.1429e+03 -2.5582e+00 -1.5000e+02 1.1714e+03 -1.9755e+00 -1.5000e+02 1.2000e+03 -1.4431e+00 -1.5000e+02 1.2286e+03 -9.5498e-01 -1.5000e+02 1.2571e+03 -5.0589e-01 -1.5000e+02 1.2857e+03 -9.1437e-02 -1.5000e+02 1.3143e+03 2.9217e-01 -1.5000e+02 1.3429e+03 6.4819e-01 -1.5000e+02 1.3714e+03 9.7945e-01 -1.5000e+02 1.4000e+03 1.2884e+00 -1.5000e+02 1.4286e+03 1.5772e+00 -1.5000e+02 1.4571e+03 1.8477e+00 -1.5000e+02 1.4857e+03 2.1017e+00 -1.5000e+02 1.5143e+03 2.3404e+00 -1.5000e+02 1.5429e+03 2.5654e+00 -1.5000e+02 1.5714e+03 2.7776e+00 -1.5000e+02 1.6000e+03 2.9782e+00 -1.5000e+02 1.6286e+03 3.1681e+00 -1.5000e+02 1.6571e+03 3.3481e+00 -1.5000e+02 1.6857e+03 3.5189e+00 -1.5000e+02 1.7143e+03 3.6812e+00 -1.5000e+02 1.7429e+03 3.8357e+00 -1.5000e+02 1.7714e+03 3.9829e+00 -1.5000e+02 1.8000e+03 4.1233e+00 -1.5000e+02 1.8286e+03 4.2573e+00 -1.5000e+02 1.8571e+03 4.3854e+00 -1.5000e+02 1.8857e+03 4.5079e+00 -1.5000e+02 1.9143e+03 4.6252e+00 -1.5000e+02 1.9429e+03 4.7377e+00 -1.5000e+02 1.9714e+03 4.8456e+00 -1.5000e+02 2.0000e+03 4.9491e+00 -1.8000e+02 -2.0000e+03 4.9579e+00 -1.8000e+02 -1.9714e+03 4.8548e+00 -1.8000e+02 -1.9429e+03 4.7475e+00 -1.8000e+02 -1.9143e+03 4.6356e+00 -1.8000e+02 -1.8857e+03 4.5189e+00 -1.8000e+02 -1.8571e+03 4.3970e+00 -1.8000e+02 -1.8286e+03 4.2696e+00 -1.8000e+02 -1.8000e+03 4.1364e+00 -1.8000e+02 -1.7714e+03 3.9969e+00 -1.8000e+02 -1.7429e+03 3.8507e+00 -1.8000e+02 -1.7143e+03 3.6972e+00 -1.8000e+02 -1.6857e+03 3.5359e+00 -1.8000e+02 -1.6571e+03 3.3663e+00 -1.8000e+02 -1.6286e+03 3.1877e+00 -1.8000e+02 -1.6000e+03 2.9993e+00 -1.8000e+02 -1.5714e+03 2.8003e+00 -1.8000e+02 -1.5429e+03 2.5898e+00 -1.8000e+02 -1.5143e+03 2.3668e+00 -1.8000e+02 -1.4857e+03 2.1302e+00 -1.8000e+02 -1.4571e+03 1.8787e+00 -1.8000e+02 -1.4286e+03 1.6109e+00 -1.8000e+02 -1.4000e+03 1.3251e+00 -1.8000e+02 -1.3714e+03 1.0196e+00 -1.8000e+02 -1.3429e+03 6.9220e-01 -1.8000e+02 -1.3143e+03 3.4054e-01 -1.8000e+02 -1.2857e+03 -3.8104e-02 -1.8000e+02 -1.2571e+03 -4.4690e-01 -1.8000e+02 -1.2286e+03 -8.8950e-01 -1.8000e+02 -1.2000e+03 -1.3702e+00 -1.8000e+02 -1.1714e+03 -1.8939e+00 -1.8000e+02 -1.1429e+03 -2.4665e+00 -1.8000e+02 -1.1143e+03 -3.0950e+00 -1.8000e+02 -1.0857e+03 -3.7876e+00 -1.8000e+02 -1.0571e+03 -4.5542e+00 -1.8000e+02 -1.0286e+03 -5.4069e+00 -1.8000e+02 -1.0000e+03 -6.3600e+00 -1.8000e+02 -9.7143e+02 -7.4313e+00 -1.8000e+02 -9.4286e+02 -8.6428e+00 -1.8000e+02 -9.1429e+02 -1.0021e+01 -1.8000e+02 -8.8571e+02 -1.1601e+01 -1.8000e+02 -8.5714e+02 -1.3423e+01 -1.8000e+02 -8.2857e+02 -1.5542e+01 -1.8000e+02 -8.0000e+02 -1.8021e+01 -1.8000e+02 -7.7143e+02 -2.0943e+01 -1.8000e+02 -7.4286e+02 -2.4402e+01 -1.8000e+02 -7.1429e+02 -2.8506e+01 -1.8000e+02 -6.8571e+02 -3.3360e+01 -1.8000e+02 -6.5714e+02 -3.9039e+01 -1.8000e+02 -6.2857e+02 -4.5536e+01 -1.8000e+02 -6.0000e+02 -5.2708e+01 -1.8000e+02 -5.7143e+02 -6.0248e+01 -1.8000e+02 -5.4286e+02 -6.7742e+01 -1.8000e+02 -5.1429e+02 -7.4786e+01 -1.8000e+02 -4.8571e+02 -8.1106e+01 -1.8000e+02 -4.5714e+02 -8.6592e+01 -1.8000e+02 -4.2857e+02 -9.1259e+01 -1.8000e+02 -4.0000e+02 -9.5189e+01 -1.8000e+02 -3.7143e+02 -9.8490e+01 -1.8000e+02 -3.4286e+02 -1.0127e+02 -1.8000e+02 -3.1429e+02 -1.0361e+02 -1.8000e+02 -2.8571e+02 -1.0559e+02 -1.8000e+02 -2.5714e+02 -1.0728e+02 -1.8000e+02 -2.2857e+02 -1.0871e+02 -1.8000e+02 -2.0000e+02 -1.0993e+02 -1.8000e+02 -1.7143e+02 -1.1096e+02 -1.8000e+02 -1.4286e+02 -1.1182e+02 -1.8000e+02 -1.1429e+02 -1.1252e+02 -1.8000e+02 -8.5714e+01 -1.1307e+02 -1.8000e+02 -5.7143e+01 -1.1346e+02 -1.8000e+02 -2.8571e+01 -1.1370e+02 -1.8000e+02 0.0000e+00 -1.1378e+02 -1.8000e+02 2.8571e+01 -1.1370e+02 -1.8000e+02 5.7143e+01 -1.1346e+02 -1.8000e+02 8.5714e+01 -1.1307e+02 -1.8000e+02 1.1429e+02 -1.1252e+02 -1.8000e+02 1.4286e+02 -1.1182e+02 -1.8000e+02 1.7143e+02 -1.1096e+02 -1.8000e+02 2.0000e+02 -1.0993e+02 -1.8000e+02 2.2857e+02 -1.0871e+02 -1.8000e+02 2.5714e+02 -1.0728e+02 -1.8000e+02 2.8571e+02 -1.0559e+02 -1.8000e+02 3.1429e+02 -1.0361e+02 -1.8000e+02 3.4286e+02 -1.0127e+02 -1.8000e+02 3.7143e+02 -9.8490e+01 -1.8000e+02 4.0000e+02 -9.5189e+01 -1.8000e+02 4.2857e+02 -9.1259e+01 -1.8000e+02 4.5714e+02 -8.6592e+01 -1.8000e+02 4.8571e+02 -8.1106e+01 -1.8000e+02 5.1429e+02 -7.4786e+01 -1.8000e+02 5.4286e+02 -6.7742e+01 -1.8000e+02 5.7143e+02 -6.0248e+01 -1.8000e+02 6.0000e+02 -5.2708e+01 -1.8000e+02 6.2857e+02 -4.5536e+01 -1.8000e+02 6.5714e+02 -3.9039e+01 -1.8000e+02 6.8571e+02 -3.3360e+01 -1.8000e+02 7.1429e+02 -2.8506e+01 -1.8000e+02 7.4286e+02 -2.4402e+01 -1.8000e+02 7.7143e+02 -2.0943e+01 -1.8000e+02 8.0000e+02 -1.8021e+01 -1.8000e+02 8.2857e+02 -1.5542e+01 -1.8000e+02 8.5714e+02 -1.3423e+01 -1.8000e+02 8.8571e+02 -1.1601e+01 -1.8000e+02 9.1429e+02 -1.0021e+01 -1.8000e+02 9.4286e+02 -8.6428e+00 -1.8000e+02 9.7143e+02 -7.4313e+00 -1.8000e+02 1.0000e+03 -6.3600e+00 -1.8000e+02 1.0286e+03 -5.4069e+00 -1.8000e+02 1.0571e+03 -4.5542e+00 -1.8000e+02 1.0857e+03 -3.7876e+00 -1.8000e+02 1.1143e+03 -3.0950e+00 -1.8000e+02 1.1429e+03 -2.4665e+00 -1.8000e+02 1.1714e+03 -1.8939e+00 -1.8000e+02 1.2000e+03 -1.3702e+00 -1.8000e+02 1.2286e+03 -8.8950e-01 -1.8000e+02 1.2571e+03 -4.4690e-01 -1.8000e+02 1.2857e+03 -3.8104e-02 -1.8000e+02 1.3143e+03 3.4054e-01 -1.8000e+02 1.3429e+03 6.9220e-01 -1.8000e+02 1.3714e+03 1.0196e+00 -1.8000e+02 1.4000e+03 1.3251e+00 -1.8000e+02 1.4286e+03 1.6109e+00 -1.8000e+02 1.4571e+03 1.8787e+00 -1.8000e+02 1.4857e+03 2.1302e+00 -1.8000e+02 1.5143e+03 2.3668e+00 -1.8000e+02 1.5429e+03 2.5898e+00 -1.8000e+02 1.5714e+03 2.8003e+00 -1.8000e+02 1.6000e+03 2.9993e+00 -1.8000e+02 1.6286e+03 3.1877e+00 -1.8000e+02 1.6571e+03 3.3663e+00 -1.8000e+02 1.6857e+03 3.5359e+00 -1.8000e+02 1.7143e+03 3.6972e+00 -1.8000e+02 1.7429e+03 3.8507e+00 -1.8000e+02 1.7714e+03 3.9969e+00 -1.8000e+02 1.8000e+03 4.1364e+00 -1.8000e+02 1.8286e+03 4.2696e+00 -1.8000e+02 1.8571e+03 4.3970e+00 -1.8000e+02 1.8857e+03 4.5189e+00 -1.8000e+02 1.9143e+03 4.6356e+00 -1.8000e+02 1.9429e+03 4.7475e+00 -1.8000e+02 1.9714e+03 4.8548e+00 -1.8000e+02 2.0000e+03 4.9579e+00 -2.1000e+02 -2.0000e+03 4.9682e+00 -2.1000e+02 -1.9714e+03 4.8657e+00 -2.1000e+02 -1.9429e+03 4.7590e+00 -2.1000e+02 -1.9143e+03 4.6478e+00 -2.1000e+02 -1.8857e+03 4.5318e+00 -2.1000e+02 -1.8571e+03 4.4107e+00 -2.1000e+02 -1.8286e+03 4.2842e+00 -2.1000e+02 -1.8000e+03 4.1519e+00 -2.1000e+02 -1.7714e+03 4.0133e+00 -2.1000e+02 -1.7429e+03 3.8682e+00 -2.1000e+02 -1.7143e+03 3.7159e+00 -2.1000e+02 -1.6857e+03 3.5559e+00 -2.1000e+02 -1.6571e+03 3.3877e+00 -2.1000e+02 -1.6286e+03 3.2106e+00 -2.1000e+02 -1.6000e+03 3.0239e+00 -2.1000e+02 -1.5714e+03 2.8268e+00 -2.1000e+02 -1.5429e+03 2.6184e+00 -2.1000e+02 -1.5143e+03 2.3977e+00 -2.1000e+02 -1.4857e+03 2.1636e+00 -2.1000e+02 -1.4571e+03 1.9150e+00 -2.1000e+02 -1.4286e+03 1.6503e+00 -2.1000e+02 -1.4000e+03 1.3681e+00 -2.1000e+02 -1.3714e+03 1.0665e+00 -2.1000e+02 -1.3429e+03 7.4354e-01 -2.1000e+02 -1.3143e+03 3.9693e-01 -2.1000e+02 -1.2857e+03 2.4017e-02 -2.1000e+02 -1.2571e+03 -3.7824e-01 -2.1000e+02 -1.2286e+03 -8.1336e-01 -2.1000e+02 -1.2000e+03 -1.2854e+00 -2.1000e+02 -1.1714e+03 -1.7992e+00 -2.1000e+02 -1.1429e+03 -2.3603e+00 -2.1000e+02 -1.1143e+03 -2.9752e+00 -2.1000e+02 -1.0857e+03 -3.6520e+00 -2.1000e+02 -1.0571e+03 -4.3998e+00 -2.1000e+02 -1.0286e+03 -5.2301e+00 -2.1000e+02 -1.0000e+03 -6.1564e+00 -2.1000e+02 -9.7143e+02 -7.1954e+00 -2.1000e+02 -9.4286e+02 -8.3674e+00 -2.1000e+02 -9.1429e+02 -9.6976e+00 -2.1000e+02 -8.8571e+02 -1.1217e+01 -2.1000e+02 -8.5714e+02 -1.2965e+01 -2.1000e+02 -8.2857e+02 -1.4990e+01 -2.1000e+02 -8.0000e+02 -1.7351e+01 -2.1000e+02 -7.7143e+02 -2.0123e+01 -2.1000e+02 -7.4286e+02 -2.3394e+01 -2.1000e+02 -7.1429e+02 -2.7264e+01 -2.1000e+02 -6.8571e+02 -3.1836e+01 -2.1000e+02 -6.5714e+02 -3.7191e+01 -2.1000e+02 -6.2857e+02 -4.3351e+01 -2.1000e+02 -6.0000e+02 -5.0220e+01 -2.1000e+02 -5.7143e+02 -5.7553e+01 -2.1000e+02 -5.4286e+02 -6.4976e+01 -2.1000e+02 -5.1429e+02 -7.2086e+01 -2.1000e+02 -4.8571e+02 -7.8573e+01 -2.1000e+02 -4.5714e+02 -8.4273e+01 -2.1000e+02 -4.2857e+02 -8.9162e+01 -2.1000e+02 -4.0000e+02 -9.3298e+01 -2.1000e+02 -3.7143e+02 -9.6779e+01 -2.1000e+02 -3.4286e+02 -9.9706e+01 -2.1000e+02 -3.1429e+02 -1.0217e+02 -2.1000e+02 -2.8571e+02 -1.0425e+02 -2.1000e+02 -2.5714e+02 -1.0602e+02 -2.1000e+02 -2.2857e+02 -1.0751e+02 -2.1000e+02 -2.0000e+02 -1.0877e+02 -2.1000e+02 -1.7143e+02 -1.0982e+02 -2.1000e+02 -1.4286e+02 -1.1070e+02 -2.1000e+02 -1.1429e+02 -1.1140e+02 -2.1000e+02 -8.5714e+01 -1.1195e+02 -2.1000e+02 -5.7143e+01 -1.1234e+02 -2.1000e+02 -2.8571e+01 -1.1257e+02 -2.1000e+02 0.0000e+00 -1.1265e+02 -2.1000e+02 2.8571e+01 -1.1257e+02 -2.1000e+02 5.7143e+01 -1.1234e+02 -2.1000e+02 8.5714e+01 -1.1195e+02 -2.1000e+02 1.1429e+02 -1.1140e+02 -2.1000e+02 1.4286e+02 -1.1070e+02 -2.1000e+02 1.7143e+02 -1.0982e+02 -2.1000e+02 2.0000e+02 -1.0877e+02 -2.1000e+02 2.2857e+02 -1.0751e+02 -2.1000e+02 2.5714e+02 -1.0602e+02 -2.1000e+02 2.8571e+02 -1.0425e+02 -2.1000e+02 3.1429e+02 -1.0217e+02 -2.1000e+02 3.4286e+02 -9.9706e+01 -2.1000e+02 3.7143e+02 -9.6779e+01 -2.1000e+02 4.0000e+02 -9.3298e+01 -2.1000e+02 4.2857e+02 -8.9162e+01 -2.1000e+02 4.5714e+02 -8.4273e+01 -2.1000e+02 4.8571e+02 -7.8573e+01 -2.1000e+02 5.1429e+02 -7.2086e+01 -2.1000e+02 5.4286e+02 -6.4976e+01 -2.1000e+02 5.7143e+02 -5.7553e+01 -2.1000e+02 6.0000e+02 -5.0220e+01 -2.1000e+02 6.2857e+02 -4.3351e+01 -2.1000e+02 6.5714e+02 -3.7191e+01 -2.1000e+02 6.8571e+02 -3.1836e+01 -2.1000e+02 7.1429e+02 -2.7264e+01 -2.1000e+02 7.4286e+02 -2.3394e+01 -2.1000e+02 7.7143e+02 -2.0123e+01 -2.1000e+02 8.0000e+02 -1.7351e+01 -2.1000e+02 8.2857e+02 -1.4990e+01 -2.1000e+02 8.5714e+02 -1.2965e+01 -2.1000e+02 8.8571e+02 -1.1217e+01 -2.1000e+02 9.1429e+02 -9.6976e+00 -2.1000e+02 9.4286e+02 -8.3674e+00 -2.1000e+02 9.7143e+02 -7.1954e+00 -2.1000e+02 1.0000e+03 -6.1564e+00 -2.1000e+02 1.0286e+03 -5.2301e+00 -2.1000e+02 1.0571e+03 -4.3998e+00 -2.1000e+02 1.0857e+03 -3.6520e+00 -2.1000e+02 1.1143e+03 -2.9752e+00 -2.1000e+02 1.1429e+03 -2.3603e+00 -2.1000e+02 1.1714e+03 -1.7992e+00 -2.1000e+02 1.2000e+03 -1.2854e+00 -2.1000e+02 1.2286e+03 -8.1336e-01 -2.1000e+02 1.2571e+03 -3.7824e-01 -2.1000e+02 1.2857e+03 2.4017e-02 -2.1000e+02 1.3143e+03 3.9693e-01 -2.1000e+02 1.3429e+03 7.4354e-01 -2.1000e+02 1.3714e+03 1.0665e+00 -2.1000e+02 1.4000e+03 1.3681e+00 -2.1000e+02 1.4286e+03 1.6503e+00 -2.1000e+02 1.4571e+03 1.9150e+00 -2.1000e+02 1.4857e+03 2.1636e+00 -2.1000e+02 1.5143e+03 2.3977e+00 -2.1000e+02 1.5429e+03 2.6184e+00 -2.1000e+02 1.5714e+03 2.8268e+00 -2.1000e+02 1.6000e+03 3.0239e+00 -2.1000e+02 1.6286e+03 3.2106e+00 -2.1000e+02 1.6571e+03 3.3877e+00 -2.1000e+02 1.6857e+03 3.5559e+00 -2.1000e+02 1.7143e+03 3.7159e+00 -2.1000e+02 1.7429e+03 3.8682e+00 -2.1000e+02 1.7714e+03 4.0133e+00 -2.1000e+02 1.8000e+03 4.1519e+00 -2.1000e+02 1.8286e+03 4.2842e+00 -2.1000e+02 1.8571e+03 4.4107e+00 -2.1000e+02 1.8857e+03 4.5318e+00 -2.1000e+02 1.9143e+03 4.6478e+00 -2.1000e+02 1.9429e+03 4.7590e+00 -2.1000e+02 1.9714e+03 4.8657e+00 -2.1000e+02 2.0000e+03 4.9682e+00 -2.4000e+02 -2.0000e+03 4.9801e+00 -2.4000e+02 -1.9714e+03 4.8782e+00 -2.4000e+02 -1.9429e+03 4.7722e+00 -2.4000e+02 -1.9143e+03 4.6617e+00 -2.4000e+02 -1.8857e+03 4.5466e+00 -2.4000e+02 -1.8571e+03 4.4264e+00 -2.4000e+02 -1.8286e+03 4.3008e+00 -2.4000e+02 -1.8000e+03 4.1696e+00 -2.4000e+02 -1.7714e+03 4.0322e+00 -2.4000e+02 -1.7429e+03 3.8882e+00 -2.4000e+02 -1.7143e+03 3.7373e+00 -2.4000e+02 -1.6857e+03 3.5788e+00 -2.4000e+02 -1.6571e+03 3.4122e+00 -2.4000e+02 -1.6286e+03 3.2369e+00 -2.4000e+02 -1.6000e+03 3.0521e+00 -2.4000e+02 -1.5714e+03 2.8571e+00 -2.4000e+02 -1.5429e+03 2.6510e+00 -2.4000e+02 -1.5143e+03 2.4329e+00 -2.4000e+02 -1.4857e+03 2.2018e+00 -2.4000e+02 -1.4571e+03 1.9563e+00 -2.4000e+02 -1.4286e+03 1.6952e+00 -2.4000e+02 -1.4000e+03 1.4169e+00 -2.4000e+02 -1.3714e+03 1.1198e+00 -2.4000e+02 -1.3429e+03 8.0189e-01 -2.4000e+02 -1.3143e+03 4.6097e-01 -2.4000e+02 -1.2857e+03 9.4502e-02 -2.4000e+02 -1.2571e+03 -3.0042e-01 -2.4000e+02 -1.2286e+03 -7.2715e-01 -2.4000e+02 -1.2000e+03 -1.1896e+00 -2.4000e+02 -1.1714e+03 -1.6922e+00 -2.4000e+02 -1.1429e+03 -2.2404e+00 -2.4000e+02 -1.1143e+03 -2.8403e+00 -2.4000e+02 -1.0857e+03 -3.4995e+00 -2.4000e+02 -1.0571e+03 -4.2265e+00 -2.4000e+02 -1.0286e+03 -5.0321e+00 -2.4000e+02 -1.0000e+03 -5.9288e+00 -2.4000e+02 -9.7143e+02 -6.9322e+00 -2.4000e+02 -9.4286e+02 -8.0611e+00 -2.4000e+02 -9.1429e+02 -9.3385e+00 -2.4000e+02 -8.8571e+02 -1.0793e+01 -2.4000e+02 -8.5714e+02 -1.2460e+01 -2.4000e+02 -8.2857e+02 -1.4384e+01 -2.4000e+02 -8.0000e+02 -1.6618e+01 -2.4000e+02 -7.7143e+02 -1.9230e+01 -2.4000e+02 -7.4286e+02 -2.2300e+01 -2.4000e+02 -7.1429e+02 -2.5920e+01 -2.4000e+02 -6.8571e+02 -3.0187e+01 -2.4000e+02 -6.5714e+02 -3.5188e+01 -2.4000e+02 -6.2857e+02 -4.0964e+01 -2.4000e+02 -6.0000e+02 -4.7468e+01 -2.4000e+02 -5.7143e+02 -5.4518e+01 -2.4000e+02 -5.4286e+02 -6.1797e+01 -2.4000e+02 -5.1429e+02 -6.8923e+01 -2.4000e+02 -4.8571e+02 -7.5553e+01 -2.4000e+02 -4.5714e+02 -8.1476e+01 -2.4000e+02 -4.2857e+02 -8.6613e+01 -2.4000e+02 -4.0000e+02 -9.0991e+01 -2.4000e+02 -3.7143e+02 -9.4689e+01 -2.4000e+02 -3.4286e+02 -9.7801e+01 -2.4000e+02 -3.1429e+02 -1.0042e+02 -2.4000e+02 -2.8571e+02 -1.0263e+02 -2.4000e+02 -2.5714e+02 -1.0449e+02 -2.4000e+02 -2.2857e+02 -1.0606e+02 -2.4000e+02 -2.0000e+02 -1.0738e+02 -2.4000e+02 -1.7143e+02 -1.0847e+02 -2.4000e+02 -1.4286e+02 -1.0938e+02 -2.4000e+02 -1.1429e+02 -1.1010e+02 -2.4000e+02 -8.5714e+01 -1.1066e+02 -2.4000e+02 -5.7143e+01 -1.1105e+02 -2.4000e+02 -2.8571e+01 -1.1128e+02 -2.4000e+02 0.0000e+00 -1.1136e+02 -2.4000e+02 2.8571e+01 -1.1128e+02 -2.4000e+02 5.7143e+01 -1.1105e+02 -2.4000e+02 8.5714e+01 -1.1066e+02 -2.4000e+02 1.1429e+02 -1.1010e+02 -2.4000e+02 1.4286e+02 -1.0938e+02 -2.4000e+02 1.7143e+02 -1.0847e+02 -2.4000e+02 2.0000e+02 -1.0738e+02 -2.4000e+02 2.2857e+02 -1.0606e+02 -2.4000e+02 2.5714e+02 -1.0449e+02 -2.4000e+02 2.8571e+02 -1.0263e+02 -2.4000e+02 3.1429e+02 -1.0042e+02 -2.4000e+02 3.4286e+02 -9.7801e+01 -2.4000e+02 3.7143e+02 -9.4689e+01 -2.4000e+02 4.0000e+02 -9.0991e+01 -2.4000e+02 4.2857e+02 -8.6613e+01 -2.4000e+02 4.5714e+02 -8.1476e+01 -2.4000e+02 4.8571e+02 -7.5553e+01 -2.4000e+02 5.1429e+02 -6.8923e+01 -2.4000e+02 5.4286e+02 -6.1797e+01 -2.4000e+02 5.7143e+02 -5.4518e+01 -2.4000e+02 6.0000e+02 -4.7468e+01 -2.4000e+02 6.2857e+02 -4.0964e+01 -2.4000e+02 6.5714e+02 -3.5188e+01 -2.4000e+02 6.8571e+02 -3.0187e+01 -2.4000e+02 7.1429e+02 -2.5920e+01 -2.4000e+02 7.4286e+02 -2.2300e+01 -2.4000e+02 7.7143e+02 -1.9230e+01 -2.4000e+02 8.0000e+02 -1.6618e+01 -2.4000e+02 8.2857e+02 -1.4384e+01 -2.4000e+02 8.5714e+02 -1.2460e+01 -2.4000e+02 8.8571e+02 -1.0793e+01 -2.4000e+02 9.1429e+02 -9.3385e+00 -2.4000e+02 9.4286e+02 -8.0611e+00 -2.4000e+02 9.7143e+02 -6.9322e+00 -2.4000e+02 1.0000e+03 -5.9288e+00 -2.4000e+02 1.0286e+03 -5.0321e+00 -2.4000e+02 1.0571e+03 -4.2265e+00 -2.4000e+02 1.0857e+03 -3.4995e+00 -2.4000e+02 1.1143e+03 -2.8403e+00 -2.4000e+02 1.1429e+03 -2.2404e+00 -2.4000e+02 1.1714e+03 -1.6922e+00 -2.4000e+02 1.2000e+03 -1.1896e+00 -2.4000e+02 1.2286e+03 -7.2715e-01 -2.4000e+02 1.2571e+03 -3.0042e-01 -2.4000e+02 1.2857e+03 9.4502e-02 -2.4000e+02 1.3143e+03 4.6097e-01 -2.4000e+02 1.3429e+03 8.0189e-01 -2.4000e+02 1.3714e+03 1.1198e+00 -2.4000e+02 1.4000e+03 1.4169e+00 -2.4000e+02 1.4286e+03 1.6952e+00 -2.4000e+02 1.4571e+03 1.9563e+00 -2.4000e+02 1.4857e+03 2.2018e+00 -2.4000e+02 1.5143e+03 2.4329e+00 -2.4000e+02 1.5429e+03 2.6510e+00 -2.4000e+02 1.5714e+03 2.8571e+00 -2.4000e+02 1.6000e+03 3.0521e+00 -2.4000e+02 1.6286e+03 3.2369e+00 -2.4000e+02 1.6571e+03 3.4122e+00 -2.4000e+02 1.6857e+03 3.5788e+00 -2.4000e+02 1.7143e+03 3.7373e+00 -2.4000e+02 1.7429e+03 3.8882e+00 -2.4000e+02 1.7714e+03 4.0322e+00 -2.4000e+02 1.8000e+03 4.1696e+00 -2.4000e+02 1.8286e+03 4.3008e+00 -2.4000e+02 1.8571e+03 4.4264e+00 -2.4000e+02 1.8857e+03 4.5466e+00 -2.4000e+02 1.9143e+03 4.6617e+00 -2.4000e+02 1.9429e+03 4.7722e+00 -2.4000e+02 1.9714e+03 4.8782e+00 -2.4000e+02 2.0000e+03 4.9801e+00 -2.7000e+02 -2.0000e+03 4.9934e+00 -2.7000e+02 -1.9714e+03 4.8923e+00 -2.7000e+02 -1.9429e+03 4.7870e+00 -2.7000e+02 -1.9143e+03 4.6774e+00 -2.7000e+02 -1.8857e+03 4.5632e+00 -2.7000e+02 -1.8571e+03 4.4440e+00 -2.7000e+02 -1.8286e+03 4.3195e+00 -2.7000e+02 -1.8000e+03 4.1894e+00 -2.7000e+02 -1.7714e+03 4.0533e+00 -2.7000e+02 -1.7429e+03 3.9108e+00 -2.7000e+02 -1.7143e+03 3.7613e+00 -2.7000e+02 -1.6857e+03 3.6045e+00 -2.7000e+02 -1.6571e+03 3.4397e+00 -2.7000e+02 -1.6286e+03 3.2663e+00 -2.7000e+02 -1.6000e+03 3.0837e+00 -2.7000e+02 -1.5714e+03 2.8910e+00 -2.7000e+02 -1.5429e+03 2.6876e+00 -2.7000e+02 -1.5143e+03 2.4724e+00 -2.7000e+02 -1.4857e+03 2.2444e+00 -2.7000e+02 -1.4571e+03 2.0024e+00 -2.7000e+02 -1.4286e+03 1.7453e+00 -2.7000e+02 -1.4000e+03 1.4714e+00 -2.7000e+02 -1.3714e+03 1.1793e+00 -2.7000e+02 -1.3429e+03 8.6691e-01 -2.7000e+02 -1.3143e+03 5.3225e-01 -2.7000e+02 -1.2857e+03 1.7288e-01 -2.7000e+02 -1.2571e+03 -2.1397e-01 -2.7000e+02 -1.2286e+03 -6.3149e-01 -2.7000e+02 -1.2000e+03 -1.0834e+00 -2.7000e+02 -1.1714e+03 -1.5739e+00 -2.7000e+02 -1.1429e+03 -2.1080e+00 -2.7000e+02 -1.1143e+03 -2.6915e+00 -2.7000e+02 -1.0857e+03 -3.3315e+00 -2.7000e+02 -1.0571e+03 -4.0360e+00 -2.7000e+02 -1.0286e+03 -4.8149e+00 -2.7000e+02 -1.0000e+03 -5.6799e+00 -2.7000e+02 -9.7143e+02 -6.6452e+00 -2.7000e+02 -9.4286e+02 -7.7279e+00 -2.7000e+02 -9.1429e+02 -8.9492e+00 -2.7000e+02 -8.8571e+02 -1.0335e+01 -2.7000e+02 -8.5714e+02 -1.1917e+01 -2.7000e+02 -8.2857e+02 -1.3735e+01 -2.7000e+02 -8.0000e+02 -1.5837e+01 -2.7000e+02 -7.7143e+02 -1.8282e+01 -2.7000e+02 -7.4286e+02 -2.1143e+01 -2.7000e+02 -7.1429e+02 -2.4503e+01 -2.7000e+02 -6.8571e+02 -2.8451e+01 -2.7000e+02 -6.5714e+02 -3.3075e+01 -2.7000e+02 -6.2857e+02 -3.8433e+01 -2.7000e+02 -6.0000e+02 -4.4514e+01 -2.7000e+02 -5.7143e+02 -5.1202e+01 -2.7000e+02 -5.4286e+02 -5.8248e+01 -2.7000e+02 -5.1429e+02 -6.5308e+01 -2.7000e+02 -4.8571e+02 -7.2033e+01 -2.7000e+02 -4.5714e+02 -7.8162e+01 -2.7000e+02 -4.2857e+02 -8.3561e+01 -2.7000e+02 -4.0000e+02 -8.8210e+01 -2.7000e+02 -3.7143e+02 -9.2160e+01 -2.7000e+02 -3.4286e+02 -9.5495e+01 -2.7000e+02 -3.1429e+02 -9.8302e+01 -2.7000e+02 -2.8571e+02 -1.0067e+02 -2.7000e+02 -2.5714e+02 -1.0265e+02 -2.7000e+02 -2.2857e+02 -1.0432e+02 -2.7000e+02 -2.0000e+02 -1.0572e+02 -2.7000e+02 -1.7143e+02 -1.0688e+02 -2.7000e+02 -1.4286e+02 -1.0782e+02 -2.7000e+02 -1.1429e+02 -1.0858e+02 -2.7000e+02 -8.5714e+01 -1.0915e+02 -2.7000e+02 -5.7143e+01 -1.0956e+02 -2.7000e+02 -2.8571e+01 -1.0980e+02 -2.7000e+02 0.0000e+00 -1.0988e+02 -2.7000e+02 2.8571e+01 -1.0980e+02 -2.7000e+02 5.7143e+01 -1.0956e+02 -2.7000e+02 8.5714e+01 -1.0915e+02 -2.7000e+02 1.1429e+02 -1.0858e+02 -2.7000e+02 1.4286e+02 -1.0782e+02 -2.7000e+02 1.7143e+02 -1.0688e+02 -2.7000e+02 2.0000e+02 -1.0572e+02 -2.7000e+02 2.2857e+02 -1.0432e+02 -2.7000e+02 2.5714e+02 -1.0265e+02 -2.7000e+02 2.8571e+02 -1.0067e+02 -2.7000e+02 3.1429e+02 -9.8302e+01 -2.7000e+02 3.4286e+02 -9.5495e+01 -2.7000e+02 3.7143e+02 -9.2160e+01 -2.7000e+02 4.0000e+02 -8.8210e+01 -2.7000e+02 4.2857e+02 -8.3561e+01 -2.7000e+02 4.5714e+02 -7.8162e+01 -2.7000e+02 4.8571e+02 -7.2033e+01 -2.7000e+02 5.1429e+02 -6.5308e+01 -2.7000e+02 5.4286e+02 -5.8248e+01 -2.7000e+02 5.7143e+02 -5.1202e+01 -2.7000e+02 6.0000e+02 -4.4514e+01 -2.7000e+02 6.2857e+02 -3.8433e+01 -2.7000e+02 6.5714e+02 -3.3075e+01 -2.7000e+02 6.8571e+02 -2.8451e+01 -2.7000e+02 7.1429e+02 -2.4503e+01 -2.7000e+02 7.4286e+02 -2.1143e+01 -2.7000e+02 7.7143e+02 -1.8282e+01 -2.7000e+02 8.0000e+02 -1.5837e+01 -2.7000e+02 8.2857e+02 -1.3735e+01 -2.7000e+02 8.5714e+02 -1.1917e+01 -2.7000e+02 8.8571e+02 -1.0335e+01 -2.7000e+02 9.1429e+02 -8.9492e+00 -2.7000e+02 9.4286e+02 -7.7279e+00 -2.7000e+02 9.7143e+02 -6.6452e+00 -2.7000e+02 1.0000e+03 -5.6799e+00 -2.7000e+02 1.0286e+03 -4.8149e+00 -2.7000e+02 1.0571e+03 -4.0360e+00 -2.7000e+02 1.0857e+03 -3.3315e+00 -2.7000e+02 1.1143e+03 -2.6915e+00 -2.7000e+02 1.1429e+03 -2.1080e+00 -2.7000e+02 1.1714e+03 -1.5739e+00 -2.7000e+02 1.2000e+03 -1.0834e+00 -2.7000e+02 1.2286e+03 -6.3149e-01 -2.7000e+02 1.2571e+03 -2.1397e-01 -2.7000e+02 1.2857e+03 1.7288e-01 -2.7000e+02 1.3143e+03 5.3225e-01 -2.7000e+02 1.3429e+03 8.6691e-01 -2.7000e+02 1.3714e+03 1.1793e+00 -2.7000e+02 1.4000e+03 1.4714e+00 -2.7000e+02 1.4286e+03 1.7453e+00 -2.7000e+02 1.4571e+03 2.0024e+00 -2.7000e+02 1.4857e+03 2.2444e+00 -2.7000e+02 1.5143e+03 2.4724e+00 -2.7000e+02 1.5429e+03 2.6876e+00 -2.7000e+02 1.5714e+03 2.8910e+00 -2.7000e+02 1.6000e+03 3.0837e+00 -2.7000e+02 1.6286e+03 3.2663e+00 -2.7000e+02 1.6571e+03 3.4397e+00 -2.7000e+02 1.6857e+03 3.6045e+00 -2.7000e+02 1.7143e+03 3.7613e+00 -2.7000e+02 1.7429e+03 3.9108e+00 -2.7000e+02 1.7714e+03 4.0533e+00 -2.7000e+02 1.8000e+03 4.1894e+00 -2.7000e+02 1.8286e+03 4.3195e+00 -2.7000e+02 1.8571e+03 4.4440e+00 -2.7000e+02 1.8857e+03 4.5632e+00 -2.7000e+02 1.9143e+03 4.6774e+00 -2.7000e+02 1.9429e+03 4.7870e+00 -2.7000e+02 1.9714e+03 4.8923e+00 -2.7000e+02 2.0000e+03 4.9934e+00 -3.0000e+02 -2.0000e+03 5.0081e+00 -3.0000e+02 -1.9714e+03 4.9079e+00 -3.0000e+02 -1.9429e+03 4.8035e+00 -3.0000e+02 -1.9143e+03 4.6949e+00 -3.0000e+02 -1.8857e+03 4.5816e+00 -3.0000e+02 -1.8571e+03 4.4635e+00 -3.0000e+02 -1.8286e+03 4.3403e+00 -3.0000e+02 -1.8000e+03 4.2114e+00 -3.0000e+02 -1.7714e+03 4.0767e+00 -3.0000e+02 -1.7429e+03 3.9357e+00 -3.0000e+02 -1.7143e+03 3.7879e+00 -3.0000e+02 -1.6857e+03 3.6328e+00 -3.0000e+02 -1.6571e+03 3.4700e+00 -3.0000e+02 -1.6286e+03 3.2988e+00 -3.0000e+02 -1.6000e+03 3.1185e+00 -3.0000e+02 -1.5714e+03 2.9285e+00 -3.0000e+02 -1.5429e+03 2.7278e+00 -3.0000e+02 -1.5143e+03 2.5158e+00 -3.0000e+02 -1.4857e+03 2.2913e+00 -3.0000e+02 -1.4571e+03 2.0532e+00 -3.0000e+02 -1.4286e+03 1.8004e+00 -3.0000e+02 -1.4000e+03 1.5313e+00 -3.0000e+02 -1.3714e+03 1.2445e+00 -3.0000e+02 -1.3429e+03 9.3820e-01 -3.0000e+02 -1.3143e+03 6.1034e-01 -3.0000e+02 -1.2857e+03 2.5865e-01 -3.0000e+02 -1.2571e+03 -1.1948e-01 -3.0000e+02 -1.2286e+03 -5.2707e-01 -3.0000e+02 -1.2000e+03 -9.6758e-01 -3.0000e+02 -1.1714e+03 -1.4450e+00 -3.0000e+02 -1.1429e+03 -1.9640e+00 -3.0000e+02 -1.1143e+03 -2.5301e+00 -3.0000e+02 -1.0857e+03 -3.1497e+00 -3.0000e+02 -1.0571e+03 -3.8303e+00 -3.0000e+02 -1.0286e+03 -4.5809e+00 -3.0000e+02 -1.0000e+03 -5.4124e+00 -3.0000e+02 -9.7143e+02 -6.3375e+00 -3.0000e+02 -9.4286e+02 -7.3720e+00 -3.0000e+02 -9.1429e+02 -8.5348e+00 -3.0000e+02 -8.8571e+02 -9.8491e+00 -3.0000e+02 -8.5714e+02 -1.1343e+01 -3.0000e+02 -8.2857e+02 -1.3052e+01 -3.0000e+02 -8.0000e+02 -1.5019e+01 -3.0000e+02 -7.7143e+02 -1.7295e+01 -3.0000e+02 -7.4286e+02 -1.9944e+01 -3.0000e+02 -7.1429e+02 -2.3040e+01 -3.0000e+02 -6.8571e+02 -2.6665e+01 -3.0000e+02 -6.5714e+02 -3.0902e+01 -3.0000e+02 -6.2857e+02 -3.5816e+01 -3.0000e+02 -6.0000e+02 -4.1430e+01 -3.0000e+02 -5.7143e+02 -4.7681e+01 -3.0000e+02 -5.4286e+02 -5.4393e+01 -3.0000e+02 -5.1429e+02 -6.1284e+01 -3.0000e+02 -4.8571e+02 -6.8019e+01 -3.0000e+02 -4.5714e+02 -7.4307e+01 -3.0000e+02 -4.2857e+02 -7.9957e+01 -3.0000e+02 -4.0000e+02 -8.4893e+01 -3.0000e+02 -3.7143e+02 -8.9128e+01 -3.0000e+02 -3.4286e+02 -9.2722e+01 -3.0000e+02 -3.1429e+02 -9.5755e+01 -3.0000e+02 -2.8571e+02 -9.8309e+01 -3.0000e+02 -2.5714e+02 -1.0045e+02 -3.0000e+02 -2.2857e+02 -1.0225e+02 -3.0000e+02 -2.0000e+02 -1.0375e+02 -3.0000e+02 -1.7143e+02 -1.0499e+02 -3.0000e+02 -1.4286e+02 -1.0599e+02 -3.0000e+02 -1.1429e+02 -1.0679e+02 -3.0000e+02 -8.5714e+01 -1.0740e+02 -3.0000e+02 -5.7143e+01 -1.0783e+02 -3.0000e+02 -2.8571e+01 -1.0808e+02 -3.0000e+02 0.0000e+00 -1.0817e+02 -3.0000e+02 2.8571e+01 -1.0808e+02 -3.0000e+02 5.7143e+01 -1.0783e+02 -3.0000e+02 8.5714e+01 -1.0740e+02 -3.0000e+02 1.1429e+02 -1.0679e+02 -3.0000e+02 1.4286e+02 -1.0599e+02 -3.0000e+02 1.7143e+02 -1.0499e+02 -3.0000e+02 2.0000e+02 -1.0375e+02 -3.0000e+02 2.2857e+02 -1.0225e+02 -3.0000e+02 2.5714e+02 -1.0045e+02 -3.0000e+02 2.8571e+02 -9.8309e+01 -3.0000e+02 3.1429e+02 -9.5755e+01 -3.0000e+02 3.4286e+02 -9.2722e+01 -3.0000e+02 3.7143e+02 -8.9128e+01 -3.0000e+02 4.0000e+02 -8.4893e+01 -3.0000e+02 4.2857e+02 -7.9957e+01 -3.0000e+02 4.5714e+02 -7.4307e+01 -3.0000e+02 4.8571e+02 -6.8019e+01 -3.0000e+02 5.1429e+02 -6.1284e+01 -3.0000e+02 5.4286e+02 -5.4393e+01 -3.0000e+02 5.7143e+02 -4.7681e+01 -3.0000e+02 6.0000e+02 -4.1430e+01 -3.0000e+02 6.2857e+02 -3.5816e+01 -3.0000e+02 6.5714e+02 -3.0902e+01 -3.0000e+02 6.8571e+02 -2.6665e+01 -3.0000e+02 7.1429e+02 -2.3040e+01 -3.0000e+02 7.4286e+02 -1.9944e+01 -3.0000e+02 7.7143e+02 -1.7295e+01 -3.0000e+02 8.0000e+02 -1.5019e+01 -3.0000e+02 8.2857e+02 -1.3052e+01 -3.0000e+02 8.5714e+02 -1.1343e+01 -3.0000e+02 8.8571e+02 -9.8491e+00 -3.0000e+02 9.1429e+02 -8.5348e+00 -3.0000e+02 9.4286e+02 -7.3720e+00 -3.0000e+02 9.7143e+02 -6.3375e+00 -3.0000e+02 1.0000e+03 -5.4124e+00 -3.0000e+02 1.0286e+03 -4.5809e+00 -3.0000e+02 1.0571e+03 -3.8303e+00 -3.0000e+02 1.0857e+03 -3.1497e+00 -3.0000e+02 1.1143e+03 -2.5301e+00 -3.0000e+02 1.1429e+03 -1.9640e+00 -3.0000e+02 1.1714e+03 -1.4450e+00 -3.0000e+02 1.2000e+03 -9.6758e-01 -3.0000e+02 1.2286e+03 -5.2707e-01 -3.0000e+02 1.2571e+03 -1.1948e-01 -3.0000e+02 1.2857e+03 2.5865e-01 -3.0000e+02 1.3143e+03 6.1034e-01 -3.0000e+02 1.3429e+03 9.3820e-01 -3.0000e+02 1.3714e+03 1.2445e+00 -3.0000e+02 1.4000e+03 1.5313e+00 -3.0000e+02 1.4286e+03 1.8004e+00 -3.0000e+02 1.4571e+03 2.0532e+00 -3.0000e+02 1.4857e+03 2.2913e+00 -3.0000e+02 1.5143e+03 2.5158e+00 -3.0000e+02 1.5429e+03 2.7278e+00 -3.0000e+02 1.5714e+03 2.9285e+00 -3.0000e+02 1.6000e+03 3.1185e+00 -3.0000e+02 1.6286e+03 3.2988e+00 -3.0000e+02 1.6571e+03 3.4700e+00 -3.0000e+02 1.6857e+03 3.6328e+00 -3.0000e+02 1.7143e+03 3.7879e+00 -3.0000e+02 1.7429e+03 3.9357e+00 -3.0000e+02 1.7714e+03 4.0767e+00 -3.0000e+02 1.8000e+03 4.2114e+00 -3.0000e+02 1.8286e+03 4.3403e+00 -3.0000e+02 1.8571e+03 4.4635e+00 -3.0000e+02 1.8857e+03 4.5816e+00 -3.0000e+02 1.9143e+03 4.6949e+00 -3.0000e+02 1.9429e+03 4.8035e+00 -3.0000e+02 1.9714e+03 4.9079e+00 -3.0000e+02 2.0000e+03 5.0081e+00 -3.3000e+02 -2.0000e+03 5.0243e+00 -3.3000e+02 -1.9714e+03 4.9249e+00 -3.3000e+02 -1.9429e+03 4.8215e+00 -3.3000e+02 -1.9143e+03 4.7139e+00 -3.3000e+02 -1.8857e+03 4.6018e+00 -3.3000e+02 -1.8571e+03 4.4849e+00 -3.3000e+02 -1.8286e+03 4.3629e+00 -3.3000e+02 -1.8000e+03 4.2355e+00 -3.3000e+02 -1.7714e+03 4.1023e+00 -3.3000e+02 -1.7429e+03 3.9629e+00 -3.3000e+02 -1.7143e+03 3.8169e+00 -3.3000e+02 -1.6857e+03 3.6638e+00 -3.3000e+02 -1.6571e+03 3.5031e+00 -3.3000e+02 -1.6286e+03 3.3342e+00 -3.3000e+02 -1.6000e+03 3.1565e+00 -3.3000e+02 -1.5714e+03 2.9692e+00 -3.3000e+02 -1.5429e+03 2.7717e+00 -3.3000e+02 -1.5143e+03 2.5630e+00 -3.3000e+02 -1.4857e+03 2.3423e+00 -3.3000e+02 -1.4571e+03 2.1084e+00 -3.3000e+02 -1.4286e+03 1.8601e+00 -3.3000e+02 -1.4000e+03 1.5963e+00 -3.3000e+02 -1.3714e+03 1.3152e+00 -3.3000e+02 -1.3429e+03 1.0154e+00 -3.3000e+02 -1.3143e+03 6.9477e-01 -3.3000e+02 -1.2857e+03 3.5128e-01 -3.3000e+02 -1.2571e+03 -1.7572e-02 -3.3000e+02 -1.2286e+03 -4.1460e-01 -3.3000e+02 -1.2000e+03 -8.4306e-01 -3.3000e+02 -1.1714e+03 -1.3067e+00 -3.3000e+02 -1.1429e+03 -1.8098e+00 -3.3000e+02 -1.1143e+03 -2.3575e+00 -3.3000e+02 -1.0857e+03 -2.9556e+00 -3.3000e+02 -1.0571e+03 -3.6112e+00 -3.3000e+02 -1.0286e+03 -4.3324e+00 -3.3000e+02 -1.0000e+03 -5.1290e+00 -3.3000e+02 -9.7143e+02 -6.0127e+00 -3.3000e+02 -9.4286e+02 -6.9975e+00 -3.3000e+02 -9.1429e+02 -8.1004e+00 -3.3000e+02 -8.8571e+02 -9.3419e+00 -3.3000e+02 -8.5714e+02 -1.0747e+01 -3.3000e+02 -8.2857e+02 -1.2346e+01 -3.3000e+02 -8.0000e+02 -1.4177e+01 -3.3000e+02 -7.7143e+02 -1.6285e+01 -3.3000e+02 -7.4286e+02 -1.8724e+01 -3.3000e+02 -7.1429e+02 -2.1559e+01 -3.3000e+02 -6.8571e+02 -2.4863e+01 -3.3000e+02 -6.5714e+02 -2.8711e+01 -3.3000e+02 -6.2857e+02 -3.3173e+01 -3.3000e+02 -6.0000e+02 -3.8290e+01 -3.3000e+02 -5.7143e+02 -4.4043e+01 -3.3000e+02 -5.4286e+02 -5.0326e+01 -3.3000e+02 -5.1429e+02 -5.6925e+01 -3.3000e+02 -4.8571e+02 -6.3554e+01 -3.3000e+02 -4.5714e+02 -6.9913e+01 -3.3000e+02 -4.2857e+02 -7.5768e+01 -3.3000e+02 -4.0000e+02 -8.0982e+01 -3.3000e+02 -3.7143e+02 -8.5519e+01 -3.3000e+02 -3.4286e+02 -8.9404e+01 -3.3000e+02 -3.1429e+02 -9.2701e+01 -3.3000e+02 -2.8571e+02 -9.5482e+01 -3.3000e+02 -2.5714e+02 -9.7819e+01 -3.3000e+02 -2.2857e+02 -9.9775e+01 -3.3000e+02 -2.0000e+02 -1.0140e+02 -3.3000e+02 -1.7143e+02 -1.0274e+02 -3.3000e+02 -1.4286e+02 -1.0383e+02 -3.3000e+02 -1.1429e+02 -1.0469e+02 -3.3000e+02 -8.5714e+01 -1.0534e+02 -3.3000e+02 -5.7143e+01 -1.0580e+02 -3.3000e+02 -2.8571e+01 -1.0607e+02 -3.3000e+02 0.0000e+00 -1.0616e+02 -3.3000e+02 2.8571e+01 -1.0607e+02 -3.3000e+02 5.7143e+01 -1.0580e+02 -3.3000e+02 8.5714e+01 -1.0534e+02 -3.3000e+02 1.1429e+02 -1.0469e+02 -3.3000e+02 1.4286e+02 -1.0383e+02 -3.3000e+02 1.7143e+02 -1.0274e+02 -3.3000e+02 2.0000e+02 -1.0140e+02 -3.3000e+02 2.2857e+02 -9.9775e+01 -3.3000e+02 2.5714e+02 -9.7819e+01 -3.3000e+02 2.8571e+02 -9.5482e+01 -3.3000e+02 3.1429e+02 -9.2701e+01 -3.3000e+02 3.4286e+02 -8.9404e+01 -3.3000e+02 3.7143e+02 -8.5519e+01 -3.3000e+02 4.0000e+02 -8.0982e+01 -3.3000e+02 4.2857e+02 -7.5768e+01 -3.3000e+02 4.5714e+02 -6.9913e+01 -3.3000e+02 4.8571e+02 -6.3554e+01 -3.3000e+02 5.1429e+02 -5.6925e+01 -3.3000e+02 5.4286e+02 -5.0326e+01 -3.3000e+02 5.7143e+02 -4.4043e+01 -3.3000e+02 6.0000e+02 -3.8290e+01 -3.3000e+02 6.2857e+02 -3.3173e+01 -3.3000e+02 6.5714e+02 -2.8711e+01 -3.3000e+02 6.8571e+02 -2.4863e+01 -3.3000e+02 7.1429e+02 -2.1559e+01 -3.3000e+02 7.4286e+02 -1.8724e+01 -3.3000e+02 7.7143e+02 -1.6285e+01 -3.3000e+02 8.0000e+02 -1.4177e+01 -3.3000e+02 8.2857e+02 -1.2346e+01 -3.3000e+02 8.5714e+02 -1.0747e+01 -3.3000e+02 8.8571e+02 -9.3419e+00 -3.3000e+02 9.1429e+02 -8.1004e+00 -3.3000e+02 9.4286e+02 -6.9975e+00 -3.3000e+02 9.7143e+02 -6.0127e+00 -3.3000e+02 1.0000e+03 -5.1290e+00 -3.3000e+02 1.0286e+03 -4.3324e+00 -3.3000e+02 1.0571e+03 -3.6112e+00 -3.3000e+02 1.0857e+03 -2.9556e+00 -3.3000e+02 1.1143e+03 -2.3575e+00 -3.3000e+02 1.1429e+03 -1.8098e+00 -3.3000e+02 1.1714e+03 -1.3067e+00 -3.3000e+02 1.2000e+03 -8.4306e-01 -3.3000e+02 1.2286e+03 -4.1460e-01 -3.3000e+02 1.2571e+03 -1.7572e-02 -3.3000e+02 1.2857e+03 3.5128e-01 -3.3000e+02 1.3143e+03 6.9477e-01 -3.3000e+02 1.3429e+03 1.0154e+00 -3.3000e+02 1.3714e+03 1.3152e+00 -3.3000e+02 1.4000e+03 1.5963e+00 -3.3000e+02 1.4286e+03 1.8601e+00 -3.3000e+02 1.4571e+03 2.1084e+00 -3.3000e+02 1.4857e+03 2.3423e+00 -3.3000e+02 1.5143e+03 2.5630e+00 -3.3000e+02 1.5429e+03 2.7717e+00 -3.3000e+02 1.5714e+03 2.9692e+00 -3.3000e+02 1.6000e+03 3.1565e+00 -3.3000e+02 1.6286e+03 3.3342e+00 -3.3000e+02 1.6571e+03 3.5031e+00 -3.3000e+02 1.6857e+03 3.6638e+00 -3.3000e+02 1.7143e+03 3.8169e+00 -3.3000e+02 1.7429e+03 3.9629e+00 -3.3000e+02 1.7714e+03 4.1023e+00 -3.3000e+02 1.8000e+03 4.2355e+00 -3.3000e+02 1.8286e+03 4.3629e+00 -3.3000e+02 1.8571e+03 4.4849e+00 -3.3000e+02 1.8857e+03 4.6018e+00 -3.3000e+02 1.9143e+03 4.7139e+00 -3.3000e+02 1.9429e+03 4.8215e+00 -3.3000e+02 1.9714e+03 4.9249e+00 -3.3000e+02 2.0000e+03 5.0243e+00 -3.6000e+02 -2.0000e+03 5.0419e+00 -3.6000e+02 -1.9714e+03 4.9435e+00 -3.6000e+02 -1.9429e+03 4.8411e+00 -3.6000e+02 -1.9143e+03 4.7346e+00 -3.6000e+02 -1.8857e+03 4.6237e+00 -3.6000e+02 -1.8571e+03 4.5081e+00 -3.6000e+02 -1.8286e+03 4.3875e+00 -3.6000e+02 -1.8000e+03 4.2616e+00 -3.6000e+02 -1.7714e+03 4.1300e+00 -3.6000e+02 -1.7429e+03 3.9924e+00 -3.6000e+02 -1.7143e+03 3.8483e+00 -3.6000e+02 -1.6857e+03 3.6973e+00 -3.6000e+02 -1.6571e+03 3.5388e+00 -3.6000e+02 -1.6286e+03 3.3724e+00 -3.6000e+02 -1.6000e+03 3.1974e+00 -3.6000e+02 -1.5714e+03 3.0132e+00 -3.6000e+02 -1.5429e+03 2.8189e+00 -3.6000e+02 -1.5143e+03 2.6139e+00 -3.6000e+02 -1.4857e+03 2.3971e+00 -3.6000e+02 -1.4571e+03 2.1677e+00 -3.6000e+02 -1.4286e+03 1.9244e+00 -3.6000e+02 -1.4000e+03 1.6659e+00 -3.6000e+02 -1.3714e+03 1.3910e+00 -3.6000e+02 -1.3429e+03 1.0980e+00 -3.6000e+02 -1.3143e+03 7.8505e-01 -3.6000e+02 -1.2857e+03 4.5020e-01 -3.6000e+02 -1.2571e+03 9.1122e-02 -3.6000e+02 -1.2286e+03 -2.9483e-01 -3.6000e+02 -1.2000e+03 -7.1066e-01 -3.6000e+02 -1.1714e+03 -1.1599e+00 -3.6000e+02 -1.1429e+03 -1.6464e+00 -3.6000e+02 -1.1143e+03 -2.1749e+00 -3.6000e+02 -1.0857e+03 -2.7509e+00 -3.6000e+02 -1.0571e+03 -3.3806e+00 -3.6000e+02 -1.0286e+03 -4.0716e+00 -3.6000e+02 -1.0000e+03 -4.8325e+00 -3.6000e+02 -9.7143e+02 -5.6739e+00 -3.6000e+02 -9.4286e+02 -6.6084e+00 -3.6000e+02 -9.1429e+02 -7.6508e+00 -3.6000e+02 -8.8571e+02 -8.8192e+00 -3.6000e+02 -8.5714e+02 -1.0136e+01 -3.6000e+02 -8.2857e+02 -1.1626e+01 -3.6000e+02 -8.0000e+02 -1.3324e+01 -3.6000e+02 -7.7143e+02 -1.5266e+01 -3.6000e+02 -7.4286e+02 -1.7501e+01 -3.6000e+02 -7.1429e+02 -2.0082e+01 -3.6000e+02 -6.8571e+02 -2.3073e+01 -3.6000e+02 -6.5714e+02 -2.6542e+01 -3.6000e+02 -6.2857e+02 -3.0556e+01 -3.6000e+02 -6.0000e+02 -3.5164e+01 -3.6000e+02 -5.7143e+02 -4.0381e+01 -3.6000e+02 -5.4286e+02 -4.6154e+01 -3.6000e+02 -5.1429e+02 -5.2343e+01 -3.6000e+02 -4.8571e+02 -5.8724e+01 -3.6000e+02 -4.5714e+02 -6.5027e+01 -3.6000e+02 -4.2857e+02 -7.0993e+01 -3.6000e+02 -4.0000e+02 -7.6439e+01 -3.6000e+02 -3.7143e+02 -8.1268e+01 -3.6000e+02 -3.4286e+02 -8.5461e+01 -3.6000e+02 -3.1429e+02 -8.9051e+01 -3.6000e+02 -2.8571e+02 -9.2096e+01 -3.6000e+02 -2.5714e+02 -9.4663e+01 -3.6000e+02 -2.2857e+02 -9.6812e+01 -3.6000e+02 -2.0000e+02 -9.8598e+01 -3.6000e+02 -1.7143e+02 -1.0007e+02 -3.6000e+02 -1.4286e+02 -1.0126e+02 -3.6000e+02 -1.1429e+02 -1.0220e+02 -3.6000e+02 -8.5714e+01 -1.0291e+02 -3.6000e+02 -5.7143e+01 -1.0341e+02 -3.6000e+02 -2.8571e+01 -1.0370e+02 -3.6000e+02 0.0000e+00 -1.0380e+02 -3.6000e+02 2.8571e+01 -1.0370e+02 -3.6000e+02 5.7143e+01 -1.0341e+02 -3.6000e+02 8.5714e+01 -1.0291e+02 -3.6000e+02 1.1429e+02 -1.0220e+02 -3.6000e+02 1.4286e+02 -1.0126e+02 -3.6000e+02 1.7143e+02 -1.0007e+02 -3.6000e+02 2.0000e+02 -9.8598e+01 -3.6000e+02 2.2857e+02 -9.6812e+01 -3.6000e+02 2.5714e+02 -9.4663e+01 -3.6000e+02 2.8571e+02 -9.2096e+01 -3.6000e+02 3.1429e+02 -8.9051e+01 -3.6000e+02 3.4286e+02 -8.5461e+01 -3.6000e+02 3.7143e+02 -8.1268e+01 -3.6000e+02 4.0000e+02 -7.6439e+01 -3.6000e+02 4.2857e+02 -7.0993e+01 -3.6000e+02 4.5714e+02 -6.5027e+01 -3.6000e+02 4.8571e+02 -5.8724e+01 -3.6000e+02 5.1429e+02 -5.2343e+01 -3.6000e+02 5.4286e+02 -4.6154e+01 -3.6000e+02 5.7143e+02 -4.0381e+01 -3.6000e+02 6.0000e+02 -3.5164e+01 -3.6000e+02 6.2857e+02 -3.0556e+01 -3.6000e+02 6.5714e+02 -2.6542e+01 -3.6000e+02 6.8571e+02 -2.3073e+01 -3.6000e+02 7.1429e+02 -2.0082e+01 -3.6000e+02 7.4286e+02 -1.7501e+01 -3.6000e+02 7.7143e+02 -1.5266e+01 -3.6000e+02 8.0000e+02 -1.3324e+01 -3.6000e+02 8.2857e+02 -1.1626e+01 -3.6000e+02 8.5714e+02 -1.0136e+01 -3.6000e+02 8.8571e+02 -8.8192e+00 -3.6000e+02 9.1429e+02 -7.6508e+00 -3.6000e+02 9.4286e+02 -6.6084e+00 -3.6000e+02 9.7143e+02 -5.6739e+00 -3.6000e+02 1.0000e+03 -4.8325e+00 -3.6000e+02 1.0286e+03 -4.0716e+00 -3.6000e+02 1.0571e+03 -3.3806e+00 -3.6000e+02 1.0857e+03 -2.7509e+00 -3.6000e+02 1.1143e+03 -2.1749e+00 -3.6000e+02 1.1429e+03 -1.6464e+00 -3.6000e+02 1.1714e+03 -1.1599e+00 -3.6000e+02 1.2000e+03 -7.1066e-01 -3.6000e+02 1.2286e+03 -2.9483e-01 -3.6000e+02 1.2571e+03 9.1122e-02 -3.6000e+02 1.2857e+03 4.5020e-01 -3.6000e+02 1.3143e+03 7.8505e-01 -3.6000e+02 1.3429e+03 1.0980e+00 -3.6000e+02 1.3714e+03 1.3910e+00 -3.6000e+02 1.4000e+03 1.6659e+00 -3.6000e+02 1.4286e+03 1.9244e+00 -3.6000e+02 1.4571e+03 2.1677e+00 -3.6000e+02 1.4857e+03 2.3971e+00 -3.6000e+02 1.5143e+03 2.6139e+00 -3.6000e+02 1.5429e+03 2.8189e+00 -3.6000e+02 1.5714e+03 3.0132e+00 -3.6000e+02 1.6000e+03 3.1974e+00 -3.6000e+02 1.6286e+03 3.3724e+00 -3.6000e+02 1.6571e+03 3.5388e+00 -3.6000e+02 1.6857e+03 3.6973e+00 -3.6000e+02 1.7143e+03 3.8483e+00 -3.6000e+02 1.7429e+03 3.9924e+00 -3.6000e+02 1.7714e+03 4.1300e+00 -3.6000e+02 1.8000e+03 4.2616e+00 -3.6000e+02 1.8286e+03 4.3875e+00 -3.6000e+02 1.8571e+03 4.5081e+00 -3.6000e+02 1.8857e+03 4.6237e+00 -3.6000e+02 1.9143e+03 4.7346e+00 -3.6000e+02 1.9429e+03 4.8411e+00 -3.6000e+02 1.9714e+03 4.9435e+00 -3.6000e+02 2.0000e+03 5.0419e+00 -3.9000e+02 -2.0000e+03 5.0608e+00 -3.9000e+02 -1.9714e+03 4.9634e+00 -3.9000e+02 -1.9429e+03 4.8622e+00 -3.9000e+02 -1.9143e+03 4.7568e+00 -3.9000e+02 -1.8857e+03 4.6472e+00 -3.9000e+02 -1.8571e+03 4.5329e+00 -3.9000e+02 -1.8286e+03 4.4138e+00 -3.9000e+02 -1.8000e+03 4.2895e+00 -3.9000e+02 -1.7714e+03 4.1597e+00 -3.9000e+02 -1.7429e+03 4.0240e+00 -3.9000e+02 -1.7143e+03 3.8819e+00 -3.9000e+02 -1.6857e+03 3.7331e+00 -3.9000e+02 -1.6571e+03 3.5771e+00 -3.9000e+02 -1.6286e+03 3.4133e+00 -3.9000e+02 -1.6000e+03 3.2412e+00 -3.9000e+02 -1.5714e+03 3.0601e+00 -3.9000e+02 -1.5429e+03 2.8694e+00 -3.9000e+02 -1.5143e+03 2.6682e+00 -3.9000e+02 -1.4857e+03 2.4556e+00 -3.9000e+02 -1.4571e+03 2.2308e+00 -3.9000e+02 -1.4286e+03 1.9927e+00 -3.9000e+02 -1.4000e+03 1.7400e+00 -3.9000e+02 -1.3714e+03 1.4715e+00 -3.9000e+02 -1.3429e+03 1.1856e+00 -3.9000e+02 -1.3143e+03 8.8070e-01 -3.9000e+02 -1.2857e+03 5.5486e-01 -3.9000e+02 -1.2571e+03 2.0595e-01 -3.9000e+02 -1.2286e+03 -1.6850e-01 -3.9000e+02 -1.2000e+03 -5.7126e-01 -3.9000e+02 -1.1714e+03 -1.0055e+00 -3.9000e+02 -1.1429e+03 -1.4750e+00 -3.9000e+02 -1.1143e+03 -1.9839e+00 -3.9000e+02 -1.0857e+03 -2.5372e+00 -3.9000e+02 -1.0571e+03 -3.1405e+00 -3.9000e+02 -1.0286e+03 -3.8007e+00 -3.9000e+02 -1.0000e+03 -4.5256e+00 -3.9000e+02 -9.7143e+02 -5.3245e+00 -3.9000e+02 -9.4286e+02 -6.2084e+00 -3.9000e+02 -9.1429e+02 -7.1905e+00 -3.9000e+02 -8.8571e+02 -8.2866e+00 -3.9000e+02 -8.5714e+02 -9.5155e+00 -3.9000e+02 -8.2857e+02 -1.0900e+01 -3.9000e+02 -8.0000e+02 -1.2467e+01 -3.9000e+02 -7.7143e+02 -1.4250e+01 -3.9000e+02 -7.4286e+02 -1.6289e+01 -3.9000e+02 -7.1429e+02 -1.8628e+01 -3.9000e+02 -6.8571e+02 -2.1322e+01 -3.9000e+02 -6.5714e+02 -2.4428e+01 -3.9000e+02 -6.2857e+02 -2.8009e+01 -3.9000e+02 -6.0000e+02 -3.2116e+01 -3.9000e+02 -5.7143e+02 -3.6781e+01 -3.9000e+02 -5.4286e+02 -4.1991e+01 -3.9000e+02 -5.1429e+02 -4.7669e+01 -3.9000e+02 -4.8571e+02 -5.3662e+01 -3.9000e+02 -4.5714e+02 -5.9750e+01 -3.9000e+02 -4.2857e+02 -6.5690e+01 -3.9000e+02 -4.0000e+02 -7.1268e+01 -3.9000e+02 -3.7143e+02 -7.6336e+01 -3.9000e+02 -3.4286e+02 -8.0822e+01 -3.9000e+02 -3.1429e+02 -8.4717e+01 -3.9000e+02 -2.8571e+02 -8.8054e+01 -3.9000e+02 -2.5714e+02 -9.0882e+01 -3.9000e+02 -2.2857e+02 -9.3258e+01 -3.9000e+02 -2.0000e+02 -9.5237e+01 -3.9000e+02 -1.7143e+02 -9.6865e+01 -3.9000e+02 -1.4286e+02 -9.8183e+01 -3.9000e+02 -1.1429e+02 -9.9222e+01 -3.9000e+02 -8.5714e+01 -1.0001e+02 -3.9000e+02 -5.7143e+01 -1.0055e+02 -3.9000e+02 -2.8571e+01 -1.0088e+02 -3.9000e+02 0.0000e+00 -1.0099e+02 -3.9000e+02 2.8571e+01 -1.0088e+02 -3.9000e+02 5.7143e+01 -1.0055e+02 -3.9000e+02 8.5714e+01 -1.0001e+02 -3.9000e+02 1.1429e+02 -9.9222e+01 -3.9000e+02 1.4286e+02 -9.8183e+01 -3.9000e+02 1.7143e+02 -9.6865e+01 -3.9000e+02 2.0000e+02 -9.5237e+01 -3.9000e+02 2.2857e+02 -9.3258e+01 -3.9000e+02 2.5714e+02 -9.0882e+01 -3.9000e+02 2.8571e+02 -8.8054e+01 -3.9000e+02 3.1429e+02 -8.4717e+01 -3.9000e+02 3.4286e+02 -8.0822e+01 -3.9000e+02 3.7143e+02 -7.6336e+01 -3.9000e+02 4.0000e+02 -7.1268e+01 -3.9000e+02 4.2857e+02 -6.5690e+01 -3.9000e+02 4.5714e+02 -5.9750e+01 -3.9000e+02 4.8571e+02 -5.3662e+01 -3.9000e+02 5.1429e+02 -4.7669e+01 -3.9000e+02 5.4286e+02 -4.1991e+01 -3.9000e+02 5.7143e+02 -3.6781e+01 -3.9000e+02 6.0000e+02 -3.2116e+01 -3.9000e+02 6.2857e+02 -2.8009e+01 -3.9000e+02 6.5714e+02 -2.4428e+01 -3.9000e+02 6.8571e+02 -2.1322e+01 -3.9000e+02 7.1429e+02 -1.8628e+01 -3.9000e+02 7.4286e+02 -1.6289e+01 -3.9000e+02 7.7143e+02 -1.4250e+01 -3.9000e+02 8.0000e+02 -1.2467e+01 -3.9000e+02 8.2857e+02 -1.0900e+01 -3.9000e+02 8.5714e+02 -9.5155e+00 -3.9000e+02 8.8571e+02 -8.2866e+00 -3.9000e+02 9.1429e+02 -7.1905e+00 -3.9000e+02 9.4286e+02 -6.2084e+00 -3.9000e+02 9.7143e+02 -5.3245e+00 -3.9000e+02 1.0000e+03 -4.5256e+00 -3.9000e+02 1.0286e+03 -3.8007e+00 -3.9000e+02 1.0571e+03 -3.1405e+00 -3.9000e+02 1.0857e+03 -2.5372e+00 -3.9000e+02 1.1143e+03 -1.9839e+00 -3.9000e+02 1.1429e+03 -1.4750e+00 -3.9000e+02 1.1714e+03 -1.0055e+00 -3.9000e+02 1.2000e+03 -5.7126e-01 -3.9000e+02 1.2286e+03 -1.6850e-01 -3.9000e+02 1.2571e+03 2.0595e-01 -3.9000e+02 1.2857e+03 5.5486e-01 -3.9000e+02 1.3143e+03 8.8070e-01 -3.9000e+02 1.3429e+03 1.1856e+00 -3.9000e+02 1.3714e+03 1.4715e+00 -3.9000e+02 1.4000e+03 1.7400e+00 -3.9000e+02 1.4286e+03 1.9927e+00 -3.9000e+02 1.4571e+03 2.2308e+00 -3.9000e+02 1.4857e+03 2.4556e+00 -3.9000e+02 1.5143e+03 2.6682e+00 -3.9000e+02 1.5429e+03 2.8694e+00 -3.9000e+02 1.5714e+03 3.0601e+00 -3.9000e+02 1.6000e+03 3.2412e+00 -3.9000e+02 1.6286e+03 3.4133e+00 -3.9000e+02 1.6571e+03 3.5771e+00 -3.9000e+02 1.6857e+03 3.7331e+00 -3.9000e+02 1.7143e+03 3.8819e+00 -3.9000e+02 1.7429e+03 4.0240e+00 -3.9000e+02 1.7714e+03 4.1597e+00 -3.9000e+02 1.8000e+03 4.2895e+00 -3.9000e+02 1.8286e+03 4.4138e+00 -3.9000e+02 1.8571e+03 4.5329e+00 -3.9000e+02 1.8857e+03 4.6472e+00 -3.9000e+02 1.9143e+03 4.7568e+00 -3.9000e+02 1.9429e+03 4.8622e+00 -3.9000e+02 1.9714e+03 4.9634e+00 -3.9000e+02 2.0000e+03 5.0608e+00 -4.2000e+02 -2.0000e+03 5.0810e+00 -4.2000e+02 -1.9714e+03 4.9847e+00 -4.2000e+02 -1.9429e+03 4.8846e+00 -4.2000e+02 -1.9143e+03 4.7805e+00 -4.2000e+02 -1.8857e+03 4.6723e+00 -4.2000e+02 -1.8571e+03 4.5595e+00 -4.2000e+02 -1.8286e+03 4.4419e+00 -4.2000e+02 -1.8000e+03 4.3193e+00 -4.2000e+02 -1.7714e+03 4.1913e+00 -4.2000e+02 -1.7429e+03 4.0576e+00 -4.2000e+02 -1.7143e+03 3.9177e+00 -4.2000e+02 -1.6857e+03 3.7712e+00 -4.2000e+02 -1.6571e+03 3.6178e+00 -4.2000e+02 -1.6286e+03 3.4568e+00 -4.2000e+02 -1.6000e+03 3.2877e+00 -4.2000e+02 -1.5714e+03 3.1100e+00 -4.2000e+02 -1.5429e+03 2.9228e+00 -4.2000e+02 -1.5143e+03 2.7256e+00 -4.2000e+02 -1.4857e+03 2.5175e+00 -4.2000e+02 -1.4571e+03 2.2976e+00 -4.2000e+02 -1.4286e+03 2.0648e+00 -4.2000e+02 -1.4000e+03 1.8181e+00 -4.2000e+02 -1.3714e+03 1.5563e+00 -4.2000e+02 -1.3429e+03 1.2778e+00 -4.2000e+02 -1.3143e+03 9.8120e-01 -4.2000e+02 -1.2857e+03 6.6468e-01 -4.2000e+02 -1.2571e+03 3.2625e-01 -4.2000e+02 -1.2286e+03 -3.6358e-02 -4.2000e+02 -1.2000e+03 -4.2570e-01 -4.2000e+02 -1.1714e+03 -8.4472e-01 -4.2000e+02 -1.1429e+03 -1.2968e+00 -4.2000e+02 -1.1143e+03 -1.7857e+00 -4.2000e+02 -1.0857e+03 -2.3160e+00 -4.2000e+02 -1.0571e+03 -2.8927e+00 -4.2000e+02 -1.0286e+03 -3.5220e+00 -4.2000e+02 -1.0000e+03 -4.2107e+00 -4.2000e+02 -9.7143e+02 -4.9672e+00 -4.2000e+02 -9.4286e+02 -5.8011e+00 -4.2000e+02 -9.1429e+02 -6.7238e+00 -4.2000e+02 -8.8571e+02 -7.7490e+00 -4.2000e+02 -8.5714e+02 -8.8928e+00 -4.2000e+02 -8.2857e+02 -1.0175e+01 -4.2000e+02 -8.0000e+02 -1.1617e+01 -4.2000e+02 -7.7143e+02 -1.3248e+01 -4.2000e+02 -7.4286e+02 -1.5101e+01 -4.2000e+02 -7.1429e+02 -1.7212e+01 -4.2000e+02 -6.8571e+02 -1.9627e+01 -4.2000e+02 -6.5714e+02 -2.2395e+01 -4.2000e+02 -6.2857e+02 -2.5567e+01 -4.2000e+02 -6.0000e+02 -2.9195e+01 -4.2000e+02 -5.7143e+02 -3.3316e+01 -4.2000e+02 -5.4286e+02 -3.7943e+01 -4.2000e+02 -5.1429e+02 -4.3044e+01 -4.2000e+02 -4.8571e+02 -4.8529e+01 -4.2000e+02 -4.5714e+02 -5.4242e+01 -4.2000e+02 -4.2857e+02 -5.9983e+01 -4.2000e+02 -4.0000e+02 -6.5542e+01 -4.2000e+02 -3.7143e+02 -7.0739e+01 -4.2000e+02 -3.4286e+02 -7.5455e+01 -4.2000e+02 -3.1429e+02 -7.9631e+01 -4.2000e+02 -2.8571e+02 -8.3261e+01 -4.2000e+02 -2.5714e+02 -8.6370e+01 -4.2000e+02 -2.2857e+02 -8.9001e+01 -4.2000e+02 -2.0000e+02 -9.1202e+01 -4.2000e+02 -1.7143e+02 -9.3017e+01 -4.2000e+02 -1.4286e+02 -9.4489e+01 -4.2000e+02 -1.1429e+02 -9.5649e+01 -4.2000e+02 -8.5714e+01 -9.6525e+01 -4.2000e+02 -5.7143e+01 -9.7137e+01 -4.2000e+02 -2.8571e+01 -9.7499e+01 -4.2000e+02 0.0000e+00 -9.7618e+01 -4.2000e+02 2.8571e+01 -9.7499e+01 -4.2000e+02 5.7143e+01 -9.7137e+01 -4.2000e+02 8.5714e+01 -9.6525e+01 -4.2000e+02 1.1429e+02 -9.5649e+01 -4.2000e+02 1.4286e+02 -9.4489e+01 -4.2000e+02 1.7143e+02 -9.3017e+01 -4.2000e+02 2.0000e+02 -9.1202e+01 -4.2000e+02 2.2857e+02 -8.9001e+01 -4.2000e+02 2.5714e+02 -8.6370e+01 -4.2000e+02 2.8571e+02 -8.3261e+01 -4.2000e+02 3.1429e+02 -7.9631e+01 -4.2000e+02 3.4286e+02 -7.5455e+01 -4.2000e+02 3.7143e+02 -7.0739e+01 -4.2000e+02 4.0000e+02 -6.5542e+01 -4.2000e+02 4.2857e+02 -5.9983e+01 -4.2000e+02 4.5714e+02 -5.4242e+01 -4.2000e+02 4.8571e+02 -4.8529e+01 -4.2000e+02 5.1429e+02 -4.3044e+01 -4.2000e+02 5.4286e+02 -3.7943e+01 -4.2000e+02 5.7143e+02 -3.3316e+01 -4.2000e+02 6.0000e+02 -2.9195e+01 -4.2000e+02 6.2857e+02 -2.5567e+01 -4.2000e+02 6.5714e+02 -2.2395e+01 -4.2000e+02 6.8571e+02 -1.9627e+01 -4.2000e+02 7.1429e+02 -1.7212e+01 -4.2000e+02 7.4286e+02 -1.5101e+01 -4.2000e+02 7.7143e+02 -1.3248e+01 -4.2000e+02 8.0000e+02 -1.1617e+01 -4.2000e+02 8.2857e+02 -1.0175e+01 -4.2000e+02 8.5714e+02 -8.8928e+00 -4.2000e+02 8.8571e+02 -7.7490e+00 -4.2000e+02 9.1429e+02 -6.7238e+00 -4.2000e+02 9.4286e+02 -5.8011e+00 -4.2000e+02 9.7143e+02 -4.9672e+00 -4.2000e+02 1.0000e+03 -4.2107e+00 -4.2000e+02 1.0286e+03 -3.5220e+00 -4.2000e+02 1.0571e+03 -2.8927e+00 -4.2000e+02 1.0857e+03 -2.3160e+00 -4.2000e+02 1.1143e+03 -1.7857e+00 -4.2000e+02 1.1429e+03 -1.2968e+00 -4.2000e+02 1.1714e+03 -8.4472e-01 -4.2000e+02 1.2000e+03 -4.2570e-01 -4.2000e+02 1.2286e+03 -3.6358e-02 -4.2000e+02 1.2571e+03 3.2625e-01 -4.2000e+02 1.2857e+03 6.6468e-01 -4.2000e+02 1.3143e+03 9.8120e-01 -4.2000e+02 1.3429e+03 1.2778e+00 -4.2000e+02 1.3714e+03 1.5563e+00 -4.2000e+02 1.4000e+03 1.8181e+00 -4.2000e+02 1.4286e+03 2.0648e+00 -4.2000e+02 1.4571e+03 2.2976e+00 -4.2000e+02 1.4857e+03 2.5175e+00 -4.2000e+02 1.5143e+03 2.7256e+00 -4.2000e+02 1.5429e+03 2.9228e+00 -4.2000e+02 1.5714e+03 3.1100e+00 -4.2000e+02 1.6000e+03 3.2877e+00 -4.2000e+02 1.6286e+03 3.4568e+00 -4.2000e+02 1.6571e+03 3.6178e+00 -4.2000e+02 1.6857e+03 3.7712e+00 -4.2000e+02 1.7143e+03 3.9177e+00 -4.2000e+02 1.7429e+03 4.0576e+00 -4.2000e+02 1.7714e+03 4.1913e+00 -4.2000e+02 1.8000e+03 4.3193e+00 -4.2000e+02 1.8286e+03 4.4419e+00 -4.2000e+02 1.8571e+03 4.5595e+00 -4.2000e+02 1.8857e+03 4.6723e+00 -4.2000e+02 1.9143e+03 4.7805e+00 -4.2000e+02 1.9429e+03 4.8846e+00 -4.2000e+02 1.9714e+03 4.9847e+00 -4.2000e+02 2.0000e+03 5.0810e+00 -4.5000e+02 -2.0000e+03 5.1025e+00 -4.5000e+02 -1.9714e+03 5.0073e+00 -4.5000e+02 -1.9429e+03 4.9085e+00 -4.5000e+02 -1.9143e+03 4.8057e+00 -4.5000e+02 -1.8857e+03 4.6988e+00 -4.5000e+02 -1.8571e+03 4.5876e+00 -4.5000e+02 -1.8286e+03 4.4717e+00 -4.5000e+02 -1.8000e+03 4.3509e+00 -4.5000e+02 -1.7714e+03 4.2248e+00 -4.5000e+02 -1.7429e+03 4.0931e+00 -4.5000e+02 -1.7143e+03 3.9555e+00 -4.5000e+02 -1.6857e+03 3.8115e+00 -4.5000e+02 -1.6571e+03 3.6607e+00 -4.5000e+02 -1.6286e+03 3.5026e+00 -4.5000e+02 -1.6000e+03 3.3367e+00 -4.5000e+02 -1.5714e+03 3.1624e+00 -4.5000e+02 -1.5429e+03 2.9791e+00 -4.5000e+02 -1.5143e+03 2.7861e+00 -4.5000e+02 -1.4857e+03 2.5825e+00 -4.5000e+02 -1.4571e+03 2.3676e+00 -4.5000e+02 -1.4286e+03 2.1405e+00 -4.5000e+02 -1.4000e+03 1.9000e+00 -4.5000e+02 -1.3714e+03 1.6449e+00 -4.5000e+02 -1.3429e+03 1.3741e+00 -4.5000e+02 -1.3143e+03 1.0861e+00 -4.5000e+02 -1.2857e+03 7.7908e-01 -4.5000e+02 -1.2571e+03 4.5137e-01 -4.5000e+02 -1.2286e+03 1.0084e-01 -4.5000e+02 -1.2000e+03 -2.7485e-01 -4.5000e+02 -1.1714e+03 -6.7838e-01 -4.5000e+02 -1.1429e+03 -1.1128e+00 -4.5000e+02 -1.1143e+03 -1.5816e+00 -4.5000e+02 -1.0857e+03 -2.0888e+00 -4.5000e+02 -1.0571e+03 -2.6389e+00 -4.5000e+02 -1.0286e+03 -3.2373e+00 -4.5000e+02 -1.0000e+03 -3.8903e+00 -4.5000e+02 -9.7143e+02 -4.6049e+00 -4.5000e+02 -9.4286e+02 -5.3897e+00 -4.5000e+02 -9.1429e+02 -6.2545e+00 -4.5000e+02 -8.8571e+02 -7.2109e+00 -4.5000e+02 -8.5714e+02 -8.2728e+00 -4.5000e+02 -8.2857e+02 -9.4562e+00 -4.5000e+02 -8.0000e+02 -1.0781e+01 -4.5000e+02 -7.7143e+02 -1.2268e+01 -4.5000e+02 -7.4286e+02 -1.3947e+01 -4.5000e+02 -7.1429e+02 -1.5846e+01 -4.5000e+02 -6.8571e+02 -1.8003e+01 -4.5000e+02 -6.5714e+02 -2.0459e+01 -4.5000e+02 -6.2857e+02 -2.3255e+01 -4.5000e+02 -6.0000e+02 -2.6437e+01 -4.5000e+02 -5.7143e+02 -3.0043e+01 -4.5000e+02 -5.4286e+02 -3.4096e+01 -4.5000e+02 -5.1429e+02 -3.8595e+01 -4.5000e+02 -4.8571e+02 -4.3494e+01 -4.5000e+02 -4.5714e+02 -4.8699e+01 -4.5000e+02 -4.2857e+02 -5.4067e+01 -4.5000e+02 -4.0000e+02 -5.9421e+01 -4.5000e+02 -3.7143e+02 -6.4582e+01 -4.5000e+02 -3.4286e+02 -6.9403e+01 -4.5000e+02 -3.1429e+02 -7.3780e+01 -4.5000e+02 -2.8571e+02 -7.7663e+01 -4.5000e+02 -2.5714e+02 -8.1042e+01 -4.5000e+02 -2.2857e+02 -8.3935e+01 -4.5000e+02 -2.0000e+02 -8.6375e+01 -4.5000e+02 -1.7143e+02 -8.8400e+01 -4.5000e+02 -1.4286e+02 -9.0046e+01 -4.5000e+02 -1.1429e+02 -9.1348e+01 -4.5000e+02 -8.5714e+01 -9.2333e+01 -4.5000e+02 -5.7143e+01 -9.3021e+01 -4.5000e+02 -2.8571e+01 -9.3428e+01 -4.5000e+02 0.0000e+00 -9.3563e+01 -4.5000e+02 2.8571e+01 -9.3428e+01 -4.5000e+02 5.7143e+01 -9.3021e+01 -4.5000e+02 8.5714e+01 -9.2333e+01 -4.5000e+02 1.1429e+02 -9.1348e+01 -4.5000e+02 1.4286e+02 -9.0046e+01 -4.5000e+02 1.7143e+02 -8.8400e+01 -4.5000e+02 2.0000e+02 -8.6375e+01 -4.5000e+02 2.2857e+02 -8.3935e+01 -4.5000e+02 2.5714e+02 -8.1042e+01 -4.5000e+02 2.8571e+02 -7.7663e+01 -4.5000e+02 3.1429e+02 -7.3780e+01 -4.5000e+02 3.4286e+02 -6.9403e+01 -4.5000e+02 3.7143e+02 -6.4582e+01 -4.5000e+02 4.0000e+02 -5.9421e+01 -4.5000e+02 4.2857e+02 -5.4067e+01 -4.5000e+02 4.5714e+02 -4.8699e+01 -4.5000e+02 4.8571e+02 -4.3494e+01 -4.5000e+02 5.1429e+02 -3.8595e+01 -4.5000e+02 5.4286e+02 -3.4096e+01 -4.5000e+02 5.7143e+02 -3.0043e+01 -4.5000e+02 6.0000e+02 -2.6437e+01 -4.5000e+02 6.2857e+02 -2.3255e+01 -4.5000e+02 6.5714e+02 -2.0459e+01 -4.5000e+02 6.8571e+02 -1.8003e+01 -4.5000e+02 7.1429e+02 -1.5846e+01 -4.5000e+02 7.4286e+02 -1.3947e+01 -4.5000e+02 7.7143e+02 -1.2268e+01 -4.5000e+02 8.0000e+02 -1.0781e+01 -4.5000e+02 8.2857e+02 -9.4562e+00 -4.5000e+02 8.5714e+02 -8.2728e+00 -4.5000e+02 8.8571e+02 -7.2109e+00 -4.5000e+02 9.1429e+02 -6.2545e+00 -4.5000e+02 9.4286e+02 -5.3897e+00 -4.5000e+02 9.7143e+02 -4.6049e+00 -4.5000e+02 1.0000e+03 -3.8903e+00 -4.5000e+02 1.0286e+03 -3.2373e+00 -4.5000e+02 1.0571e+03 -2.6389e+00 -4.5000e+02 1.0857e+03 -2.0888e+00 -4.5000e+02 1.1143e+03 -1.5816e+00 -4.5000e+02 1.1429e+03 -1.1128e+00 -4.5000e+02 1.1714e+03 -6.7838e-01 -4.5000e+02 1.2000e+03 -2.7485e-01 -4.5000e+02 1.2286e+03 1.0084e-01 -4.5000e+02 1.2571e+03 4.5137e-01 -4.5000e+02 1.2857e+03 7.7908e-01 -4.5000e+02 1.3143e+03 1.0861e+00 -4.5000e+02 1.3429e+03 1.3741e+00 -4.5000e+02 1.3714e+03 1.6449e+00 -4.5000e+02 1.4000e+03 1.9000e+00 -4.5000e+02 1.4286e+03 2.1405e+00 -4.5000e+02 1.4571e+03 2.3676e+00 -4.5000e+02 1.4857e+03 2.5825e+00 -4.5000e+02 1.5143e+03 2.7861e+00 -4.5000e+02 1.5429e+03 2.9791e+00 -4.5000e+02 1.5714e+03 3.1624e+00 -4.5000e+02 1.6000e+03 3.3367e+00 -4.5000e+02 1.6286e+03 3.5026e+00 -4.5000e+02 1.6571e+03 3.6607e+00 -4.5000e+02 1.6857e+03 3.8115e+00 -4.5000e+02 1.7143e+03 3.9555e+00 -4.5000e+02 1.7429e+03 4.0931e+00 -4.5000e+02 1.7714e+03 4.2248e+00 -4.5000e+02 1.8000e+03 4.3509e+00 -4.5000e+02 1.8286e+03 4.4717e+00 -4.5000e+02 1.8571e+03 4.5876e+00 -4.5000e+02 1.8857e+03 4.6988e+00 -4.5000e+02 1.9143e+03 4.8057e+00 -4.5000e+02 1.9429e+03 4.9085e+00 -4.5000e+02 1.9714e+03 5.0073e+00 -4.5000e+02 2.0000e+03 5.1025e+00 -4.8000e+02 -2.0000e+03 5.1251e+00 -4.8000e+02 -1.9714e+03 5.0312e+00 -4.8000e+02 -1.9429e+03 4.9336e+00 -4.8000e+02 -1.9143e+03 4.8322e+00 -4.8000e+02 -1.8857e+03 4.7269e+00 -4.8000e+02 -1.8571e+03 4.6172e+00 -4.8000e+02 -1.8286e+03 4.5030e+00 -4.8000e+02 -1.8000e+03 4.3841e+00 -4.8000e+02 -1.7714e+03 4.2600e+00 -4.8000e+02 -1.7429e+03 4.1305e+00 -4.8000e+02 -1.7143e+03 3.9952e+00 -4.8000e+02 -1.6857e+03 3.8538e+00 -4.8000e+02 -1.6571e+03 3.7058e+00 -4.8000e+02 -1.6286e+03 3.5507e+00 -4.8000e+02 -1.6000e+03 3.3881e+00 -4.8000e+02 -1.5714e+03 3.2174e+00 -4.8000e+02 -1.5429e+03 3.0380e+00 -4.8000e+02 -1.5143e+03 2.8492e+00 -4.8000e+02 -1.4857e+03 2.6504e+00 -4.8000e+02 -1.4571e+03 2.4407e+00 -4.8000e+02 -1.4286e+03 2.2193e+00 -4.8000e+02 -1.4000e+03 1.9851e+00 -4.8000e+02 -1.3714e+03 1.7371e+00 -4.8000e+02 -1.3429e+03 1.4741e+00 -4.8000e+02 -1.3143e+03 1.1948e+00 -4.8000e+02 -1.2857e+03 8.9750e-01 -4.8000e+02 -1.2571e+03 5.8067e-01 -4.8000e+02 -1.2286e+03 2.4238e-01 -4.8000e+02 -1.2000e+03 -1.1953e-01 -4.8000e+02 -1.1714e+03 -5.0747e-01 -4.8000e+02 -1.1429e+03 -9.2420e-01 -4.8000e+02 -1.1143e+03 -1.3729e+00 -4.8000e+02 -1.0857e+03 -1.8570e+00 -4.8000e+02 -1.0571e+03 -2.3807e+00 -4.8000e+02 -1.0286e+03 -2.9487e+00 -4.8000e+02 -1.0000e+03 -3.5665e+00 -4.8000e+02 -9.7143e+02 -4.2402e+00 -4.8000e+02 -9.4286e+02 -4.9771e+00 -4.8000e+02 -9.1429e+02 -5.7858e+00 -4.8000e+02 -8.8571e+02 -6.6762e+00 -4.8000e+02 -8.5714e+02 -7.6597e+00 -4.8000e+02 -8.2857e+02 -8.7500e+00 -4.8000e+02 -8.0000e+02 -9.9629e+00 -4.8000e+02 -7.7143e+02 -1.1317e+01 -4.8000e+02 -7.4286e+02 -1.2834e+01 -4.8000e+02 -7.1429e+02 -1.4539e+01 -4.8000e+02 -6.8571e+02 -1.6461e+01 -4.8000e+02 -6.5714e+02 -1.8632e+01 -4.8000e+02 -6.2857e+02 -2.1087e+01 -4.8000e+02 -6.0000e+02 -2.3864e+01 -4.8000e+02 -5.7143e+02 -2.6995e+01 -4.8000e+02 -5.4286e+02 -3.0509e+01 -4.8000e+02 -5.1429e+02 -3.4416e+01 -4.8000e+02 -4.8571e+02 -3.8702e+01 -4.8000e+02 -4.5714e+02 -4.3318e+01 -4.8000e+02 -4.2857e+02 -4.8174e+01 -4.8000e+02 -4.0000e+02 -5.3142e+01 -4.8000e+02 -3.7143e+02 -5.8072e+01 -4.8000e+02 -3.4286e+02 -6.2817e+01 -4.8000e+02 -3.1429e+02 -6.7250e+01 -4.8000e+02 -2.8571e+02 -7.1284e+01 -4.8000e+02 -2.5714e+02 -7.4870e+01 -4.8000e+02 -2.2857e+02 -7.7993e+01 -4.8000e+02 -2.0000e+02 -8.0662e+01 -4.8000e+02 -1.7143e+02 -8.2899e+01 -4.8000e+02 -1.4286e+02 -8.4731e+01 -4.8000e+02 -1.1429e+02 -8.6187e+01 -4.8000e+02 -8.5714e+01 -8.7292e+01 -4.8000e+02 -5.7143e+01 -8.8066e+01 -4.8000e+02 -2.8571e+01 -8.8525e+01 -4.8000e+02 0.0000e+00 -8.8677e+01 -4.8000e+02 2.8571e+01 -8.8525e+01 -4.8000e+02 5.7143e+01 -8.8066e+01 -4.8000e+02 8.5714e+01 -8.7292e+01 -4.8000e+02 1.1429e+02 -8.6187e+01 -4.8000e+02 1.4286e+02 -8.4731e+01 -4.8000e+02 1.7143e+02 -8.2899e+01 -4.8000e+02 2.0000e+02 -8.0662e+01 -4.8000e+02 2.2857e+02 -7.7993e+01 -4.8000e+02 2.5714e+02 -7.4870e+01 -4.8000e+02 2.8571e+02 -7.1284e+01 -4.8000e+02 3.1429e+02 -6.7250e+01 -4.8000e+02 3.4286e+02 -6.2817e+01 -4.8000e+02 3.7143e+02 -5.8072e+01 -4.8000e+02 4.0000e+02 -5.3142e+01 -4.8000e+02 4.2857e+02 -4.8174e+01 -4.8000e+02 4.5714e+02 -4.3318e+01 -4.8000e+02 4.8571e+02 -3.8702e+01 -4.8000e+02 5.1429e+02 -3.4416e+01 -4.8000e+02 5.4286e+02 -3.0509e+01 -4.8000e+02 5.7143e+02 -2.6995e+01 -4.8000e+02 6.0000e+02 -2.3864e+01 -4.8000e+02 6.2857e+02 -2.1087e+01 -4.8000e+02 6.5714e+02 -1.8632e+01 -4.8000e+02 6.8571e+02 -1.6461e+01 -4.8000e+02 7.1429e+02 -1.4539e+01 -4.8000e+02 7.4286e+02 -1.2834e+01 -4.8000e+02 7.7143e+02 -1.1317e+01 -4.8000e+02 8.0000e+02 -9.9629e+00 -4.8000e+02 8.2857e+02 -8.7500e+00 -4.8000e+02 8.5714e+02 -7.6597e+00 -4.8000e+02 8.8571e+02 -6.6762e+00 -4.8000e+02 9.1429e+02 -5.7858e+00 -4.8000e+02 9.4286e+02 -4.9771e+00 -4.8000e+02 9.7143e+02 -4.2402e+00 -4.8000e+02 1.0000e+03 -3.5665e+00 -4.8000e+02 1.0286e+03 -2.9487e+00 -4.8000e+02 1.0571e+03 -2.3807e+00 -4.8000e+02 1.0857e+03 -1.8570e+00 -4.8000e+02 1.1143e+03 -1.3729e+00 -4.8000e+02 1.1429e+03 -9.2420e-01 -4.8000e+02 1.1714e+03 -5.0747e-01 -4.8000e+02 1.2000e+03 -1.1953e-01 -4.8000e+02 1.2286e+03 2.4238e-01 -4.8000e+02 1.2571e+03 5.8067e-01 -4.8000e+02 1.2857e+03 8.9750e-01 -4.8000e+02 1.3143e+03 1.1948e+00 -4.8000e+02 1.3429e+03 1.4741e+00 -4.8000e+02 1.3714e+03 1.7371e+00 -4.8000e+02 1.4000e+03 1.9851e+00 -4.8000e+02 1.4286e+03 2.2193e+00 -4.8000e+02 1.4571e+03 2.4407e+00 -4.8000e+02 1.4857e+03 2.6504e+00 -4.8000e+02 1.5143e+03 2.8492e+00 -4.8000e+02 1.5429e+03 3.0380e+00 -4.8000e+02 1.5714e+03 3.2174e+00 -4.8000e+02 1.6000e+03 3.3881e+00 -4.8000e+02 1.6286e+03 3.5507e+00 -4.8000e+02 1.6571e+03 3.7058e+00 -4.8000e+02 1.6857e+03 3.8538e+00 -4.8000e+02 1.7143e+03 3.9952e+00 -4.8000e+02 1.7429e+03 4.1305e+00 -4.8000e+02 1.7714e+03 4.2600e+00 -4.8000e+02 1.8000e+03 4.3841e+00 -4.8000e+02 1.8286e+03 4.5030e+00 -4.8000e+02 1.8571e+03 4.6172e+00 -4.8000e+02 1.8857e+03 4.7269e+00 -4.8000e+02 1.9143e+03 4.8322e+00 -4.8000e+02 1.9429e+03 4.9336e+00 -4.8000e+02 1.9714e+03 5.0312e+00 -4.8000e+02 2.0000e+03 5.1251e+00 -5.1000e+02 -2.0000e+03 5.1489e+00 -5.1000e+02 -1.9714e+03 5.0562e+00 -5.1000e+02 -1.9429e+03 4.9600e+00 -5.1000e+02 -1.9143e+03 4.8601e+00 -5.1000e+02 -1.8857e+03 4.7563e+00 -5.1000e+02 -1.8571e+03 4.6483e+00 -5.1000e+02 -1.8286e+03 4.5359e+00 -5.1000e+02 -1.8000e+03 4.4189e+00 -5.1000e+02 -1.7714e+03 4.2969e+00 -5.1000e+02 -1.7429e+03 4.1696e+00 -5.1000e+02 -1.7143e+03 4.0368e+00 -5.1000e+02 -1.6857e+03 3.8980e+00 -5.1000e+02 -1.6571e+03 3.7528e+00 -5.1000e+02 -1.6286e+03 3.6008e+00 -5.1000e+02 -1.6000e+03 3.4416e+00 -5.1000e+02 -1.5714e+03 3.2746e+00 -5.1000e+02 -1.5429e+03 3.0992e+00 -5.1000e+02 -1.5143e+03 2.9149e+00 -5.1000e+02 -1.4857e+03 2.7209e+00 -5.1000e+02 -1.4571e+03 2.5166e+00 -5.1000e+02 -1.4286e+03 2.3010e+00 -5.1000e+02 -1.4000e+03 2.0733e+00 -5.1000e+02 -1.3714e+03 1.8324e+00 -5.1000e+02 -1.3429e+03 1.5774e+00 -5.1000e+02 -1.3143e+03 1.3068e+00 -5.1000e+02 -1.2857e+03 1.0194e+00 -5.1000e+02 -1.2571e+03 7.1354e-01 -5.1000e+02 -1.2286e+03 3.8755e-01 -5.1000e+02 -1.2000e+03 3.9469e-02 -5.1000e+02 -1.1714e+03 -3.3289e-01 -5.1000e+02 -1.1429e+03 -7.3199e-01 -5.1000e+02 -1.1143e+03 -1.1606e+00 -5.1000e+02 -1.0857e+03 -1.6220e+00 -5.1000e+02 -1.0571e+03 -2.1197e+00 -5.1000e+02 -1.0286e+03 -2.6578e+00 -5.1000e+02 -1.0000e+03 -3.2412e+00 -5.1000e+02 -9.7143e+02 -3.8751e+00 -5.1000e+02 -9.4286e+02 -4.5659e+00 -5.1000e+02 -9.1429e+02 -5.3208e+00 -5.1000e+02 -8.8571e+02 -6.1480e+00 -5.1000e+02 -8.5714e+02 -7.0573e+00 -5.1000e+02 -8.2857e+02 -8.0600e+00 -5.1000e+02 -8.0000e+02 -9.1688e+00 -5.1000e+02 -7.7143e+02 -1.0399e+01 -5.1000e+02 -7.4286e+02 -1.1768e+01 -5.1000e+02 -7.1429e+02 -1.3296e+01 -5.1000e+02 -6.8571e+02 -1.5005e+01 -5.1000e+02 -6.5714e+02 -1.6921e+01 -5.1000e+02 -6.2857e+02 -1.9071e+01 -5.1000e+02 -6.0000e+02 -2.1485e+01 -5.1000e+02 -5.7143e+02 -2.4191e+01 -5.1000e+02 -5.4286e+02 -2.7214e+01 -5.1000e+02 -5.1429e+02 -3.0569e+01 -5.1000e+02 -4.8571e+02 -3.4259e+01 -5.1000e+02 -4.5714e+02 -3.8261e+01 -5.1000e+02 -4.2857e+02 -4.2526e+01 -5.1000e+02 -4.0000e+02 -4.6973e+01 -5.1000e+02 -3.7143e+02 -5.1493e+01 -5.1000e+02 -3.4286e+02 -5.5963e+01 -5.1000e+02 -3.1429e+02 -6.0261e+01 -5.1000e+02 -2.8571e+02 -6.4282e+01 -5.1000e+02 -2.5714e+02 -6.7948e+01 -5.1000e+02 -2.2857e+02 -7.1211e+01 -5.1000e+02 -2.0000e+02 -7.4050e+01 -5.1000e+02 -1.7143e+02 -7.6465e+01 -5.1000e+02 -1.4286e+02 -7.8465e+01 -5.1000e+02 -1.1429e+02 -8.0068e+01 -5.1000e+02 -8.5714e+01 -8.1292e+01 -5.1000e+02 -5.7143e+01 -8.2153e+01 -5.1000e+02 -2.8571e+01 -8.2664e+01 -5.1000e+02 0.0000e+00 -8.2834e+01 -5.1000e+02 2.8571e+01 -8.2664e+01 -5.1000e+02 5.7143e+01 -8.2153e+01 -5.1000e+02 8.5714e+01 -8.1292e+01 -5.1000e+02 1.1429e+02 -8.0068e+01 -5.1000e+02 1.4286e+02 -7.8465e+01 -5.1000e+02 1.7143e+02 -7.6465e+01 -5.1000e+02 2.0000e+02 -7.4050e+01 -5.1000e+02 2.2857e+02 -7.1211e+01 -5.1000e+02 2.5714e+02 -6.7948e+01 -5.1000e+02 2.8571e+02 -6.4282e+01 -5.1000e+02 3.1429e+02 -6.0261e+01 -5.1000e+02 3.4286e+02 -5.5963e+01 -5.1000e+02 3.7143e+02 -5.1493e+01 -5.1000e+02 4.0000e+02 -4.6973e+01 -5.1000e+02 4.2857e+02 -4.2526e+01 -5.1000e+02 4.5714e+02 -3.8261e+01 -5.1000e+02 4.8571e+02 -3.4259e+01 -5.1000e+02 5.1429e+02 -3.0569e+01 -5.1000e+02 5.4286e+02 -2.7214e+01 -5.1000e+02 5.7143e+02 -2.4191e+01 -5.1000e+02 6.0000e+02 -2.1485e+01 -5.1000e+02 6.2857e+02 -1.9071e+01 -5.1000e+02 6.5714e+02 -1.6921e+01 -5.1000e+02 6.8571e+02 -1.5005e+01 -5.1000e+02 7.1429e+02 -1.3296e+01 -5.1000e+02 7.4286e+02 -1.1768e+01 -5.1000e+02 7.7143e+02 -1.0399e+01 -5.1000e+02 8.0000e+02 -9.1688e+00 -5.1000e+02 8.2857e+02 -8.0600e+00 -5.1000e+02 8.5714e+02 -7.0573e+00 -5.1000e+02 8.8571e+02 -6.1480e+00 -5.1000e+02 9.1429e+02 -5.3208e+00 -5.1000e+02 9.4286e+02 -4.5659e+00 -5.1000e+02 9.7143e+02 -3.8751e+00 -5.1000e+02 1.0000e+03 -3.2412e+00 -5.1000e+02 1.0286e+03 -2.6578e+00 -5.1000e+02 1.0571e+03 -2.1197e+00 -5.1000e+02 1.0857e+03 -1.6220e+00 -5.1000e+02 1.1143e+03 -1.1606e+00 -5.1000e+02 1.1429e+03 -7.3199e-01 -5.1000e+02 1.1714e+03 -3.3289e-01 -5.1000e+02 1.2000e+03 3.9469e-02 -5.1000e+02 1.2286e+03 3.8755e-01 -5.1000e+02 1.2571e+03 7.1354e-01 -5.1000e+02 1.2857e+03 1.0194e+00 -5.1000e+02 1.3143e+03 1.3068e+00 -5.1000e+02 1.3429e+03 1.5774e+00 -5.1000e+02 1.3714e+03 1.8324e+00 -5.1000e+02 1.4000e+03 2.0733e+00 -5.1000e+02 1.4286e+03 2.3010e+00 -5.1000e+02 1.4571e+03 2.5166e+00 -5.1000e+02 1.4857e+03 2.7209e+00 -5.1000e+02 1.5143e+03 2.9149e+00 -5.1000e+02 1.5429e+03 3.0992e+00 -5.1000e+02 1.5714e+03 3.2746e+00 -5.1000e+02 1.6000e+03 3.4416e+00 -5.1000e+02 1.6286e+03 3.6008e+00 -5.1000e+02 1.6571e+03 3.7528e+00 -5.1000e+02 1.6857e+03 3.8980e+00 -5.1000e+02 1.7143e+03 4.0368e+00 -5.1000e+02 1.7429e+03 4.1696e+00 -5.1000e+02 1.7714e+03 4.2969e+00 -5.1000e+02 1.8000e+03 4.4189e+00 -5.1000e+02 1.8286e+03 4.5359e+00 -5.1000e+02 1.8571e+03 4.6483e+00 -5.1000e+02 1.8857e+03 4.7563e+00 -5.1000e+02 1.9143e+03 4.8601e+00 -5.1000e+02 1.9429e+03 4.9600e+00 -5.1000e+02 1.9714e+03 5.0562e+00 -5.1000e+02 2.0000e+03 5.1489e+00 -5.4000e+02 -2.0000e+03 5.1739e+00 -5.4000e+02 -1.9714e+03 5.0824e+00 -5.4000e+02 -1.9429e+03 4.9876e+00 -5.4000e+02 -1.9143e+03 4.8892e+00 -5.4000e+02 -1.8857e+03 4.7870e+00 -5.4000e+02 -1.8571e+03 4.6807e+00 -5.4000e+02 -1.8286e+03 4.5702e+00 -5.4000e+02 -1.8000e+03 4.4551e+00 -5.4000e+02 -1.7714e+03 4.3353e+00 -5.4000e+02 -1.7429e+03 4.2104e+00 -5.4000e+02 -1.7143e+03 4.0800e+00 -5.4000e+02 -1.6857e+03 3.9439e+00 -5.4000e+02 -1.6571e+03 3.8017e+00 -5.4000e+02 -1.6286e+03 3.6529e+00 -5.4000e+02 -1.6000e+03 3.4971e+00 -5.4000e+02 -1.5714e+03 3.3339e+00 -5.4000e+02 -1.5429e+03 3.1627e+00 -5.4000e+02 -1.5143e+03 2.9828e+00 -5.4000e+02 -1.4857e+03 2.7938e+00 -5.4000e+02 -1.4571e+03 2.5948e+00 -5.4000e+02 -1.4286e+03 2.3852e+00 -5.4000e+02 -1.4000e+03 2.1641e+00 -5.4000e+02 -1.3714e+03 1.9305e+00 -5.4000e+02 -1.3429e+03 1.6834e+00 -5.4000e+02 -1.3143e+03 1.4218e+00 -5.4000e+02 -1.2857e+03 1.1442e+00 -5.4000e+02 -1.2571e+03 8.4936e-01 -5.4000e+02 -1.2286e+03 5.3567e-01 -5.4000e+02 -1.2000e+03 2.0138e-01 -5.4000e+02 -1.1714e+03 -1.5549e-01 -5.4000e+02 -1.1429e+03 -5.3713e-01 -5.4000e+02 -1.1143e+03 -9.4603e-01 -5.4000e+02 -1.0857e+03 -1.3850e+00 -5.4000e+02 -1.0571e+03 -1.8572e+00 -5.4000e+02 -1.0286e+03 -2.3662e+00 -5.4000e+02 -1.0000e+03 -2.9162e+00 -5.4000e+02 -9.7143e+02 -3.5117e+00 -5.4000e+02 -9.4286e+02 -4.1582e+00 -5.4000e+02 -9.1429e+02 -4.8617e+00 -5.4000e+02 -8.8571e+02 -5.6292e+00 -5.4000e+02 -8.5714e+02 -6.4686e+00 -5.4000e+02 -8.2857e+02 -7.3893e+00 -5.4000e+02 -8.0000e+02 -8.4017e+00 -5.4000e+02 -7.7143e+02 -9.5180e+00 -5.4000e+02 -7.4286e+02 -1.0752e+01 -5.4000e+02 -7.1429e+02 -1.2119e+01 -5.4000e+02 -6.8571e+02 -1.3637e+01 -5.4000e+02 -6.5714e+02 -1.5326e+01 -5.4000e+02 -6.2857e+02 -1.7207e+01 -5.4000e+02 -6.0000e+02 -1.9301e+01 -5.4000e+02 -5.7143e+02 -2.1632e+01 -5.4000e+02 -5.4286e+02 -2.4220e+01 -5.4000e+02 -5.1429e+02 -2.7081e+01 -5.4000e+02 -4.8571e+02 -3.0221e+01 -5.4000e+02 -4.5714e+02 -3.3633e+01 -5.4000e+02 -4.2857e+02 -3.7293e+01 -5.4000e+02 -4.0000e+02 -4.1153e+01 -5.4000e+02 -3.7143e+02 -4.5144e+01 -5.4000e+02 -3.4286e+02 -4.9175e+01 -5.4000e+02 -3.1429e+02 -5.3147e+01 -5.4000e+02 -2.8571e+02 -5.6961e+01 -5.4000e+02 -2.5714e+02 -6.0529e+01 -5.4000e+02 -2.2857e+02 -6.3784e+01 -5.4000e+02 -2.0000e+02 -6.6677e+01 -5.4000e+02 -1.7143e+02 -6.9182e+01 -5.4000e+02 -1.4286e+02 -7.1289e+01 -5.4000e+02 -1.1429e+02 -7.2998e+01 -5.4000e+02 -8.5714e+01 -7.4315e+01 -5.4000e+02 -5.7143e+01 -7.5247e+01 -5.4000e+02 -2.8571e+01 -7.5803e+01 -5.4000e+02 0.0000e+00 -7.5988e+01 -5.4000e+02 2.8571e+01 -7.5803e+01 -5.4000e+02 5.7143e+01 -7.5247e+01 -5.4000e+02 8.5714e+01 -7.4315e+01 -5.4000e+02 1.1429e+02 -7.2998e+01 -5.4000e+02 1.4286e+02 -7.1289e+01 -5.4000e+02 1.7143e+02 -6.9182e+01 -5.4000e+02 2.0000e+02 -6.6677e+01 -5.4000e+02 2.2857e+02 -6.3784e+01 -5.4000e+02 2.5714e+02 -6.0529e+01 -5.4000e+02 2.8571e+02 -5.6961e+01 -5.4000e+02 3.1429e+02 -5.3147e+01 -5.4000e+02 3.4286e+02 -4.9175e+01 -5.4000e+02 3.7143e+02 -4.5144e+01 -5.4000e+02 4.0000e+02 -4.1153e+01 -5.4000e+02 4.2857e+02 -3.7293e+01 -5.4000e+02 4.5714e+02 -3.3633e+01 -5.4000e+02 4.8571e+02 -3.0221e+01 -5.4000e+02 5.1429e+02 -2.7081e+01 -5.4000e+02 5.4286e+02 -2.4220e+01 -5.4000e+02 5.7143e+02 -2.1632e+01 -5.4000e+02 6.0000e+02 -1.9301e+01 -5.4000e+02 6.2857e+02 -1.7207e+01 -5.4000e+02 6.5714e+02 -1.5326e+01 -5.4000e+02 6.8571e+02 -1.3637e+01 -5.4000e+02 7.1429e+02 -1.2119e+01 -5.4000e+02 7.4286e+02 -1.0752e+01 -5.4000e+02 7.7143e+02 -9.5180e+00 -5.4000e+02 8.0000e+02 -8.4017e+00 -5.4000e+02 8.2857e+02 -7.3893e+00 -5.4000e+02 8.5714e+02 -6.4686e+00 -5.4000e+02 8.8571e+02 -5.6292e+00 -5.4000e+02 9.1429e+02 -4.8617e+00 -5.4000e+02 9.4286e+02 -4.1582e+00 -5.4000e+02 9.7143e+02 -3.5117e+00 -5.4000e+02 1.0000e+03 -2.9162e+00 -5.4000e+02 1.0286e+03 -2.3662e+00 -5.4000e+02 1.0571e+03 -1.8572e+00 -5.4000e+02 1.0857e+03 -1.3850e+00 -5.4000e+02 1.1143e+03 -9.4603e-01 -5.4000e+02 1.1429e+03 -5.3713e-01 -5.4000e+02 1.1714e+03 -1.5549e-01 -5.4000e+02 1.2000e+03 2.0138e-01 -5.4000e+02 1.2286e+03 5.3567e-01 -5.4000e+02 1.2571e+03 8.4936e-01 -5.4000e+02 1.2857e+03 1.1442e+00 -5.4000e+02 1.3143e+03 1.4218e+00 -5.4000e+02 1.3429e+03 1.6834e+00 -5.4000e+02 1.3714e+03 1.9305e+00 -5.4000e+02 1.4000e+03 2.1641e+00 -5.4000e+02 1.4286e+03 2.3852e+00 -5.4000e+02 1.4571e+03 2.5948e+00 -5.4000e+02 1.4857e+03 2.7938e+00 -5.4000e+02 1.5143e+03 2.9828e+00 -5.4000e+02 1.5429e+03 3.1627e+00 -5.4000e+02 1.5714e+03 3.3339e+00 -5.4000e+02 1.6000e+03 3.4971e+00 -5.4000e+02 1.6286e+03 3.6529e+00 -5.4000e+02 1.6571e+03 3.8017e+00 -5.4000e+02 1.6857e+03 3.9439e+00 -5.4000e+02 1.7143e+03 4.0800e+00 -5.4000e+02 1.7429e+03 4.2104e+00 -5.4000e+02 1.7714e+03 4.3353e+00 -5.4000e+02 1.8000e+03 4.4551e+00 -5.4000e+02 1.8286e+03 4.5702e+00 -5.4000e+02 1.8571e+03 4.6807e+00 -5.4000e+02 1.8857e+03 4.7870e+00 -5.4000e+02 1.9143e+03 4.8892e+00 -5.4000e+02 1.9429e+03 4.9876e+00 -5.4000e+02 1.9714e+03 5.0824e+00 -5.4000e+02 2.0000e+03 5.1739e+00 -5.7000e+02 -2.0000e+03 5.1998e+00 -5.7000e+02 -1.9714e+03 5.1098e+00 -5.7000e+02 -1.9429e+03 5.0164e+00 -5.7000e+02 -1.9143e+03 4.9195e+00 -5.7000e+02 -1.8857e+03 4.8189e+00 -5.7000e+02 -1.8571e+03 4.7144e+00 -5.7000e+02 -1.8286e+03 4.6058e+00 -5.7000e+02 -1.8000e+03 4.4928e+00 -5.7000e+02 -1.7714e+03 4.3752e+00 -5.7000e+02 -1.7429e+03 4.2526e+00 -5.7000e+02 -1.7143e+03 4.1248e+00 -5.7000e+02 -1.6857e+03 3.9915e+00 -5.7000e+02 -1.6571e+03 3.8523e+00 -5.7000e+02 -1.6286e+03 3.7067e+00 -5.7000e+02 -1.6000e+03 3.5545e+00 -5.7000e+02 -1.5714e+03 3.3951e+00 -5.7000e+02 -1.5429e+03 3.2281e+00 -5.7000e+02 -1.5143e+03 3.0528e+00 -5.7000e+02 -1.4857e+03 2.8688e+00 -5.7000e+02 -1.4571e+03 2.6753e+00 -5.7000e+02 -1.4286e+03 2.4717e+00 -5.7000e+02 -1.4000e+03 2.2572e+00 -5.7000e+02 -1.3714e+03 2.0309e+00 -5.7000e+02 -1.3429e+03 1.7919e+00 -5.7000e+02 -1.3143e+03 1.5391e+00 -5.7000e+02 -1.2857e+03 1.2714e+00 -5.7000e+02 -1.2571e+03 9.8756e-01 -5.7000e+02 -1.2286e+03 6.8611e-01 -5.7000e+02 -1.2000e+03 3.6548e-01 -5.7000e+02 -1.1714e+03 2.3931e-02 -5.7000e+02 -1.1429e+03 -3.4051e-01 -5.7000e+02 -1.1143e+03 -7.3003e-01 -5.7000e+02 -1.0857e+03 -1.1471e+00 -5.7000e+02 -1.0571e+03 -1.5945e+00 -5.7000e+02 -1.0286e+03 -2.0753e+00 -5.7000e+02 -1.0000e+03 -2.5931e+00 -5.7000e+02 -9.7143e+02 -3.1518e+00 -5.7000e+02 -9.4286e+02 -3.7560e+00 -5.7000e+02 -9.1429e+02 -4.4107e+00 -5.7000e+02 -8.8571e+02 -5.1218e+00 -5.7000e+02 -8.5714e+02 -5.8959e+00 -5.7000e+02 -8.2857e+02 -6.7404e+00 -5.7000e+02 -8.0000e+02 -7.6638e+00 -5.7000e+02 -7.7143e+02 -8.6758e+00 -5.7000e+02 -7.4286e+02 -9.7872e+00 -5.7000e+02 -7.1429e+02 -1.1010e+01 -5.7000e+02 -6.8571e+02 -1.2358e+01 -5.7000e+02 -6.5714e+02 -1.3846e+01 -5.7000e+02 -6.2857e+02 -1.5490e+01 -5.7000e+02 -6.0000e+02 -1.7306e+01 -5.7000e+02 -5.7143e+02 -1.9312e+01 -5.7000e+02 -5.4286e+02 -2.1523e+01 -5.7000e+02 -5.1429e+02 -2.3951e+01 -5.7000e+02 -4.8571e+02 -2.6604e+01 -5.7000e+02 -4.5714e+02 -2.9481e+01 -5.7000e+02 -4.2857e+02 -3.2571e+01 -5.7000e+02 -4.0000e+02 -3.5846e+01 -5.7000e+02 -3.7143e+02 -3.9263e+01 -5.7000e+02 -3.4286e+02 -4.2763e+01 -5.7000e+02 -3.1429e+02 -4.6274e+01 -5.7000e+02 -2.8571e+02 -4.9714e+01 -5.7000e+02 -2.5714e+02 -5.3006e+01 -5.7000e+02 -2.2857e+02 -5.6077e+01 -5.7000e+02 -2.0000e+02 -5.8867e+01 -5.7000e+02 -1.7143e+02 -6.1331e+01 -5.7000e+02 -1.4286e+02 -6.3439e+01 -5.7000e+02 -1.1429e+02 -6.5173e+01 -5.7000e+02 -8.5714e+01 -6.6524e+01 -5.7000e+02 -5.7143e+01 -6.7489e+01 -5.7000e+02 -2.8571e+01 -6.8067e+01 -5.7000e+02 0.0000e+00 -6.8260e+01 -5.7000e+02 2.8571e+01 -6.8067e+01 -5.7000e+02 5.7143e+01 -6.7489e+01 -5.7000e+02 8.5714e+01 -6.6524e+01 -5.7000e+02 1.1429e+02 -6.5173e+01 -5.7000e+02 1.4286e+02 -6.3439e+01 -5.7000e+02 1.7143e+02 -6.1331e+01 -5.7000e+02 2.0000e+02 -5.8867e+01 -5.7000e+02 2.2857e+02 -5.6077e+01 -5.7000e+02 2.5714e+02 -5.3006e+01 -5.7000e+02 2.8571e+02 -4.9714e+01 -5.7000e+02 3.1429e+02 -4.6274e+01 -5.7000e+02 3.4286e+02 -4.2763e+01 -5.7000e+02 3.7143e+02 -3.9263e+01 -5.7000e+02 4.0000e+02 -3.5846e+01 -5.7000e+02 4.2857e+02 -3.2571e+01 -5.7000e+02 4.5714e+02 -2.9481e+01 -5.7000e+02 4.8571e+02 -2.6604e+01 -5.7000e+02 5.1429e+02 -2.3951e+01 -5.7000e+02 5.4286e+02 -2.1523e+01 -5.7000e+02 5.7143e+02 -1.9312e+01 -5.7000e+02 6.0000e+02 -1.7306e+01 -5.7000e+02 6.2857e+02 -1.5490e+01 -5.7000e+02 6.5714e+02 -1.3846e+01 -5.7000e+02 6.8571e+02 -1.2358e+01 -5.7000e+02 7.1429e+02 -1.1010e+01 -5.7000e+02 7.4286e+02 -9.7872e+00 -5.7000e+02 7.7143e+02 -8.6758e+00 -5.7000e+02 8.0000e+02 -7.6638e+00 -5.7000e+02 8.2857e+02 -6.7404e+00 -5.7000e+02 8.5714e+02 -5.8959e+00 -5.7000e+02 8.8571e+02 -5.1218e+00 -5.7000e+02 9.1429e+02 -4.4107e+00 -5.7000e+02 9.4286e+02 -3.7560e+00 -5.7000e+02 9.7143e+02 -3.1518e+00 -5.7000e+02 1.0000e+03 -2.5931e+00 -5.7000e+02 1.0286e+03 -2.0753e+00 -5.7000e+02 1.0571e+03 -1.5945e+00 -5.7000e+02 1.0857e+03 -1.1471e+00 -5.7000e+02 1.1143e+03 -7.3003e-01 -5.7000e+02 1.1429e+03 -3.4051e-01 -5.7000e+02 1.1714e+03 2.3931e-02 -5.7000e+02 1.2000e+03 3.6548e-01 -5.7000e+02 1.2286e+03 6.8611e-01 -5.7000e+02 1.2571e+03 9.8756e-01 -5.7000e+02 1.2857e+03 1.2714e+00 -5.7000e+02 1.3143e+03 1.5391e+00 -5.7000e+02 1.3429e+03 1.7919e+00 -5.7000e+02 1.3714e+03 2.0309e+00 -5.7000e+02 1.4000e+03 2.2572e+00 -5.7000e+02 1.4286e+03 2.4717e+00 -5.7000e+02 1.4571e+03 2.6753e+00 -5.7000e+02 1.4857e+03 2.8688e+00 -5.7000e+02 1.5143e+03 3.0528e+00 -5.7000e+02 1.5429e+03 3.2281e+00 -5.7000e+02 1.5714e+03 3.3951e+00 -5.7000e+02 1.6000e+03 3.5545e+00 -5.7000e+02 1.6286e+03 3.7067e+00 -5.7000e+02 1.6571e+03 3.8523e+00 -5.7000e+02 1.6857e+03 3.9915e+00 -5.7000e+02 1.7143e+03 4.1248e+00 -5.7000e+02 1.7429e+03 4.2526e+00 -5.7000e+02 1.7714e+03 4.3752e+00 -5.7000e+02 1.8000e+03 4.4928e+00 -5.7000e+02 1.8286e+03 4.6058e+00 -5.7000e+02 1.8571e+03 4.7144e+00 -5.7000e+02 1.8857e+03 4.8189e+00 -5.7000e+02 1.9143e+03 4.9195e+00 -5.7000e+02 1.9429e+03 5.0164e+00 -5.7000e+02 1.9714e+03 5.1098e+00 -5.7000e+02 2.0000e+03 5.1998e+00 -6.0000e+02 -2.0000e+03 5.2268e+00 -6.0000e+02 -1.9714e+03 5.1381e+00 -6.0000e+02 -1.9429e+03 5.0462e+00 -6.0000e+02 -1.9143e+03 4.9509e+00 -6.0000e+02 -1.8857e+03 4.8520e+00 -6.0000e+02 -1.8571e+03 4.7493e+00 -6.0000e+02 -1.8286e+03 4.6427e+00 -6.0000e+02 -1.8000e+03 4.5318e+00 -6.0000e+02 -1.7714e+03 4.4164e+00 -6.0000e+02 -1.7429e+03 4.2962e+00 -6.0000e+02 -1.7143e+03 4.1711e+00 -6.0000e+02 -1.6857e+03 4.0406e+00 -6.0000e+02 -1.6571e+03 3.9044e+00 -6.0000e+02 -1.6286e+03 3.7622e+00 -6.0000e+02 -1.6000e+03 3.6136e+00 -6.0000e+02 -1.5714e+03 3.4581e+00 -6.0000e+02 -1.5429e+03 3.2953e+00 -6.0000e+02 -1.5143e+03 3.1247e+00 -6.0000e+02 -1.4857e+03 2.9457e+00 -6.0000e+02 -1.4571e+03 2.7578e+00 -6.0000e+02 -1.4286e+03 2.5602e+00 -6.0000e+02 -1.4000e+03 2.3523e+00 -6.0000e+02 -1.3714e+03 2.1333e+00 -6.0000e+02 -1.3429e+03 1.9023e+00 -6.0000e+02 -1.3143e+03 1.6584e+00 -6.0000e+02 -1.2857e+03 1.4006e+00 -6.0000e+02 -1.2571e+03 1.1276e+00 -6.0000e+02 -1.2286e+03 8.3825e-01 -6.0000e+02 -1.2000e+03 5.3111e-01 -6.0000e+02 -1.1714e+03 2.0462e-01 -6.0000e+02 -1.1429e+03 -1.4296e-01 -6.0000e+02 -1.1143e+03 -5.1355e-01 -6.0000e+02 -1.0857e+03 -9.0932e-01 -6.0000e+02 -1.0571e+03 -1.3327e+00 -6.0000e+02 -1.0286e+03 -1.7863e+00 -6.0000e+02 -1.0000e+03 -2.2732e+00 -6.0000e+02 -9.7143e+02 -2.7967e+00 -6.0000e+02 -9.4286e+02 -3.3607e+00 -6.0000e+02 -9.1429e+02 -3.9694e+00 -6.0000e+02 -8.8571e+02 -4.6277e+00 -6.0000e+02 -8.5714e+02 -5.3408e+00 -6.0000e+02 -8.2857e+02 -6.1149e+00 -6.0000e+02 -8.0000e+02 -6.9567e+00 -6.0000e+02 -7.7143e+02 -7.8737e+00 -6.0000e+02 -7.4286e+02 -8.8745e+00 -6.0000e+02 -7.1429e+02 -9.9684e+00 -6.0000e+02 -6.8571e+02 -1.1166e+01 -6.0000e+02 -6.5714e+02 -1.2477e+01 -6.0000e+02 -6.2857e+02 -1.3914e+01 -6.0000e+02 -6.0000e+02 -1.5490e+01 -6.0000e+02 -5.7143e+02 -1.7216e+01 -6.0000e+02 -5.4286e+02 -1.9103e+01 -6.0000e+02 -5.1429e+02 -2.1161e+01 -6.0000e+02 -4.8571e+02 -2.3395e+01 -6.0000e+02 -4.5714e+02 -2.5807e+01 -6.0000e+02 -4.2857e+02 -2.8389e+01 -6.0000e+02 -4.0000e+02 -3.1126e+01 -6.0000e+02 -3.7143e+02 -3.3991e+01 -6.0000e+02 -3.4286e+02 -3.6945e+01 -6.0000e+02 -3.1429e+02 -3.9937e+01 -6.0000e+02 -2.8571e+02 -4.2910e+01 -6.0000e+02 -2.5714e+02 -4.5800e+01 -6.0000e+02 -2.2857e+02 -4.8544e+01 -6.0000e+02 -2.0000e+02 -5.1081e+01 -6.0000e+02 -1.7143e+02 -5.3362e+01 -6.0000e+02 -1.4286e+02 -5.5346e+01 -6.0000e+02 -1.1429e+02 -5.7000e+01 -6.0000e+02 -8.5714e+01 -5.8304e+01 -6.0000e+02 -5.7143e+01 -5.9244e+01 -6.0000e+02 -2.8571e+01 -5.9811e+01 -6.0000e+02 0.0000e+00 -6.0000e+01 -6.0000e+02 2.8571e+01 -5.9811e+01 -6.0000e+02 5.7143e+01 -5.9244e+01 -6.0000e+02 8.5714e+01 -5.8304e+01 -6.0000e+02 1.1429e+02 -5.7000e+01 -6.0000e+02 1.4286e+02 -5.5346e+01 -6.0000e+02 1.7143e+02 -5.3362e+01 -6.0000e+02 2.0000e+02 -5.1081e+01 -6.0000e+02 2.2857e+02 -4.8544e+01 -6.0000e+02 2.5714e+02 -4.5800e+01 -6.0000e+02 2.8571e+02 -4.2910e+01 -6.0000e+02 3.1429e+02 -3.9937e+01 -6.0000e+02 3.4286e+02 -3.6945e+01 -6.0000e+02 3.7143e+02 -3.3991e+01 -6.0000e+02 4.0000e+02 -3.1126e+01 -6.0000e+02 4.2857e+02 -2.8389e+01 -6.0000e+02 4.5714e+02 -2.5807e+01 -6.0000e+02 4.8571e+02 -2.3395e+01 -6.0000e+02 5.1429e+02 -2.1161e+01 -6.0000e+02 5.4286e+02 -1.9103e+01 -6.0000e+02 5.7143e+02 -1.7216e+01 -6.0000e+02 6.0000e+02 -1.5490e+01 -6.0000e+02 6.2857e+02 -1.3914e+01 -6.0000e+02 6.5714e+02 -1.2477e+01 -6.0000e+02 6.8571e+02 -1.1166e+01 -6.0000e+02 7.1429e+02 -9.9684e+00 -6.0000e+02 7.4286e+02 -8.8745e+00 -6.0000e+02 7.7143e+02 -7.8737e+00 -6.0000e+02 8.0000e+02 -6.9567e+00 -6.0000e+02 8.2857e+02 -6.1149e+00 -6.0000e+02 8.5714e+02 -5.3408e+00 -6.0000e+02 8.8571e+02 -4.6277e+00 -6.0000e+02 9.1429e+02 -3.9694e+00 -6.0000e+02 9.4286e+02 -3.3607e+00 -6.0000e+02 9.7143e+02 -2.7967e+00 -6.0000e+02 1.0000e+03 -2.2732e+00 -6.0000e+02 1.0286e+03 -1.7863e+00 -6.0000e+02 1.0571e+03 -1.3327e+00 -6.0000e+02 1.0857e+03 -9.0932e-01 -6.0000e+02 1.1143e+03 -5.1355e-01 -6.0000e+02 1.1429e+03 -1.4296e-01 -6.0000e+02 1.1714e+03 2.0462e-01 -6.0000e+02 1.2000e+03 5.3111e-01 -6.0000e+02 1.2286e+03 8.3825e-01 -6.0000e+02 1.2571e+03 1.1276e+00 -6.0000e+02 1.2857e+03 1.4006e+00 -6.0000e+02 1.3143e+03 1.6584e+00 -6.0000e+02 1.3429e+03 1.9023e+00 -6.0000e+02 1.3714e+03 2.1333e+00 -6.0000e+02 1.4000e+03 2.3523e+00 -6.0000e+02 1.4286e+03 2.5602e+00 -6.0000e+02 1.4571e+03 2.7578e+00 -6.0000e+02 1.4857e+03 2.9457e+00 -6.0000e+02 1.5143e+03 3.1247e+00 -6.0000e+02 1.5429e+03 3.2953e+00 -6.0000e+02 1.5714e+03 3.4581e+00 -6.0000e+02 1.6000e+03 3.6136e+00 -6.0000e+02 1.6286e+03 3.7622e+00 -6.0000e+02 1.6571e+03 3.9044e+00 -6.0000e+02 1.6857e+03 4.0406e+00 -6.0000e+02 1.7143e+03 4.1711e+00 -6.0000e+02 1.7429e+03 4.2962e+00 -6.0000e+02 1.7714e+03 4.4164e+00 -6.0000e+02 1.8000e+03 4.5318e+00 -6.0000e+02 1.8286e+03 4.6427e+00 -6.0000e+02 1.8571e+03 4.7493e+00 -6.0000e+02 1.8857e+03 4.8520e+00 -6.0000e+02 1.9143e+03 4.9509e+00 -6.0000e+02 1.9429e+03 5.0462e+00 -6.0000e+02 1.9714e+03 5.1381e+00 -6.0000e+02 2.0000e+03 5.2268e+00 -6.3000e+02 -2.0000e+03 5.2547e+00 -6.3000e+02 -1.9714e+03 5.1674e+00 -6.3000e+02 -1.9429e+03 5.0770e+00 -6.3000e+02 -1.9143e+03 4.9834e+00 -6.3000e+02 -1.8857e+03 4.8862e+00 -6.3000e+02 -1.8571e+03 4.7854e+00 -6.3000e+02 -1.8286e+03 4.6807e+00 -6.3000e+02 -1.8000e+03 4.5719e+00 -6.3000e+02 -1.7714e+03 4.4588e+00 -6.3000e+02 -1.7429e+03 4.3412e+00 -6.3000e+02 -1.7143e+03 4.2187e+00 -6.3000e+02 -1.6857e+03 4.0911e+00 -6.3000e+02 -1.6571e+03 3.9580e+00 -6.3000e+02 -1.6286e+03 3.8192e+00 -6.3000e+02 -1.6000e+03 3.6742e+00 -6.3000e+02 -1.5714e+03 3.5226e+00 -6.3000e+02 -1.5429e+03 3.3641e+00 -6.3000e+02 -1.5143e+03 3.1981e+00 -6.3000e+02 -1.4857e+03 3.0242e+00 -6.3000e+02 -1.4571e+03 2.8418e+00 -6.3000e+02 -1.4286e+03 2.6503e+00 -6.3000e+02 -1.4000e+03 2.4491e+00 -6.3000e+02 -1.3714e+03 2.2374e+00 -6.3000e+02 -1.3429e+03 2.0144e+00 -6.3000e+02 -1.3143e+03 1.7793e+00 -6.3000e+02 -1.2857e+03 1.5312e+00 -6.3000e+02 -1.2571e+03 1.2690e+00 -6.3000e+02 -1.2286e+03 9.9155e-01 -6.3000e+02 -1.2000e+03 6.9765e-01 -6.3000e+02 -1.1714e+03 3.8590e-01 -6.3000e+02 -1.1429e+03 5.4774e-02 -6.3000e+02 -1.1143e+03 -2.9743e-01 -6.3000e+02 -1.0857e+03 -6.7257e-01 -6.3000e+02 -1.0571e+03 -1.0727e+00 -6.3000e+02 -1.0286e+03 -1.5002e+00 -6.3000e+02 -1.0000e+03 -1.9576e+00 -6.3000e+02 -9.7143e+02 -2.4477e+00 -6.3000e+02 -9.4286e+02 -2.9738e+00 -6.3000e+02 -9.1429e+02 -3.5392e+00 -6.3000e+02 -8.8571e+02 -4.1481e+00 -6.3000e+02 -8.5714e+02 -4.8047e+00 -6.3000e+02 -8.2857e+02 -5.5139e+00 -6.3000e+02 -8.0000e+02 -6.2810e+00 -6.3000e+02 -7.7143e+02 -7.1119e+00 -6.3000e+02 -7.4286e+02 -8.0132e+00 -6.3000e+02 -7.1429e+02 -8.9919e+00 -6.3000e+02 -6.8571e+02 -1.0056e+01 -6.3000e+02 -6.5714e+02 -1.1213e+01 -6.3000e+02 -6.2857e+02 -1.2471e+01 -6.3000e+02 -6.0000e+02 -1.3839e+01 -6.3000e+02 -5.7143e+02 -1.5326e+01 -6.3000e+02 -5.4286e+02 -1.6939e+01 -6.3000e+02 -5.1429e+02 -1.8684e+01 -6.3000e+02 -4.8571e+02 -2.0565e+01 -6.3000e+02 -4.5714e+02 -2.2581e+01 -6.3000e+02 -4.2857e+02 -2.4730e+01 -6.3000e+02 -4.0000e+02 -2.6998e+01 -6.3000e+02 -3.7143e+02 -2.9370e+01 -6.3000e+02 -3.4286e+02 -3.1817e+01 -6.3000e+02 -3.1429e+02 -3.4306e+01 -6.3000e+02 -2.8571e+02 -3.6795e+01 -6.3000e+02 -2.5714e+02 -3.9236e+01 -6.3000e+02 -2.2857e+02 -4.1579e+01 -6.3000e+02 -2.0000e+02 -4.3772e+01 -6.3000e+02 -1.7143e+02 -4.5769e+01 -6.3000e+02 -1.4286e+02 -4.7526e+01 -6.3000e+02 -1.1429e+02 -4.9009e+01 -6.3000e+02 -8.5714e+01 -5.0189e+01 -6.3000e+02 -5.7143e+01 -5.1047e+01 -6.3000e+02 -2.8571e+01 -5.1566e+01 -6.3000e+02 0.0000e+00 -5.1740e+01 -6.3000e+02 2.8571e+01 -5.1566e+01 -6.3000e+02 5.7143e+01 -5.1047e+01 -6.3000e+02 8.5714e+01 -5.0189e+01 -6.3000e+02 1.1429e+02 -4.9009e+01 -6.3000e+02 1.4286e+02 -4.7526e+01 -6.3000e+02 1.7143e+02 -4.5769e+01 -6.3000e+02 2.0000e+02 -4.3772e+01 -6.3000e+02 2.2857e+02 -4.1579e+01 -6.3000e+02 2.5714e+02 -3.9236e+01 -6.3000e+02 2.8571e+02 -3.6795e+01 -6.3000e+02 3.1429e+02 -3.4306e+01 -6.3000e+02 3.4286e+02 -3.1817e+01 -6.3000e+02 3.7143e+02 -2.9370e+01 -6.3000e+02 4.0000e+02 -2.6998e+01 -6.3000e+02 4.2857e+02 -2.4730e+01 -6.3000e+02 4.5714e+02 -2.2581e+01 -6.3000e+02 4.8571e+02 -2.0565e+01 -6.3000e+02 5.1429e+02 -1.8684e+01 -6.3000e+02 5.4286e+02 -1.6939e+01 -6.3000e+02 5.7143e+02 -1.5326e+01 -6.3000e+02 6.0000e+02 -1.3839e+01 -6.3000e+02 6.2857e+02 -1.2471e+01 -6.3000e+02 6.5714e+02 -1.1213e+01 -6.3000e+02 6.8571e+02 -1.0056e+01 -6.3000e+02 7.1429e+02 -8.9919e+00 -6.3000e+02 7.4286e+02 -8.0132e+00 -6.3000e+02 7.7143e+02 -7.1119e+00 -6.3000e+02 8.0000e+02 -6.2810e+00 -6.3000e+02 8.2857e+02 -5.5139e+00 -6.3000e+02 8.5714e+02 -4.8047e+00 -6.3000e+02 8.8571e+02 -4.1481e+00 -6.3000e+02 9.1429e+02 -3.5392e+00 -6.3000e+02 9.4286e+02 -2.9738e+00 -6.3000e+02 9.7143e+02 -2.4477e+00 -6.3000e+02 1.0000e+03 -1.9576e+00 -6.3000e+02 1.0286e+03 -1.5002e+00 -6.3000e+02 1.0571e+03 -1.0727e+00 -6.3000e+02 1.0857e+03 -6.7257e-01 -6.3000e+02 1.1143e+03 -2.9743e-01 -6.3000e+02 1.1429e+03 5.4774e-02 -6.3000e+02 1.1714e+03 3.8590e-01 -6.3000e+02 1.2000e+03 6.9765e-01 -6.3000e+02 1.2286e+03 9.9155e-01 -6.3000e+02 1.2571e+03 1.2690e+00 -6.3000e+02 1.2857e+03 1.5312e+00 -6.3000e+02 1.3143e+03 1.7793e+00 -6.3000e+02 1.3429e+03 2.0144e+00 -6.3000e+02 1.3714e+03 2.2374e+00 -6.3000e+02 1.4000e+03 2.4491e+00 -6.3000e+02 1.4286e+03 2.6503e+00 -6.3000e+02 1.4571e+03 2.8418e+00 -6.3000e+02 1.4857e+03 3.0242e+00 -6.3000e+02 1.5143e+03 3.1981e+00 -6.3000e+02 1.5429e+03 3.3641e+00 -6.3000e+02 1.5714e+03 3.5226e+00 -6.3000e+02 1.6000e+03 3.6742e+00 -6.3000e+02 1.6286e+03 3.8192e+00 -6.3000e+02 1.6571e+03 3.9580e+00 -6.3000e+02 1.6857e+03 4.0911e+00 -6.3000e+02 1.7143e+03 4.2187e+00 -6.3000e+02 1.7429e+03 4.3412e+00 -6.3000e+02 1.7714e+03 4.4588e+00 -6.3000e+02 1.8000e+03 4.5719e+00 -6.3000e+02 1.8286e+03 4.6807e+00 -6.3000e+02 1.8571e+03 4.7854e+00 -6.3000e+02 1.8857e+03 4.8862e+00 -6.3000e+02 1.9143e+03 4.9834e+00 -6.3000e+02 1.9429e+03 5.0770e+00 -6.3000e+02 1.9714e+03 5.1674e+00 -6.3000e+02 2.0000e+03 5.2547e+00 -6.6000e+02 -2.0000e+03 5.2835e+00 -6.6000e+02 -1.9714e+03 5.1977e+00 -6.6000e+02 -1.9429e+03 5.1088e+00 -6.6000e+02 -1.9143e+03 5.0168e+00 -6.6000e+02 -1.8857e+03 4.9214e+00 -6.6000e+02 -1.8571e+03 4.8225e+00 -6.6000e+02 -1.8286e+03 4.7198e+00 -6.6000e+02 -1.8000e+03 4.6132e+00 -6.6000e+02 -1.7714e+03 4.5025e+00 -6.6000e+02 -1.7429e+03 4.3873e+00 -6.6000e+02 -1.7143e+03 4.2675e+00 -6.6000e+02 -1.6857e+03 4.1428e+00 -6.6000e+02 -1.6571e+03 4.0129e+00 -6.6000e+02 -1.6286e+03 3.8774e+00 -6.6000e+02 -1.6000e+03 3.7361e+00 -6.6000e+02 -1.5714e+03 3.5885e+00 -6.6000e+02 -1.5429e+03 3.4343e+00 -6.6000e+02 -1.5143e+03 3.2730e+00 -6.6000e+02 -1.4857e+03 3.1042e+00 -6.6000e+02 -1.4571e+03 2.9273e+00 -6.6000e+02 -1.4286e+03 2.7419e+00 -6.6000e+02 -1.4000e+03 2.5472e+00 -6.6000e+02 -1.3714e+03 2.3427e+00 -6.6000e+02 -1.3429e+03 2.1277e+00 -6.6000e+02 -1.3143e+03 1.9013e+00 -6.6000e+02 -1.2857e+03 1.6628e+00 -6.6000e+02 -1.2571e+03 1.4112e+00 -6.6000e+02 -1.2286e+03 1.1455e+00 -6.6000e+02 -1.2000e+03 8.6453e-01 -6.6000e+02 -1.1714e+03 5.6715e-01 -6.6000e+02 -1.1429e+03 2.5201e-01 -6.6000e+02 -1.1143e+03 -8.2383e-02 -6.6000e+02 -1.0857e+03 -4.3764e-01 -6.6000e+02 -1.0571e+03 -8.1554e-01 -6.6000e+02 -1.0286e+03 -1.2181e+00 -6.6000e+02 -1.0000e+03 -1.6473e+00 -6.6000e+02 -9.7143e+02 -2.1058e+00 -6.6000e+02 -9.4286e+02 -2.5961e+00 -6.6000e+02 -9.1429e+02 -3.1211e+00 -6.6000e+02 -8.8571e+02 -3.6840e+00 -6.6000e+02 -8.5714e+02 -4.2883e+00 -6.6000e+02 -8.2857e+02 -4.9379e+00 -6.6000e+02 -8.0000e+02 -5.6369e+00 -6.6000e+02 -7.7143e+02 -6.3900e+00 -6.6000e+02 -7.4286e+02 -7.2021e+00 -6.6000e+02 -7.1429e+02 -8.0784e+00 -6.6000e+02 -6.8571e+02 -9.0245e+00 -6.6000e+02 -6.5714e+02 -1.0046e+01 -6.6000e+02 -6.2857e+02 -1.1150e+01 -6.6000e+02 -6.0000e+02 -1.2340e+01 -6.6000e+02 -5.7143e+02 -1.3624e+01 -6.6000e+02 -5.4286e+02 -1.5005e+01 -6.6000e+02 -5.1429e+02 -1.6488e+01 -6.6000e+02 -4.8571e+02 -1.8073e+01 -6.6000e+02 -4.5714e+02 -1.9761e+01 -6.6000e+02 -4.2857e+02 -2.1547e+01 -6.6000e+02 -4.0000e+02 -2.3422e+01 -6.6000e+02 -3.7143e+02 -2.5374e+01 -6.6000e+02 -3.4286e+02 -2.7383e+01 -6.6000e+02 -3.1429e+02 -2.9425e+01 -6.6000e+02 -2.8571e+02 -3.1468e+01 -6.6000e+02 -2.5714e+02 -3.3479e+01 -6.6000e+02 -2.2857e+02 -3.5417e+01 -6.6000e+02 -2.0000e+02 -3.7243e+01 -6.6000e+02 -1.7143e+02 -3.8917e+01 -6.6000e+02 -1.4286e+02 -4.0401e+01 -6.6000e+02 -1.1429e+02 -4.1663e+01 -6.6000e+02 -8.5714e+01 -4.2674e+01 -6.6000e+02 -5.7143e+01 -4.3412e+01 -6.6000e+02 -2.8571e+01 -4.3861e+01 -6.6000e+02 0.0000e+00 -4.4012e+01 -6.6000e+02 2.8571e+01 -4.3861e+01 -6.6000e+02 5.7143e+01 -4.3412e+01 -6.6000e+02 8.5714e+01 -4.2674e+01 -6.6000e+02 1.1429e+02 -4.1663e+01 -6.6000e+02 1.4286e+02 -4.0401e+01 -6.6000e+02 1.7143e+02 -3.8917e+01 -6.6000e+02 2.0000e+02 -3.7243e+01 -6.6000e+02 2.2857e+02 -3.5417e+01 -6.6000e+02 2.5714e+02 -3.3479e+01 -6.6000e+02 2.8571e+02 -3.1468e+01 -6.6000e+02 3.1429e+02 -2.9425e+01 -6.6000e+02 3.4286e+02 -2.7383e+01 -6.6000e+02 3.7143e+02 -2.5374e+01 -6.6000e+02 4.0000e+02 -2.3422e+01 -6.6000e+02 4.2857e+02 -2.1547e+01 -6.6000e+02 4.5714e+02 -1.9761e+01 -6.6000e+02 4.8571e+02 -1.8073e+01 -6.6000e+02 5.1429e+02 -1.6488e+01 -6.6000e+02 5.4286e+02 -1.5005e+01 -6.6000e+02 5.7143e+02 -1.3624e+01 -6.6000e+02 6.0000e+02 -1.2340e+01 -6.6000e+02 6.2857e+02 -1.1150e+01 -6.6000e+02 6.5714e+02 -1.0046e+01 -6.6000e+02 6.8571e+02 -9.0245e+00 -6.6000e+02 7.1429e+02 -8.0784e+00 -6.6000e+02 7.4286e+02 -7.2021e+00 -6.6000e+02 7.7143e+02 -6.3900e+00 -6.6000e+02 8.0000e+02 -5.6369e+00 -6.6000e+02 8.2857e+02 -4.9379e+00 -6.6000e+02 8.5714e+02 -4.2883e+00 -6.6000e+02 8.8571e+02 -3.6840e+00 -6.6000e+02 9.1429e+02 -3.1211e+00 -6.6000e+02 9.4286e+02 -2.5961e+00 -6.6000e+02 9.7143e+02 -2.1058e+00 -6.6000e+02 1.0000e+03 -1.6473e+00 -6.6000e+02 1.0286e+03 -1.2181e+00 -6.6000e+02 1.0571e+03 -8.1554e-01 -6.6000e+02 1.0857e+03 -4.3764e-01 -6.6000e+02 1.1143e+03 -8.2383e-02 -6.6000e+02 1.1429e+03 2.5201e-01 -6.6000e+02 1.1714e+03 5.6715e-01 -6.6000e+02 1.2000e+03 8.6453e-01 -6.6000e+02 1.2286e+03 1.1455e+00 -6.6000e+02 1.2571e+03 1.4112e+00 -6.6000e+02 1.2857e+03 1.6628e+00 -6.6000e+02 1.3143e+03 1.9013e+00 -6.6000e+02 1.3429e+03 2.1277e+00 -6.6000e+02 1.3714e+03 2.3427e+00 -6.6000e+02 1.4000e+03 2.5472e+00 -6.6000e+02 1.4286e+03 2.7419e+00 -6.6000e+02 1.4571e+03 2.9273e+00 -6.6000e+02 1.4857e+03 3.1042e+00 -6.6000e+02 1.5143e+03 3.2730e+00 -6.6000e+02 1.5429e+03 3.4343e+00 -6.6000e+02 1.5714e+03 3.5885e+00 -6.6000e+02 1.6000e+03 3.7361e+00 -6.6000e+02 1.6286e+03 3.8774e+00 -6.6000e+02 1.6571e+03 4.0129e+00 -6.6000e+02 1.6857e+03 4.1428e+00 -6.6000e+02 1.7143e+03 4.2675e+00 -6.6000e+02 1.7429e+03 4.3873e+00 -6.6000e+02 1.7714e+03 4.5025e+00 -6.6000e+02 1.8000e+03 4.6132e+00 -6.6000e+02 1.8286e+03 4.7198e+00 -6.6000e+02 1.8571e+03 4.8225e+00 -6.6000e+02 1.8857e+03 4.9214e+00 -6.6000e+02 1.9143e+03 5.0168e+00 -6.6000e+02 1.9429e+03 5.1088e+00 -6.6000e+02 1.9714e+03 5.1977e+00 -6.6000e+02 2.0000e+03 5.2835e+00 -6.9000e+02 -2.0000e+03 5.3131e+00 -6.9000e+02 -1.9714e+03 5.2288e+00 -6.9000e+02 -1.9429e+03 5.1415e+00 -6.9000e+02 -1.9143e+03 5.0512e+00 -6.9000e+02 -1.8857e+03 4.9576e+00 -6.9000e+02 -1.8571e+03 4.8606e+00 -6.9000e+02 -1.8286e+03 4.7600e+00 -6.9000e+02 -1.8000e+03 4.6556e+00 -6.9000e+02 -1.7714e+03 4.5472e+00 -6.9000e+02 -1.7429e+03 4.4345e+00 -6.9000e+02 -1.7143e+03 4.3175e+00 -6.9000e+02 -1.6857e+03 4.1957e+00 -6.9000e+02 -1.6571e+03 4.0689e+00 -6.9000e+02 -1.6286e+03 3.9368e+00 -6.9000e+02 -1.6000e+03 3.7992e+00 -6.9000e+02 -1.5714e+03 3.6556e+00 -6.9000e+02 -1.5429e+03 3.5057e+00 -6.9000e+02 -1.5143e+03 3.3491e+00 -6.9000e+02 -1.4857e+03 3.1853e+00 -6.9000e+02 -1.4571e+03 3.0140e+00 -6.9000e+02 -1.4286e+03 2.8345e+00 -6.9000e+02 -1.4000e+03 2.6464e+00 -6.9000e+02 -1.3714e+03 2.4491e+00 -6.9000e+02 -1.3429e+03 2.2419e+00 -6.9000e+02 -1.3143e+03 2.0242e+00 -6.9000e+02 -1.2857e+03 1.7951e+00 -6.9000e+02 -1.2571e+03 1.5538e+00 -6.9000e+02 -1.2286e+03 1.2995e+00 -6.9000e+02 -1.2000e+03 1.0312e+00 -6.9000e+02 -1.1714e+03 7.4781e-01 -6.9000e+02 -1.1429e+03 4.4813e-01 -6.9000e+02 -1.1143e+03 1.3092e-01 -6.9000e+02 -1.0857e+03 -2.0522e-01 -6.9000e+02 -1.0571e+03 -5.6181e-01 -6.9000e+02 -1.0286e+03 -9.4053e-01 -6.9000e+02 -1.0000e+03 -1.3432e+00 -6.9000e+02 -9.7143e+02 -1.7718e+00 -6.9000e+02 -9.4286e+02 -2.2285e+00 -6.9000e+02 -9.1429e+02 -2.7157e+00 -6.9000e+02 -8.8571e+02 -3.2360e+00 -6.9000e+02 -8.5714e+02 -3.7921e+00 -6.9000e+02 -8.2857e+02 -4.3871e+00 -6.9000e+02 -8.0000e+02 -5.0243e+00 -6.9000e+02 -7.7143e+02 -5.7071e+00 -6.9000e+02 -7.4286e+02 -6.4392e+00 -6.9000e+02 -7.1429e+02 -7.2246e+00 -6.9000e+02 -6.8571e+02 -8.0672e+00 -6.9000e+02 -6.5714e+02 -8.9712e+00 -6.9000e+02 -6.2857e+02 -9.9405e+00 -6.9000e+02 -6.0000e+02 -1.0979e+01 -6.9000e+02 -5.7143e+02 -1.2090e+01 -6.9000e+02 -5.4286e+02 -1.3276e+01 -6.9000e+02 -5.1429e+02 -1.4540e+01 -6.9000e+02 -4.8571e+02 -1.5880e+01 -6.9000e+02 -4.5714e+02 -1.7296e+01 -6.9000e+02 -4.2857e+02 -1.8784e+01 -6.9000e+02 -4.0000e+02 -2.0336e+01 -6.9000e+02 -3.7143e+02 -2.1942e+01 -6.9000e+02 -3.4286e+02 -2.3586e+01 -6.9000e+02 -3.1429e+02 -2.5251e+01 -6.9000e+02 -2.8571e+02 -2.6914e+01 -6.9000e+02 -2.5714e+02 -2.8548e+01 -6.9000e+02 -2.2857e+02 -3.0123e+01 -6.9000e+02 -2.0000e+02 -3.1610e+01 -6.9000e+02 -1.7143e+02 -3.2976e+01 -6.9000e+02 -1.4286e+02 -3.4191e+01 -6.9000e+02 -1.1429e+02 -3.5227e+01 -6.9000e+02 -8.5714e+01 -3.6060e+01 -6.9000e+02 -5.7143e+01 -3.6670e+01 -6.9000e+02 -2.8571e+01 -3.7041e+01 -6.9000e+02 0.0000e+00 -3.7166e+01 -6.9000e+02 2.8571e+01 -3.7041e+01 -6.9000e+02 5.7143e+01 -3.6670e+01 -6.9000e+02 8.5714e+01 -3.6060e+01 -6.9000e+02 1.1429e+02 -3.5227e+01 -6.9000e+02 1.4286e+02 -3.4191e+01 -6.9000e+02 1.7143e+02 -3.2976e+01 -6.9000e+02 2.0000e+02 -3.1610e+01 -6.9000e+02 2.2857e+02 -3.0123e+01 -6.9000e+02 2.5714e+02 -2.8548e+01 -6.9000e+02 2.8571e+02 -2.6914e+01 -6.9000e+02 3.1429e+02 -2.5251e+01 -6.9000e+02 3.4286e+02 -2.3586e+01 -6.9000e+02 3.7143e+02 -2.1942e+01 -6.9000e+02 4.0000e+02 -2.0336e+01 -6.9000e+02 4.2857e+02 -1.8784e+01 -6.9000e+02 4.5714e+02 -1.7296e+01 -6.9000e+02 4.8571e+02 -1.5880e+01 -6.9000e+02 5.1429e+02 -1.4540e+01 -6.9000e+02 5.4286e+02 -1.3276e+01 -6.9000e+02 5.7143e+02 -1.2090e+01 -6.9000e+02 6.0000e+02 -1.0979e+01 -6.9000e+02 6.2857e+02 -9.9405e+00 -6.9000e+02 6.5714e+02 -8.9712e+00 -6.9000e+02 6.8571e+02 -8.0672e+00 -6.9000e+02 7.1429e+02 -7.2246e+00 -6.9000e+02 7.4286e+02 -6.4392e+00 -6.9000e+02 7.7143e+02 -5.7071e+00 -6.9000e+02 8.0000e+02 -5.0243e+00 -6.9000e+02 8.2857e+02 -4.3871e+00 -6.9000e+02 8.5714e+02 -3.7921e+00 -6.9000e+02 8.8571e+02 -3.2360e+00 -6.9000e+02 9.1429e+02 -2.7157e+00 -6.9000e+02 9.4286e+02 -2.2285e+00 -6.9000e+02 9.7143e+02 -1.7718e+00 -6.9000e+02 1.0000e+03 -1.3432e+00 -6.9000e+02 1.0286e+03 -9.4053e-01 -6.9000e+02 1.0571e+03 -5.6181e-01 -6.9000e+02 1.0857e+03 -2.0522e-01 -6.9000e+02 1.1143e+03 1.3092e-01 -6.9000e+02 1.1429e+03 4.4813e-01 -6.9000e+02 1.1714e+03 7.4781e-01 -6.9000e+02 1.2000e+03 1.0312e+00 -6.9000e+02 1.2286e+03 1.2995e+00 -6.9000e+02 1.2571e+03 1.5538e+00 -6.9000e+02 1.2857e+03 1.7951e+00 -6.9000e+02 1.3143e+03 2.0242e+00 -6.9000e+02 1.3429e+03 2.2419e+00 -6.9000e+02 1.3714e+03 2.4491e+00 -6.9000e+02 1.4000e+03 2.6464e+00 -6.9000e+02 1.4286e+03 2.8345e+00 -6.9000e+02 1.4571e+03 3.0140e+00 -6.9000e+02 1.4857e+03 3.1853e+00 -6.9000e+02 1.5143e+03 3.3491e+00 -6.9000e+02 1.5429e+03 3.5057e+00 -6.9000e+02 1.5714e+03 3.6556e+00 -6.9000e+02 1.6000e+03 3.7992e+00 -6.9000e+02 1.6286e+03 3.9368e+00 -6.9000e+02 1.6571e+03 4.0689e+00 -6.9000e+02 1.6857e+03 4.1957e+00 -6.9000e+02 1.7143e+03 4.3175e+00 -6.9000e+02 1.7429e+03 4.4345e+00 -6.9000e+02 1.7714e+03 4.5472e+00 -6.9000e+02 1.8000e+03 4.6556e+00 -6.9000e+02 1.8286e+03 4.7600e+00 -6.9000e+02 1.8571e+03 4.8606e+00 -6.9000e+02 1.8857e+03 4.9576e+00 -6.9000e+02 1.9143e+03 5.0512e+00 -6.9000e+02 1.9429e+03 5.1415e+00 -6.9000e+02 1.9714e+03 5.2288e+00 -6.9000e+02 2.0000e+03 5.3131e+00 -7.2000e+02 -2.0000e+03 5.3435e+00 -7.2000e+02 -1.9714e+03 5.2607e+00 -7.2000e+02 -1.9429e+03 5.1750e+00 -7.2000e+02 -1.9143e+03 5.0864e+00 -7.2000e+02 -1.8857e+03 4.9946e+00 -7.2000e+02 -1.8571e+03 4.8995e+00 -7.2000e+02 -1.8286e+03 4.8010e+00 -7.2000e+02 -1.8000e+03 4.6988e+00 -7.2000e+02 -1.7714e+03 4.5928e+00 -7.2000e+02 -1.7429e+03 4.4827e+00 -7.2000e+02 -1.7143e+03 4.3684e+00 -7.2000e+02 -1.6857e+03 4.2496e+00 -7.2000e+02 -1.6571e+03 4.1259e+00 -7.2000e+02 -1.6286e+03 3.9973e+00 -7.2000e+02 -1.6000e+03 3.8633e+00 -7.2000e+02 -1.5714e+03 3.7237e+00 -7.2000e+02 -1.5429e+03 3.5781e+00 -7.2000e+02 -1.5143e+03 3.4261e+00 -7.2000e+02 -1.4857e+03 3.2674e+00 -7.2000e+02 -1.4571e+03 3.1016e+00 -7.2000e+02 -1.4286e+03 2.9281e+00 -7.2000e+02 -1.4000e+03 2.7465e+00 -7.2000e+02 -1.3714e+03 2.5562e+00 -7.2000e+02 -1.3429e+03 2.3567e+00 -7.2000e+02 -1.3143e+03 2.1474e+00 -7.2000e+02 -1.2857e+03 1.9276e+00 -7.2000e+02 -1.2571e+03 1.6965e+00 -7.2000e+02 -1.2286e+03 1.4533e+00 -7.2000e+02 -1.2000e+03 1.1973e+00 -7.2000e+02 -1.1714e+03 9.2737e-01 -7.2000e+02 -1.1429e+03 6.4262e-01 -7.2000e+02 -1.1143e+03 3.4193e-01 -7.2000e+02 -1.0857e+03 2.4092e-02 -7.2000e+02 -1.0571e+03 -3.1218e-01 -7.2000e+02 -1.0286e+03 -6.6830e-01 -7.2000e+02 -1.0000e+03 -1.0458e+00 -7.2000e+02 -9.7143e+02 -1.4463e+00 -7.2000e+02 -9.4286e+02 -1.8716e+00 -7.2000e+02 -9.1429e+02 -2.3236e+00 -7.2000e+02 -8.8571e+02 -2.8044e+00 -7.2000e+02 -8.5714e+02 -3.3162e+00 -7.2000e+02 -8.2857e+02 -3.8613e+00 -7.2000e+02 -8.0000e+02 -4.4424e+00 -7.2000e+02 -7.7143e+02 -5.0618e+00 -7.2000e+02 -7.4286e+02 -5.7226e+00 -7.2000e+02 -7.1429e+02 -6.4273e+00 -7.2000e+02 -6.8571e+02 -7.1789e+00 -7.2000e+02 -6.5714e+02 -7.9801e+00 -7.2000e+02 -6.2857e+02 -8.8336e+00 -7.2000e+02 -6.0000e+02 -9.7417e+00 -7.2000e+02 -5.7143e+02 -1.0706e+01 -7.2000e+02 -5.4286e+02 -1.1729e+01 -7.2000e+02 -5.1429e+02 -1.2809e+01 -7.2000e+02 -4.8571e+02 -1.3947e+01 -7.2000e+02 -4.5714e+02 -1.5140e+01 -7.2000e+02 -4.2857e+02 -1.6385e+01 -7.2000e+02 -4.0000e+02 -1.7673e+01 -7.2000e+02 -3.7143e+02 -1.8998e+01 -7.2000e+02 -3.4286e+02 -2.0346e+01 -7.2000e+02 -3.1429e+02 -2.1704e+01 -7.2000e+02 -2.8571e+02 -2.3054e+01 -7.2000e+02 -2.5714e+02 -2.4377e+01 -7.2000e+02 -2.2857e+02 -2.5648e+01 -7.2000e+02 -2.0000e+02 -2.6846e+01 -7.2000e+02 -1.7143e+02 -2.7947e+01 -7.2000e+02 -1.4286e+02 -2.8925e+01 -7.2000e+02 -1.1429e+02 -2.9760e+01 -7.2000e+02 -8.5714e+01 -3.0431e+01 -7.2000e+02 -5.7143e+01 -3.0923e+01 -7.2000e+02 -2.8571e+01 -3.1223e+01 -7.2000e+02 0.0000e+00 -3.1323e+01 -7.2000e+02 2.8571e+01 -3.1223e+01 -7.2000e+02 5.7143e+01 -3.0923e+01 -7.2000e+02 8.5714e+01 -3.0431e+01 -7.2000e+02 1.1429e+02 -2.9760e+01 -7.2000e+02 1.4286e+02 -2.8925e+01 -7.2000e+02 1.7143e+02 -2.7947e+01 -7.2000e+02 2.0000e+02 -2.6846e+01 -7.2000e+02 2.2857e+02 -2.5648e+01 -7.2000e+02 2.5714e+02 -2.4377e+01 -7.2000e+02 2.8571e+02 -2.3054e+01 -7.2000e+02 3.1429e+02 -2.1704e+01 -7.2000e+02 3.4286e+02 -2.0346e+01 -7.2000e+02 3.7143e+02 -1.8998e+01 -7.2000e+02 4.0000e+02 -1.7673e+01 -7.2000e+02 4.2857e+02 -1.6385e+01 -7.2000e+02 4.5714e+02 -1.5140e+01 -7.2000e+02 4.8571e+02 -1.3947e+01 -7.2000e+02 5.1429e+02 -1.2809e+01 -7.2000e+02 5.4286e+02 -1.1729e+01 -7.2000e+02 5.7143e+02 -1.0706e+01 -7.2000e+02 6.0000e+02 -9.7417e+00 -7.2000e+02 6.2857e+02 -8.8336e+00 -7.2000e+02 6.5714e+02 -7.9801e+00 -7.2000e+02 6.8571e+02 -7.1789e+00 -7.2000e+02 7.1429e+02 -6.4273e+00 -7.2000e+02 7.4286e+02 -5.7226e+00 -7.2000e+02 7.7143e+02 -5.0618e+00 -7.2000e+02 8.0000e+02 -4.4424e+00 -7.2000e+02 8.2857e+02 -3.8613e+00 -7.2000e+02 8.5714e+02 -3.3162e+00 -7.2000e+02 8.8571e+02 -2.8044e+00 -7.2000e+02 9.1429e+02 -2.3236e+00 -7.2000e+02 9.4286e+02 -1.8716e+00 -7.2000e+02 9.7143e+02 -1.4463e+00 -7.2000e+02 1.0000e+03 -1.0458e+00 -7.2000e+02 1.0286e+03 -6.6830e-01 -7.2000e+02 1.0571e+03 -3.1218e-01 -7.2000e+02 1.0857e+03 2.4092e-02 -7.2000e+02 1.1143e+03 3.4193e-01 -7.2000e+02 1.1429e+03 6.4262e-01 -7.2000e+02 1.1714e+03 9.2737e-01 -7.2000e+02 1.2000e+03 1.1973e+00 -7.2000e+02 1.2286e+03 1.4533e+00 -7.2000e+02 1.2571e+03 1.6965e+00 -7.2000e+02 1.2857e+03 1.9276e+00 -7.2000e+02 1.3143e+03 2.1474e+00 -7.2000e+02 1.3429e+03 2.3567e+00 -7.2000e+02 1.3714e+03 2.5562e+00 -7.2000e+02 1.4000e+03 2.7465e+00 -7.2000e+02 1.4286e+03 2.9281e+00 -7.2000e+02 1.4571e+03 3.1016e+00 -7.2000e+02 1.4857e+03 3.2674e+00 -7.2000e+02 1.5143e+03 3.4261e+00 -7.2000e+02 1.5429e+03 3.5781e+00 -7.2000e+02 1.5714e+03 3.7237e+00 -7.2000e+02 1.6000e+03 3.8633e+00 -7.2000e+02 1.6286e+03 3.9973e+00 -7.2000e+02 1.6571e+03 4.1259e+00 -7.2000e+02 1.6857e+03 4.2496e+00 -7.2000e+02 1.7143e+03 4.3684e+00 -7.2000e+02 1.7429e+03 4.4827e+00 -7.2000e+02 1.7714e+03 4.5928e+00 -7.2000e+02 1.8000e+03 4.6988e+00 -7.2000e+02 1.8286e+03 4.8010e+00 -7.2000e+02 1.8571e+03 4.8995e+00 -7.2000e+02 1.8857e+03 4.9946e+00 -7.2000e+02 1.9143e+03 5.0864e+00 -7.2000e+02 1.9429e+03 5.1750e+00 -7.2000e+02 1.9714e+03 5.2607e+00 -7.2000e+02 2.0000e+03 5.3435e+00 -7.5000e+02 -2.0000e+03 5.3747e+00 -7.5000e+02 -1.9714e+03 5.2934e+00 -7.5000e+02 -1.9429e+03 5.2093e+00 -7.5000e+02 -1.9143e+03 5.1224e+00 -7.5000e+02 -1.8857e+03 5.0324e+00 -7.5000e+02 -1.8571e+03 4.9393e+00 -7.5000e+02 -1.8286e+03 4.8429e+00 -7.5000e+02 -1.8000e+03 4.7429e+00 -7.5000e+02 -1.7714e+03 4.6393e+00 -7.5000e+02 -1.7429e+03 4.5318e+00 -7.5000e+02 -1.7143e+03 4.4202e+00 -7.5000e+02 -1.6857e+03 4.3043e+00 -7.5000e+02 -1.6571e+03 4.1839e+00 -7.5000e+02 -1.6286e+03 4.0587e+00 -7.5000e+02 -1.6000e+03 3.9284e+00 -7.5000e+02 -1.5714e+03 3.7927e+00 -7.5000e+02 -1.5429e+03 3.6514e+00 -7.5000e+02 -1.5143e+03 3.5040e+00 -7.5000e+02 -1.4857e+03 3.3503e+00 -7.5000e+02 -1.4571e+03 3.1899e+00 -7.5000e+02 -1.4286e+03 3.0223e+00 -7.5000e+02 -1.4000e+03 2.8471e+00 -7.5000e+02 -1.3714e+03 2.6638e+00 -7.5000e+02 -1.3429e+03 2.4719e+00 -7.5000e+02 -1.3143e+03 2.2708e+00 -7.5000e+02 -1.2857e+03 2.0600e+00 -7.5000e+02 -1.2571e+03 1.8387e+00 -7.5000e+02 -1.2286e+03 1.6064e+00 -7.5000e+02 -1.2000e+03 1.3622e+00 -7.5000e+02 -1.1714e+03 1.1054e+00 -7.5000e+02 -1.1429e+03 8.3500e-01 -7.5000e+02 -1.1143e+03 5.5014e-01 -7.5000e+02 -1.0857e+03 2.4978e-01 -7.5000e+02 -1.0571e+03 -6.7162e-02 -7.5000e+02 -1.0286e+03 -4.0187e-01 -7.5000e+02 -1.0000e+03 -7.5562e-01 -7.5000e+02 -9.7143e+02 -1.1297e+00 -7.5000e+02 -9.4286e+02 -1.5257e+00 -7.5000e+02 -9.1429e+02 -1.9450e+00 -7.5000e+02 -8.8571e+02 -2.3894e+00 -7.5000e+02 -8.5714e+02 -2.8605e+00 -7.5000e+02 -8.2857e+02 -3.3602e+00 -7.5000e+02 -8.0000e+02 -3.8903e+00 -7.5000e+02 -7.7143e+02 -4.4528e+00 -7.5000e+02 -7.4286e+02 -5.0497e+00 -7.5000e+02 -7.1429e+02 -5.6830e+00 -7.5000e+02 -6.8571e+02 -6.3546e+00 -7.5000e+02 -6.5714e+02 -7.0663e+00 -7.5000e+02 -6.2857e+02 -7.8196e+00 -7.5000e+02 -6.0000e+02 -8.6160e+00 -7.5000e+02 -5.7143e+02 -9.4562e+00 -7.5000e+02 -5.4286e+02 -1.0341e+01 -7.5000e+02 -5.1429e+02 -1.1269e+01 -7.5000e+02 -4.8571e+02 -1.2239e+01 -7.5000e+02 -4.5714e+02 -1.3249e+01 -7.5000e+02 -4.2857e+02 -1.4295e+01 -7.5000e+02 -4.0000e+02 -1.5371e+01 -7.5000e+02 -3.7143e+02 -1.6468e+01 -7.5000e+02 -3.4286e+02 -1.7579e+01 -7.5000e+02 -3.1429e+02 -1.8691e+01 -7.5000e+02 -2.8571e+02 -1.9791e+01 -7.5000e+02 -2.5714e+02 -2.0862e+01 -7.5000e+02 -2.2857e+02 -2.1889e+01 -7.5000e+02 -2.0000e+02 -2.2853e+01 -7.5000e+02 -1.7143e+02 -2.3736e+01 -7.5000e+02 -1.4286e+02 -2.4520e+01 -7.5000e+02 -1.1429e+02 -2.5188e+01 -7.5000e+02 -8.5714e+01 -2.5724e+01 -7.5000e+02 -5.7143e+01 -2.6117e+01 -7.5000e+02 -2.8571e+01 -2.6357e+01 -7.5000e+02 0.0000e+00 -2.6437e+01 -7.5000e+02 2.8571e+01 -2.6357e+01 -7.5000e+02 5.7143e+01 -2.6117e+01 -7.5000e+02 8.5714e+01 -2.5724e+01 -7.5000e+02 1.1429e+02 -2.5188e+01 -7.5000e+02 1.4286e+02 -2.4520e+01 -7.5000e+02 1.7143e+02 -2.3736e+01 -7.5000e+02 2.0000e+02 -2.2853e+01 -7.5000e+02 2.2857e+02 -2.1889e+01 -7.5000e+02 2.5714e+02 -2.0862e+01 -7.5000e+02 2.8571e+02 -1.9791e+01 -7.5000e+02 3.1429e+02 -1.8691e+01 -7.5000e+02 3.4286e+02 -1.7579e+01 -7.5000e+02 3.7143e+02 -1.6468e+01 -7.5000e+02 4.0000e+02 -1.5371e+01 -7.5000e+02 4.2857e+02 -1.4295e+01 -7.5000e+02 4.5714e+02 -1.3249e+01 -7.5000e+02 4.8571e+02 -1.2239e+01 -7.5000e+02 5.1429e+02 -1.1269e+01 -7.5000e+02 5.4286e+02 -1.0341e+01 -7.5000e+02 5.7143e+02 -9.4562e+00 -7.5000e+02 6.0000e+02 -8.6160e+00 -7.5000e+02 6.2857e+02 -7.8196e+00 -7.5000e+02 6.5714e+02 -7.0663e+00 -7.5000e+02 6.8571e+02 -6.3546e+00 -7.5000e+02 7.1429e+02 -5.6830e+00 -7.5000e+02 7.4286e+02 -5.0497e+00 -7.5000e+02 7.7143e+02 -4.4528e+00 -7.5000e+02 8.0000e+02 -3.8903e+00 -7.5000e+02 8.2857e+02 -3.3602e+00 -7.5000e+02 8.5714e+02 -2.8605e+00 -7.5000e+02 8.8571e+02 -2.3894e+00 -7.5000e+02 9.1429e+02 -1.9450e+00 -7.5000e+02 9.4286e+02 -1.5257e+00 -7.5000e+02 9.7143e+02 -1.1297e+00 -7.5000e+02 1.0000e+03 -7.5562e-01 -7.5000e+02 1.0286e+03 -4.0187e-01 -7.5000e+02 1.0571e+03 -6.7162e-02 -7.5000e+02 1.0857e+03 2.4978e-01 -7.5000e+02 1.1143e+03 5.5014e-01 -7.5000e+02 1.1429e+03 8.3500e-01 -7.5000e+02 1.1714e+03 1.1054e+00 -7.5000e+02 1.2000e+03 1.3622e+00 -7.5000e+02 1.2286e+03 1.6064e+00 -7.5000e+02 1.2571e+03 1.8387e+00 -7.5000e+02 1.2857e+03 2.0600e+00 -7.5000e+02 1.3143e+03 2.2708e+00 -7.5000e+02 1.3429e+03 2.4719e+00 -7.5000e+02 1.3714e+03 2.6638e+00 -7.5000e+02 1.4000e+03 2.8471e+00 -7.5000e+02 1.4286e+03 3.0223e+00 -7.5000e+02 1.4571e+03 3.1899e+00 -7.5000e+02 1.4857e+03 3.3503e+00 -7.5000e+02 1.5143e+03 3.5040e+00 -7.5000e+02 1.5429e+03 3.6514e+00 -7.5000e+02 1.5714e+03 3.7927e+00 -7.5000e+02 1.6000e+03 3.9284e+00 -7.5000e+02 1.6286e+03 4.0587e+00 -7.5000e+02 1.6571e+03 4.1839e+00 -7.5000e+02 1.6857e+03 4.3043e+00 -7.5000e+02 1.7143e+03 4.4202e+00 -7.5000e+02 1.7429e+03 4.5318e+00 -7.5000e+02 1.7714e+03 4.6393e+00 -7.5000e+02 1.8000e+03 4.7429e+00 -7.5000e+02 1.8286e+03 4.8429e+00 -7.5000e+02 1.8571e+03 4.9393e+00 -7.5000e+02 1.8857e+03 5.0324e+00 -7.5000e+02 1.9143e+03 5.1224e+00 -7.5000e+02 1.9429e+03 5.2093e+00 -7.5000e+02 1.9714e+03 5.2934e+00 -7.5000e+02 2.0000e+03 5.3747e+00 -7.8000e+02 -2.0000e+03 5.4065e+00 -7.8000e+02 -1.9714e+03 5.3267e+00 -7.8000e+02 -1.9429e+03 5.2443e+00 -7.8000e+02 -1.9143e+03 5.1591e+00 -7.8000e+02 -1.8857e+03 5.0710e+00 -7.8000e+02 -1.8571e+03 4.9799e+00 -7.8000e+02 -1.8286e+03 4.8855e+00 -7.8000e+02 -1.8000e+03 4.7878e+00 -7.8000e+02 -1.7714e+03 4.6866e+00 -7.8000e+02 -1.7429e+03 4.5817e+00 -7.8000e+02 -1.7143e+03 4.4728e+00 -7.8000e+02 -1.6857e+03 4.3599e+00 -7.8000e+02 -1.6571e+03 4.2426e+00 -7.8000e+02 -1.6286e+03 4.1208e+00 -7.8000e+02 -1.6000e+03 3.9941e+00 -7.8000e+02 -1.5714e+03 3.8624e+00 -7.8000e+02 -1.5429e+03 3.7253e+00 -7.8000e+02 -1.5143e+03 3.5826e+00 -7.8000e+02 -1.4857e+03 3.4338e+00 -7.8000e+02 -1.4571e+03 3.2787e+00 -7.8000e+02 -1.4286e+03 3.1169e+00 -7.8000e+02 -1.4000e+03 2.9480e+00 -7.8000e+02 -1.3714e+03 2.7715e+00 -7.8000e+02 -1.3429e+03 2.5870e+00 -7.8000e+02 -1.3143e+03 2.3940e+00 -7.8000e+02 -1.2857e+03 2.1920e+00 -7.8000e+02 -1.2571e+03 1.9803e+00 -7.8000e+02 -1.2286e+03 1.7585e+00 -7.8000e+02 -1.2000e+03 1.5258e+00 -7.8000e+02 -1.1714e+03 1.2815e+00 -7.8000e+02 -1.1429e+03 1.0249e+00 -7.8000e+02 -1.1143e+03 7.5515e-01 -7.8000e+02 -1.0857e+03 4.7144e-01 -7.8000e+02 -1.0571e+03 1.7283e-01 -7.8000e+02 -1.0286e+03 -1.4166e-01 -7.8000e+02 -1.0000e+03 -4.7306e-01 -7.8000e+02 -9.7143e+02 -8.2250e-01 -7.8000e+02 -9.4286e+02 -1.1911e+00 -7.8000e+02 -9.1429e+02 -1.5802e+00 -7.8000e+02 -8.8571e+02 -1.9909e+00 -7.8000e+02 -8.5714e+02 -2.4247e+00 -7.8000e+02 -8.2857e+02 -2.8830e+00 -7.8000e+02 -8.0000e+02 -3.3670e+00 -7.8000e+02 -7.7143e+02 -3.8783e+00 -7.8000e+02 -7.4286e+02 -4.4183e+00 -7.8000e+02 -7.1429e+02 -4.9882e+00 -7.8000e+02 -6.8571e+02 -5.5894e+00 -7.8000e+02 -6.5714e+02 -6.2230e+00 -7.8000e+02 -6.2857e+02 -6.8897e+00 -7.8000e+02 -6.0000e+02 -7.5902e+00 -7.8000e+02 -5.7143e+02 -8.3247e+00 -7.8000e+02 -5.4286e+02 -9.0928e+00 -7.8000e+02 -5.1429e+02 -9.8934e+00 -7.8000e+02 -4.8571e+02 -1.0725e+01 -7.8000e+02 -4.5714e+02 -1.1585e+01 -7.8000e+02 -4.2857e+02 -1.2468e+01 -7.8000e+02 -4.0000e+02 -1.3371e+01 -7.8000e+02 -3.7143e+02 -1.4287e+01 -7.8000e+02 -3.4286e+02 -1.5207e+01 -7.8000e+02 -3.1429e+02 -1.6123e+01 -7.8000e+02 -2.8571e+02 -1.7024e+01 -7.8000e+02 -2.5714e+02 -1.7897e+01 -7.8000e+02 -2.2857e+02 -1.8730e+01 -7.8000e+02 -2.0000e+02 -1.9509e+01 -7.8000e+02 -1.7143e+02 -2.0220e+01 -7.8000e+02 -1.4286e+02 -2.0849e+01 -7.8000e+02 -1.1429e+02 -2.1384e+01 -7.8000e+02 -8.5714e+01 -2.1813e+01 -7.8000e+02 -5.7143e+01 -2.2126e+01 -7.8000e+02 -2.8571e+01 -2.2317e+01 -7.8000e+02 0.0000e+00 -2.2382e+01 -7.8000e+02 2.8571e+01 -2.2317e+01 -7.8000e+02 5.7143e+01 -2.2126e+01 -7.8000e+02 8.5714e+01 -2.1813e+01 -7.8000e+02 1.1429e+02 -2.1384e+01 -7.8000e+02 1.4286e+02 -2.0849e+01 -7.8000e+02 1.7143e+02 -2.0220e+01 -7.8000e+02 2.0000e+02 -1.9509e+01 -7.8000e+02 2.2857e+02 -1.8730e+01 -7.8000e+02 2.5714e+02 -1.7897e+01 -7.8000e+02 2.8571e+02 -1.7024e+01 -7.8000e+02 3.1429e+02 -1.6123e+01 -7.8000e+02 3.4286e+02 -1.5207e+01 -7.8000e+02 3.7143e+02 -1.4287e+01 -7.8000e+02 4.0000e+02 -1.3371e+01 -7.8000e+02 4.2857e+02 -1.2468e+01 -7.8000e+02 4.5714e+02 -1.1585e+01 -7.8000e+02 4.8571e+02 -1.0725e+01 -7.8000e+02 5.1429e+02 -9.8934e+00 -7.8000e+02 5.4286e+02 -9.0928e+00 -7.8000e+02 5.7143e+02 -8.3247e+00 -7.8000e+02 6.0000e+02 -7.5902e+00 -7.8000e+02 6.2857e+02 -6.8897e+00 -7.8000e+02 6.5714e+02 -6.2230e+00 -7.8000e+02 6.8571e+02 -5.5894e+00 -7.8000e+02 7.1429e+02 -4.9882e+00 -7.8000e+02 7.4286e+02 -4.4183e+00 -7.8000e+02 7.7143e+02 -3.8783e+00 -7.8000e+02 8.0000e+02 -3.3670e+00 -7.8000e+02 8.2857e+02 -2.8830e+00 -7.8000e+02 8.5714e+02 -2.4247e+00 -7.8000e+02 8.8571e+02 -1.9909e+00 -7.8000e+02 9.1429e+02 -1.5802e+00 -7.8000e+02 9.4286e+02 -1.1911e+00 -7.8000e+02 9.7143e+02 -8.2250e-01 -7.8000e+02 1.0000e+03 -4.7306e-01 -7.8000e+02 1.0286e+03 -1.4166e-01 -7.8000e+02 1.0571e+03 1.7283e-01 -7.8000e+02 1.0857e+03 4.7144e-01 -7.8000e+02 1.1143e+03 7.5515e-01 -7.8000e+02 1.1429e+03 1.0249e+00 -7.8000e+02 1.1714e+03 1.2815e+00 -7.8000e+02 1.2000e+03 1.5258e+00 -7.8000e+02 1.2286e+03 1.7585e+00 -7.8000e+02 1.2571e+03 1.9803e+00 -7.8000e+02 1.2857e+03 2.1920e+00 -7.8000e+02 1.3143e+03 2.3940e+00 -7.8000e+02 1.3429e+03 2.5870e+00 -7.8000e+02 1.3714e+03 2.7715e+00 -7.8000e+02 1.4000e+03 2.9480e+00 -7.8000e+02 1.4286e+03 3.1169e+00 -7.8000e+02 1.4571e+03 3.2787e+00 -7.8000e+02 1.4857e+03 3.4338e+00 -7.8000e+02 1.5143e+03 3.5826e+00 -7.8000e+02 1.5429e+03 3.7253e+00 -7.8000e+02 1.5714e+03 3.8624e+00 -7.8000e+02 1.6000e+03 3.9941e+00 -7.8000e+02 1.6286e+03 4.1208e+00 -7.8000e+02 1.6571e+03 4.2426e+00 -7.8000e+02 1.6857e+03 4.3599e+00 -7.8000e+02 1.7143e+03 4.4728e+00 -7.8000e+02 1.7429e+03 4.5817e+00 -7.8000e+02 1.7714e+03 4.6866e+00 -7.8000e+02 1.8000e+03 4.7878e+00 -7.8000e+02 1.8286e+03 4.8855e+00 -7.8000e+02 1.8571e+03 4.9799e+00 -7.8000e+02 1.8857e+03 5.0710e+00 -7.8000e+02 1.9143e+03 5.1591e+00 -7.8000e+02 1.9429e+03 5.2443e+00 -7.8000e+02 1.9714e+03 5.3267e+00 -7.8000e+02 2.0000e+03 5.4065e+00 -8.1000e+02 -2.0000e+03 5.4389e+00 -8.1000e+02 -1.9714e+03 5.3607e+00 -8.1000e+02 -1.9429e+03 5.2799e+00 -8.1000e+02 -1.9143e+03 5.1965e+00 -8.1000e+02 -1.8857e+03 5.1102e+00 -8.1000e+02 -1.8571e+03 5.0211e+00 -8.1000e+02 -1.8286e+03 4.9288e+00 -8.1000e+02 -1.8000e+03 4.8334e+00 -8.1000e+02 -1.7714e+03 4.7346e+00 -8.1000e+02 -1.7429e+03 4.6322e+00 -8.1000e+02 -1.7143e+03 4.5261e+00 -8.1000e+02 -1.6857e+03 4.4161e+00 -8.1000e+02 -1.6571e+03 4.3020e+00 -8.1000e+02 -1.6286e+03 4.1835e+00 -8.1000e+02 -1.6000e+03 4.0605e+00 -8.1000e+02 -1.5714e+03 3.9327e+00 -8.1000e+02 -1.5429e+03 3.7998e+00 -8.1000e+02 -1.5143e+03 3.6616e+00 -8.1000e+02 -1.4857e+03 3.5177e+00 -8.1000e+02 -1.4571e+03 3.3679e+00 -8.1000e+02 -1.4286e+03 3.2118e+00 -8.1000e+02 -1.4000e+03 3.0490e+00 -8.1000e+02 -1.3714e+03 2.8792e+00 -8.1000e+02 -1.3429e+03 2.7019e+00 -8.1000e+02 -1.3143e+03 2.5168e+00 -8.1000e+02 -1.2857e+03 2.3233e+00 -8.1000e+02 -1.2571e+03 2.1209e+00 -8.1000e+02 -1.2286e+03 1.9092e+00 -8.1000e+02 -1.2000e+03 1.6875e+00 -8.1000e+02 -1.1714e+03 1.4553e+00 -8.1000e+02 -1.1429e+03 1.2119e+00 -8.1000e+02 -1.1143e+03 9.5659e-01 -8.1000e+02 -1.0857e+03 6.8871e-01 -8.1000e+02 -1.0571e+03 4.0746e-01 -8.1000e+02 -1.0286e+03 1.1205e-01 -8.1000e+02 -1.0000e+03 -1.9839e-01 -8.1000e+02 -9.7143e+02 -5.2474e-01 -8.1000e+02 -9.4286e+02 -8.6794e-01 -8.1000e+02 -9.1429e+02 -1.2290e+00 -8.1000e+02 -8.8571e+02 -1.6088e+00 -8.1000e+02 -8.5714e+02 -2.0084e+00 -8.1000e+02 -8.2857e+02 -2.4290e+00 -8.1000e+02 -8.0000e+02 -2.8713e+00 -8.1000e+02 -7.7143e+02 -3.3366e+00 -8.1000e+02 -7.4286e+02 -3.8257e+00 -8.1000e+02 -7.1429e+02 -4.3395e+00 -8.1000e+02 -6.8571e+02 -4.8788e+00 -8.1000e+02 -6.5714e+02 -5.4441e+00 -8.1000e+02 -6.2857e+02 -6.0357e+00 -8.1000e+02 -6.0000e+02 -6.6539e+00 -8.1000e+02 -5.7143e+02 -7.2982e+00 -8.1000e+02 -5.4286e+02 -7.9679e+00 -8.1000e+02 -5.1429e+02 -8.6617e+00 -8.1000e+02 -4.8571e+02 -9.3777e+00 -8.1000e+02 -4.5714e+02 -1.0113e+01 -8.1000e+02 -4.2857e+02 -1.0865e+01 -8.1000e+02 -4.0000e+02 -1.1627e+01 -8.1000e+02 -3.7143e+02 -1.2396e+01 -8.1000e+02 -3.4286e+02 -1.3164e+01 -8.1000e+02 -3.1429e+02 -1.3924e+01 -8.1000e+02 -2.8571e+02 -1.4667e+01 -8.1000e+02 -2.5714e+02 -1.5384e+01 -8.1000e+02 -2.2857e+02 -1.6064e+01 -8.1000e+02 -2.0000e+02 -1.6698e+01 -8.1000e+02 -1.7143e+02 -1.7274e+01 -8.1000e+02 -1.4286e+02 -1.7782e+01 -8.1000e+02 -1.1429e+02 -1.8213e+01 -8.1000e+02 -8.5714e+01 -1.8558e+01 -8.1000e+02 -5.7143e+01 -1.8809e+01 -8.1000e+02 -2.8571e+01 -1.8963e+01 -8.1000e+02 0.0000e+00 -1.9014e+01 -8.1000e+02 2.8571e+01 -1.8963e+01 -8.1000e+02 5.7143e+01 -1.8809e+01 -8.1000e+02 8.5714e+01 -1.8558e+01 -8.1000e+02 1.1429e+02 -1.8213e+01 -8.1000e+02 1.4286e+02 -1.7782e+01 -8.1000e+02 1.7143e+02 -1.7274e+01 -8.1000e+02 2.0000e+02 -1.6698e+01 -8.1000e+02 2.2857e+02 -1.6064e+01 -8.1000e+02 2.5714e+02 -1.5384e+01 -8.1000e+02 2.8571e+02 -1.4667e+01 -8.1000e+02 3.1429e+02 -1.3924e+01 -8.1000e+02 3.4286e+02 -1.3164e+01 -8.1000e+02 3.7143e+02 -1.2396e+01 -8.1000e+02 4.0000e+02 -1.1627e+01 -8.1000e+02 4.2857e+02 -1.0865e+01 -8.1000e+02 4.5714e+02 -1.0113e+01 -8.1000e+02 4.8571e+02 -9.3777e+00 -8.1000e+02 5.1429e+02 -8.6617e+00 -8.1000e+02 5.4286e+02 -7.9679e+00 -8.1000e+02 5.7143e+02 -7.2982e+00 -8.1000e+02 6.0000e+02 -6.6539e+00 -8.1000e+02 6.2857e+02 -6.0357e+00 -8.1000e+02 6.5714e+02 -5.4441e+00 -8.1000e+02 6.8571e+02 -4.8788e+00 -8.1000e+02 7.1429e+02 -4.3395e+00 -8.1000e+02 7.4286e+02 -3.8257e+00 -8.1000e+02 7.7143e+02 -3.3366e+00 -8.1000e+02 8.0000e+02 -2.8713e+00 -8.1000e+02 8.2857e+02 -2.4290e+00 -8.1000e+02 8.5714e+02 -2.0084e+00 -8.1000e+02 8.8571e+02 -1.6088e+00 -8.1000e+02 9.1429e+02 -1.2290e+00 -8.1000e+02 9.4286e+02 -8.6794e-01 -8.1000e+02 9.7143e+02 -5.2474e-01 -8.1000e+02 1.0000e+03 -1.9839e-01 -8.1000e+02 1.0286e+03 1.1205e-01 -8.1000e+02 1.0571e+03 4.0746e-01 -8.1000e+02 1.0857e+03 6.8871e-01 -8.1000e+02 1.1143e+03 9.5659e-01 -8.1000e+02 1.1429e+03 1.2119e+00 -8.1000e+02 1.1714e+03 1.4553e+00 -8.1000e+02 1.2000e+03 1.6875e+00 -8.1000e+02 1.2286e+03 1.9092e+00 -8.1000e+02 1.2571e+03 2.1209e+00 -8.1000e+02 1.2857e+03 2.3233e+00 -8.1000e+02 1.3143e+03 2.5168e+00 -8.1000e+02 1.3429e+03 2.7019e+00 -8.1000e+02 1.3714e+03 2.8792e+00 -8.1000e+02 1.4000e+03 3.0490e+00 -8.1000e+02 1.4286e+03 3.2118e+00 -8.1000e+02 1.4571e+03 3.3679e+00 -8.1000e+02 1.4857e+03 3.5177e+00 -8.1000e+02 1.5143e+03 3.6616e+00 -8.1000e+02 1.5429e+03 3.7998e+00 -8.1000e+02 1.5714e+03 3.9327e+00 -8.1000e+02 1.6000e+03 4.0605e+00 -8.1000e+02 1.6286e+03 4.1835e+00 -8.1000e+02 1.6571e+03 4.3020e+00 -8.1000e+02 1.6857e+03 4.4161e+00 -8.1000e+02 1.7143e+03 4.5261e+00 -8.1000e+02 1.7429e+03 4.6322e+00 -8.1000e+02 1.7714e+03 4.7346e+00 -8.1000e+02 1.8000e+03 4.8334e+00 -8.1000e+02 1.8286e+03 4.9288e+00 -8.1000e+02 1.8571e+03 5.0211e+00 -8.1000e+02 1.8857e+03 5.1102e+00 -8.1000e+02 1.9143e+03 5.1965e+00 -8.1000e+02 1.9429e+03 5.2799e+00 -8.1000e+02 1.9714e+03 5.3607e+00 -8.1000e+02 2.0000e+03 5.4389e+00 -8.4000e+02 -2.0000e+03 5.4720e+00 -8.4000e+02 -1.9714e+03 5.3953e+00 -8.4000e+02 -1.9429e+03 5.3161e+00 -8.4000e+02 -1.9143e+03 5.2344e+00 -8.4000e+02 -1.8857e+03 5.1501e+00 -8.4000e+02 -1.8571e+03 5.0629e+00 -8.4000e+02 -1.8286e+03 4.9728e+00 -8.4000e+02 -1.8000e+03 4.8796e+00 -8.4000e+02 -1.7714e+03 4.7831e+00 -8.4000e+02 -1.7429e+03 4.6833e+00 -8.4000e+02 -1.7143e+03 4.5800e+00 -8.4000e+02 -1.6857e+03 4.4729e+00 -8.4000e+02 -1.6571e+03 4.3619e+00 -8.4000e+02 -1.6286e+03 4.2468e+00 -8.4000e+02 -1.6000e+03 4.1274e+00 -8.4000e+02 -1.5714e+03 4.0034e+00 -8.4000e+02 -1.5429e+03 3.8747e+00 -8.4000e+02 -1.5143e+03 3.7409e+00 -8.4000e+02 -1.4857e+03 3.6018e+00 -8.4000e+02 -1.4571e+03 3.4572e+00 -8.4000e+02 -1.4286e+03 3.3066e+00 -8.4000e+02 -1.4000e+03 3.1499e+00 -8.4000e+02 -1.3714e+03 2.9866e+00 -8.4000e+02 -1.3429e+03 2.8164e+00 -8.4000e+02 -1.3143e+03 2.6388e+00 -8.4000e+02 -1.2857e+03 2.4536e+00 -8.4000e+02 -1.2571e+03 2.2603e+00 -8.4000e+02 -1.2286e+03 2.0583e+00 -8.4000e+02 -1.2000e+03 1.8472e+00 -8.4000e+02 -1.1714e+03 1.6266e+00 -8.4000e+02 -1.1429e+03 1.3957e+00 -8.4000e+02 -1.1143e+03 1.1542e+00 -8.4000e+02 -1.0857e+03 9.0131e-01 -8.4000e+02 -1.0571e+03 6.3647e-01 -8.4000e+02 -1.0286e+03 3.5901e-01 -8.4000e+02 -1.0000e+03 6.8225e-02 -8.4000e+02 -9.7143e+02 -2.3659e-01 -8.4000e+02 -9.4286e+02 -5.5617e-01 -8.4000e+02 -9.1429e+02 -8.9127e-01 -8.4000e+02 -8.8571e+02 -1.2426e+00 -8.4000e+02 -8.5714e+02 -1.6111e+00 -8.4000e+02 -8.2857e+02 -1.9973e+00 -8.4000e+02 -8.0000e+02 -2.4020e+00 -8.4000e+02 -7.7143e+02 -2.8259e+00 -8.4000e+02 -7.4286e+02 -3.2696e+00 -8.4000e+02 -7.1429e+02 -3.7336e+00 -8.4000e+02 -6.8571e+02 -4.2183e+00 -8.4000e+02 -6.5714e+02 -4.7239e+00 -8.4000e+02 -6.2857e+02 -5.2504e+00 -8.4000e+02 -6.0000e+02 -5.7975e+00 -8.4000e+02 -5.7143e+02 -6.3647e+00 -8.4000e+02 -5.4286e+02 -6.9510e+00 -8.4000e+02 -5.1429e+02 -7.5549e+00 -8.4000e+02 -4.8571e+02 -8.1745e+00 -8.4000e+02 -4.5714e+02 -8.8072e+00 -8.4000e+02 -4.2857e+02 -9.4498e+00 -8.4000e+02 -4.0000e+02 -1.0098e+01 -8.4000e+02 -3.7143e+02 -1.0748e+01 -8.4000e+02 -3.4286e+02 -1.1394e+01 -8.4000e+02 -3.1429e+02 -1.2029e+01 -8.4000e+02 -2.8571e+02 -1.2647e+01 -8.4000e+02 -2.5714e+02 -1.3240e+01 -8.4000e+02 -2.2857e+02 -1.3800e+01 -8.4000e+02 -2.0000e+02 -1.4320e+01 -8.4000e+02 -1.7143e+02 -1.4791e+01 -8.4000e+02 -1.4286e+02 -1.5205e+01 -8.4000e+02 -1.1429e+02 -1.5555e+01 -8.4000e+02 -8.5714e+01 -1.5834e+01 -8.4000e+02 -5.7143e+01 -1.6038e+01 -8.4000e+02 -2.8571e+01 -1.6162e+01 -8.4000e+02 0.0000e+00 -1.6203e+01 -8.4000e+02 2.8571e+01 -1.6162e+01 -8.4000e+02 5.7143e+01 -1.6038e+01 -8.4000e+02 8.5714e+01 -1.5834e+01 -8.4000e+02 1.1429e+02 -1.5555e+01 -8.4000e+02 1.4286e+02 -1.5205e+01 -8.4000e+02 1.7143e+02 -1.4791e+01 -8.4000e+02 2.0000e+02 -1.4320e+01 -8.4000e+02 2.2857e+02 -1.3800e+01 -8.4000e+02 2.5714e+02 -1.3240e+01 -8.4000e+02 2.8571e+02 -1.2647e+01 -8.4000e+02 3.1429e+02 -1.2029e+01 -8.4000e+02 3.4286e+02 -1.1394e+01 -8.4000e+02 3.7143e+02 -1.0748e+01 -8.4000e+02 4.0000e+02 -1.0098e+01 -8.4000e+02 4.2857e+02 -9.4498e+00 -8.4000e+02 4.5714e+02 -8.8072e+00 -8.4000e+02 4.8571e+02 -8.1745e+00 -8.4000e+02 5.1429e+02 -7.5549e+00 -8.4000e+02 5.4286e+02 -6.9510e+00 -8.4000e+02 5.7143e+02 -6.3647e+00 -8.4000e+02 6.0000e+02 -5.7975e+00 -8.4000e+02 6.2857e+02 -5.2504e+00 -8.4000e+02 6.5714e+02 -4.7239e+00 -8.4000e+02 6.8571e+02 -4.2183e+00 -8.4000e+02 7.1429e+02 -3.7336e+00 -8.4000e+02 7.4286e+02 -3.2696e+00 -8.4000e+02 7.7143e+02 -2.8259e+00 -8.4000e+02 8.0000e+02 -2.4020e+00 -8.4000e+02 8.2857e+02 -1.9973e+00 -8.4000e+02 8.5714e+02 -1.6111e+00 -8.4000e+02 8.8571e+02 -1.2426e+00 -8.4000e+02 9.1429e+02 -8.9127e-01 -8.4000e+02 9.4286e+02 -5.5617e-01 -8.4000e+02 9.7143e+02 -2.3659e-01 -8.4000e+02 1.0000e+03 6.8225e-02 -8.4000e+02 1.0286e+03 3.5901e-01 -8.4000e+02 1.0571e+03 6.3647e-01 -8.4000e+02 1.0857e+03 9.0131e-01 -8.4000e+02 1.1143e+03 1.1542e+00 -8.4000e+02 1.1429e+03 1.3957e+00 -8.4000e+02 1.1714e+03 1.6266e+00 -8.4000e+02 1.2000e+03 1.8472e+00 -8.4000e+02 1.2286e+03 2.0583e+00 -8.4000e+02 1.2571e+03 2.2603e+00 -8.4000e+02 1.2857e+03 2.4536e+00 -8.4000e+02 1.3143e+03 2.6388e+00 -8.4000e+02 1.3429e+03 2.8164e+00 -8.4000e+02 1.3714e+03 2.9866e+00 -8.4000e+02 1.4000e+03 3.1499e+00 -8.4000e+02 1.4286e+03 3.3066e+00 -8.4000e+02 1.4571e+03 3.4572e+00 -8.4000e+02 1.4857e+03 3.6018e+00 -8.4000e+02 1.5143e+03 3.7409e+00 -8.4000e+02 1.5429e+03 3.8747e+00 -8.4000e+02 1.5714e+03 4.0034e+00 -8.4000e+02 1.6000e+03 4.1274e+00 -8.4000e+02 1.6286e+03 4.2468e+00 -8.4000e+02 1.6571e+03 4.3619e+00 -8.4000e+02 1.6857e+03 4.4729e+00 -8.4000e+02 1.7143e+03 4.5800e+00 -8.4000e+02 1.7429e+03 4.6833e+00 -8.4000e+02 1.7714e+03 4.7831e+00 -8.4000e+02 1.8000e+03 4.8796e+00 -8.4000e+02 1.8286e+03 4.9728e+00 -8.4000e+02 1.8571e+03 5.0629e+00 -8.4000e+02 1.8857e+03 5.1501e+00 -8.4000e+02 1.9143e+03 5.2344e+00 -8.4000e+02 1.9429e+03 5.3161e+00 -8.4000e+02 1.9714e+03 5.3953e+00 -8.4000e+02 2.0000e+03 5.4720e+00 -8.7000e+02 -2.0000e+03 5.5055e+00 -8.7000e+02 -1.9714e+03 5.4304e+00 -8.7000e+02 -1.9429e+03 5.3529e+00 -8.7000e+02 -1.9143e+03 5.2730e+00 -8.7000e+02 -1.8857e+03 5.1904e+00 -8.7000e+02 -1.8571e+03 5.1052e+00 -8.7000e+02 -1.8286e+03 5.0172e+00 -8.7000e+02 -1.8000e+03 4.9263e+00 -8.7000e+02 -1.7714e+03 4.8322e+00 -8.7000e+02 -1.7429e+03 4.7350e+00 -8.7000e+02 -1.7143e+03 4.6343e+00 -8.7000e+02 -1.6857e+03 4.5301e+00 -8.7000e+02 -1.6571e+03 4.4223e+00 -8.7000e+02 -1.6286e+03 4.3105e+00 -8.7000e+02 -1.6000e+03 4.1946e+00 -8.7000e+02 -1.5714e+03 4.0744e+00 -8.7000e+02 -1.5429e+03 3.9498e+00 -8.7000e+02 -1.5143e+03 3.8204e+00 -8.7000e+02 -1.4857e+03 3.6860e+00 -8.7000e+02 -1.4571e+03 3.5464e+00 -8.7000e+02 -1.4286e+03 3.4014e+00 -8.7000e+02 -1.4000e+03 3.2505e+00 -8.7000e+02 -1.3714e+03 3.0935e+00 -8.7000e+02 -1.3429e+03 2.9301e+00 -8.7000e+02 -1.3143e+03 2.7600e+00 -8.7000e+02 -1.2857e+03 2.5828e+00 -8.7000e+02 -1.2571e+03 2.3981e+00 -8.7000e+02 -1.2286e+03 2.2055e+00 -8.7000e+02 -1.2000e+03 2.0046e+00 -8.7000e+02 -1.1714e+03 1.7950e+00 -8.7000e+02 -1.1429e+03 1.5762e+00 -8.7000e+02 -1.1143e+03 1.3477e+00 -8.7000e+02 -1.0857e+03 1.1090e+00 -8.7000e+02 -1.0571e+03 8.5968e-01 -8.7000e+02 -1.0286e+03 5.9908e-01 -8.7000e+02 -1.0000e+03 3.2669e-01 -8.7000e+02 -9.7143e+02 4.1952e-02 -8.7000e+02 -9.4286e+02 -2.5571e-01 -8.7000e+02 -9.1429e+02 -5.6688e-01 -8.7000e+02 -8.8571e+02 -8.9211e-01 -8.7000e+02 -8.5714e+02 -1.2320e+00 -8.7000e+02 -8.2857e+02 -1.5870e+00 -8.7000e+02 -8.0000e+02 -1.9576e+00 -8.7000e+02 -7.7143e+02 -2.3443e+00 -8.7000e+02 -7.4286e+02 -2.7474e+00 -8.7000e+02 -7.1429e+02 -3.1672e+00 -8.7000e+02 -6.8571e+02 -3.6038e+00 -8.7000e+02 -6.5714e+02 -4.0571e+00 -8.7000e+02 -6.2857e+02 -4.5269e+00 -8.7000e+02 -6.0000e+02 -5.0127e+00 -8.7000e+02 -5.7143e+02 -5.5139e+00 -8.7000e+02 -5.4286e+02 -6.0291e+00 -8.7000e+02 -5.1429e+02 -6.5571e+00 -8.7000e+02 -4.8571e+02 -7.0959e+00 -8.7000e+02 -4.5714e+02 -7.6431e+00 -8.7000e+02 -4.2857e+02 -8.1959e+00 -8.7000e+02 -4.0000e+02 -8.7507e+00 -8.7000e+02 -3.7143e+02 -9.3037e+00 -8.7000e+02 -3.4286e+02 -9.8502e+00 -8.7000e+02 -3.1429e+02 -1.0385e+01 -8.7000e+02 -2.8571e+02 -1.0903e+01 -8.7000e+02 -2.5714e+02 -1.1398e+01 -8.7000e+02 -2.2857e+02 -1.1864e+01 -8.7000e+02 -2.0000e+02 -1.2294e+01 -8.7000e+02 -1.7143e+02 -1.2682e+01 -8.7000e+02 -1.4286e+02 -1.3022e+01 -8.7000e+02 -1.1429e+02 -1.3309e+01 -8.7000e+02 -8.5714e+01 -1.3538e+01 -8.7000e+02 -5.7143e+01 -1.3704e+01 -8.7000e+02 -2.8571e+01 -1.3806e+01 -8.7000e+02 0.0000e+00 -1.3839e+01 -8.7000e+02 2.8571e+01 -1.3806e+01 -8.7000e+02 5.7143e+01 -1.3704e+01 -8.7000e+02 8.5714e+01 -1.3538e+01 -8.7000e+02 1.1429e+02 -1.3309e+01 -8.7000e+02 1.4286e+02 -1.3022e+01 -8.7000e+02 1.7143e+02 -1.2682e+01 -8.7000e+02 2.0000e+02 -1.2294e+01 -8.7000e+02 2.2857e+02 -1.1864e+01 -8.7000e+02 2.5714e+02 -1.1398e+01 -8.7000e+02 2.8571e+02 -1.0903e+01 -8.7000e+02 3.1429e+02 -1.0385e+01 -8.7000e+02 3.4286e+02 -9.8502e+00 -8.7000e+02 3.7143e+02 -9.3037e+00 -8.7000e+02 4.0000e+02 -8.7507e+00 -8.7000e+02 4.2857e+02 -8.1959e+00 -8.7000e+02 4.5714e+02 -7.6431e+00 -8.7000e+02 4.8571e+02 -7.0959e+00 -8.7000e+02 5.1429e+02 -6.5571e+00 -8.7000e+02 5.4286e+02 -6.0291e+00 -8.7000e+02 5.7143e+02 -5.5139e+00 -8.7000e+02 6.0000e+02 -5.0127e+00 -8.7000e+02 6.2857e+02 -4.5269e+00 -8.7000e+02 6.5714e+02 -4.0571e+00 -8.7000e+02 6.8571e+02 -3.6038e+00 -8.7000e+02 7.1429e+02 -3.1672e+00 -8.7000e+02 7.4286e+02 -2.7474e+00 -8.7000e+02 7.7143e+02 -2.3443e+00 -8.7000e+02 8.0000e+02 -1.9576e+00 -8.7000e+02 8.2857e+02 -1.5870e+00 -8.7000e+02 8.5714e+02 -1.2320e+00 -8.7000e+02 8.8571e+02 -8.9211e-01 -8.7000e+02 9.1429e+02 -5.6688e-01 -8.7000e+02 9.4286e+02 -2.5571e-01 -8.7000e+02 9.7143e+02 4.1952e-02 -8.7000e+02 1.0000e+03 3.2669e-01 -8.7000e+02 1.0286e+03 5.9908e-01 -8.7000e+02 1.0571e+03 8.5968e-01 -8.7000e+02 1.0857e+03 1.1090e+00 -8.7000e+02 1.1143e+03 1.3477e+00 -8.7000e+02 1.1429e+03 1.5762e+00 -8.7000e+02 1.1714e+03 1.7950e+00 -8.7000e+02 1.2000e+03 2.0046e+00 -8.7000e+02 1.2286e+03 2.2055e+00 -8.7000e+02 1.2571e+03 2.3981e+00 -8.7000e+02 1.2857e+03 2.5828e+00 -8.7000e+02 1.3143e+03 2.7600e+00 -8.7000e+02 1.3429e+03 2.9301e+00 -8.7000e+02 1.3714e+03 3.0935e+00 -8.7000e+02 1.4000e+03 3.2505e+00 -8.7000e+02 1.4286e+03 3.4014e+00 -8.7000e+02 1.4571e+03 3.5464e+00 -8.7000e+02 1.4857e+03 3.6860e+00 -8.7000e+02 1.5143e+03 3.8204e+00 -8.7000e+02 1.5429e+03 3.9498e+00 -8.7000e+02 1.5714e+03 4.0744e+00 -8.7000e+02 1.6000e+03 4.1946e+00 -8.7000e+02 1.6286e+03 4.3105e+00 -8.7000e+02 1.6571e+03 4.4223e+00 -8.7000e+02 1.6857e+03 4.5301e+00 -8.7000e+02 1.7143e+03 4.6343e+00 -8.7000e+02 1.7429e+03 4.7350e+00 -8.7000e+02 1.7714e+03 4.8322e+00 -8.7000e+02 1.8000e+03 4.9263e+00 -8.7000e+02 1.8286e+03 5.0172e+00 -8.7000e+02 1.8571e+03 5.1052e+00 -8.7000e+02 1.8857e+03 5.1904e+00 -8.7000e+02 1.9143e+03 5.2730e+00 -8.7000e+02 1.9429e+03 5.3529e+00 -8.7000e+02 1.9714e+03 5.4304e+00 -8.7000e+02 2.0000e+03 5.5055e+00 -9.0000e+02 -2.0000e+03 5.5395e+00 -9.0000e+02 -1.9714e+03 5.4660e+00 -9.0000e+02 -1.9429e+03 5.3901e+00 -9.0000e+02 -1.9143e+03 5.3119e+00 -9.0000e+02 -1.8857e+03 5.2313e+00 -9.0000e+02 -1.8571e+03 5.1480e+00 -9.0000e+02 -1.8286e+03 5.0621e+00 -9.0000e+02 -1.8000e+03 4.9734e+00 -9.0000e+02 -1.7714e+03 4.8817e+00 -9.0000e+02 -1.7429e+03 4.7870e+00 -9.0000e+02 -1.7143e+03 4.6891e+00 -9.0000e+02 -1.6857e+03 4.5878e+00 -9.0000e+02 -1.6571e+03 4.4829e+00 -9.0000e+02 -1.6286e+03 4.3744e+00 -9.0000e+02 -1.6000e+03 4.2621e+00 -9.0000e+02 -1.5714e+03 4.1457e+00 -9.0000e+02 -1.5429e+03 4.0250e+00 -9.0000e+02 -1.5143e+03 3.8999e+00 -9.0000e+02 -1.4857e+03 3.7702e+00 -9.0000e+02 -1.4571e+03 3.6355e+00 -9.0000e+02 -1.4286e+03 3.4958e+00 -9.0000e+02 -1.4000e+03 3.3506e+00 -9.0000e+02 -1.3714e+03 3.1998e+00 -9.0000e+02 -1.3429e+03 3.0431e+00 -9.0000e+02 -1.3143e+03 2.8801e+00 -9.0000e+02 -1.2857e+03 2.7106e+00 -9.0000e+02 -1.2571e+03 2.5342e+00 -9.0000e+02 -1.2286e+03 2.3507e+00 -9.0000e+02 -1.2000e+03 2.1595e+00 -9.0000e+02 -1.1714e+03 1.9605e+00 -9.0000e+02 -1.1429e+03 1.7531e+00 -9.0000e+02 -1.1143e+03 1.5370e+00 -9.0000e+02 -1.0857e+03 1.3117e+00 -9.0000e+02 -1.0571e+03 1.0770e+00 -9.0000e+02 -1.0286e+03 8.3218e-01 -9.0000e+02 -1.0000e+03 5.7699e-01 -9.0000e+02 -9.7143e+02 3.1094e-01 -9.0000e+02 -9.4286e+02 3.3585e-02 -9.0000e+02 -9.1429e+02 -2.5550e-01 -9.0000e+02 -8.8571e+02 -5.5672e-01 -9.0000e+02 -8.5714e+02 -8.7046e-01 -9.0000e+02 -8.2857e+02 -1.1971e+00 -9.0000e+02 -8.0000e+02 -1.5369e+00 -9.0000e+02 -7.7143e+02 -1.8901e+00 -9.0000e+02 -7.4286e+02 -2.2570e+00 -9.0000e+02 -7.1429e+02 -2.6374e+00 -9.0000e+02 -6.8571e+02 -3.0315e+00 -9.0000e+02 -6.5714e+02 -3.4389e+00 -9.0000e+02 -6.2857e+02 -3.8593e+00 -9.0000e+02 -6.0000e+02 -4.2921e+00 -9.0000e+02 -5.7143e+02 -4.7363e+00 -9.0000e+02 -5.4286e+02 -5.1910e+00 -9.0000e+02 -5.1429e+02 -5.6546e+00 -9.0000e+02 -4.8571e+02 -6.1253e+00 -9.0000e+02 -4.5714e+02 -6.6010e+00 -9.0000e+02 -4.2857e+02 -7.0792e+00 -9.0000e+02 -4.0000e+02 -7.5568e+00 -9.0000e+02 -3.7143e+02 -8.0305e+00 -9.0000e+02 -3.4286e+02 -8.4963e+00 -9.0000e+02 -3.1429e+02 -8.9503e+00 -9.0000e+02 -2.8571e+02 -9.3878e+00 -9.0000e+02 -2.5714e+02 -9.8041e+00 -9.0000e+02 -2.2857e+02 -1.0194e+01 -9.0000e+02 -2.0000e+02 -1.0553e+01 -9.0000e+02 -1.7143e+02 -1.0876e+01 -9.0000e+02 -1.4286e+02 -1.1159e+01 -9.0000e+02 -1.1429e+02 -1.1397e+01 -9.0000e+02 -8.5714e+01 -1.1586e+01 -9.0000e+02 -5.7143e+01 -1.1723e+01 -9.0000e+02 -2.8571e+01 -1.1806e+01 -9.0000e+02 0.0000e+00 -1.1834e+01 -9.0000e+02 2.8571e+01 -1.1806e+01 -9.0000e+02 5.7143e+01 -1.1723e+01 -9.0000e+02 8.5714e+01 -1.1586e+01 -9.0000e+02 1.1429e+02 -1.1397e+01 -9.0000e+02 1.4286e+02 -1.1159e+01 -9.0000e+02 1.7143e+02 -1.0876e+01 -9.0000e+02 2.0000e+02 -1.0553e+01 -9.0000e+02 2.2857e+02 -1.0194e+01 -9.0000e+02 2.5714e+02 -9.8041e+00 -9.0000e+02 2.8571e+02 -9.3878e+00 -9.0000e+02 3.1429e+02 -8.9503e+00 -9.0000e+02 3.4286e+02 -8.4963e+00 -9.0000e+02 3.7143e+02 -8.0305e+00 -9.0000e+02 4.0000e+02 -7.5568e+00 -9.0000e+02 4.2857e+02 -7.0792e+00 -9.0000e+02 4.5714e+02 -6.6010e+00 -9.0000e+02 4.8571e+02 -6.1253e+00 -9.0000e+02 5.1429e+02 -5.6546e+00 -9.0000e+02 5.4286e+02 -5.1910e+00 -9.0000e+02 5.7143e+02 -4.7363e+00 -9.0000e+02 6.0000e+02 -4.2921e+00 -9.0000e+02 6.2857e+02 -3.8593e+00 -9.0000e+02 6.5714e+02 -3.4389e+00 -9.0000e+02 6.8571e+02 -3.0315e+00 -9.0000e+02 7.1429e+02 -2.6374e+00 -9.0000e+02 7.4286e+02 -2.2570e+00 -9.0000e+02 7.7143e+02 -1.8901e+00 -9.0000e+02 8.0000e+02 -1.5369e+00 -9.0000e+02 8.2857e+02 -1.1971e+00 -9.0000e+02 8.5714e+02 -8.7046e-01 -9.0000e+02 8.8571e+02 -5.5672e-01 -9.0000e+02 9.1429e+02 -2.5550e-01 -9.0000e+02 9.4286e+02 3.3585e-02 -9.0000e+02 9.7143e+02 3.1094e-01 -9.0000e+02 1.0000e+03 5.7699e-01 -9.0000e+02 1.0286e+03 8.3218e-01 -9.0000e+02 1.0571e+03 1.0770e+00 -9.0000e+02 1.0857e+03 1.3117e+00 -9.0000e+02 1.1143e+03 1.5370e+00 -9.0000e+02 1.1429e+03 1.7531e+00 -9.0000e+02 1.1714e+03 1.9605e+00 -9.0000e+02 1.2000e+03 2.1595e+00 -9.0000e+02 1.2286e+03 2.3507e+00 -9.0000e+02 1.2571e+03 2.5342e+00 -9.0000e+02 1.2857e+03 2.7106e+00 -9.0000e+02 1.3143e+03 2.8801e+00 -9.0000e+02 1.3429e+03 3.0431e+00 -9.0000e+02 1.3714e+03 3.1998e+00 -9.0000e+02 1.4000e+03 3.3506e+00 -9.0000e+02 1.4286e+03 3.4958e+00 -9.0000e+02 1.4571e+03 3.6355e+00 -9.0000e+02 1.4857e+03 3.7702e+00 -9.0000e+02 1.5143e+03 3.8999e+00 -9.0000e+02 1.5429e+03 4.0250e+00 -9.0000e+02 1.5714e+03 4.1457e+00 -9.0000e+02 1.6000e+03 4.2621e+00 -9.0000e+02 1.6286e+03 4.3744e+00 -9.0000e+02 1.6571e+03 4.4829e+00 -9.0000e+02 1.6857e+03 4.5878e+00 -9.0000e+02 1.7143e+03 4.6891e+00 -9.0000e+02 1.7429e+03 4.7870e+00 -9.0000e+02 1.7714e+03 4.8817e+00 -9.0000e+02 1.8000e+03 4.9734e+00 -9.0000e+02 1.8286e+03 5.0621e+00 -9.0000e+02 1.8571e+03 5.1480e+00 -9.0000e+02 1.8857e+03 5.2313e+00 -9.0000e+02 1.9143e+03 5.3119e+00 -9.0000e+02 1.9429e+03 5.3901e+00 -9.0000e+02 1.9714e+03 5.4660e+00 -9.0000e+02 2.0000e+03 5.5395e+00 -9.3000e+02 -2.0000e+03 5.5740e+00 -9.3000e+02 -1.9714e+03 5.5020e+00 -9.3000e+02 -1.9429e+03 5.4278e+00 -9.3000e+02 -1.9143e+03 5.3513e+00 -9.3000e+02 -1.8857e+03 5.2725e+00 -9.3000e+02 -1.8571e+03 5.1913e+00 -9.3000e+02 -1.8286e+03 5.1074e+00 -9.3000e+02 -1.8000e+03 5.0209e+00 -9.3000e+02 -1.7714e+03 4.9316e+00 -9.3000e+02 -1.7429e+03 4.8394e+00 -9.3000e+02 -1.7143e+03 4.7441e+00 -9.3000e+02 -1.6857e+03 4.6456e+00 -9.3000e+02 -1.6571e+03 4.5438e+00 -9.3000e+02 -1.6286e+03 4.4386e+00 -9.3000e+02 -1.6000e+03 4.3296e+00 -9.3000e+02 -1.5714e+03 4.2169e+00 -9.3000e+02 -1.5429e+03 4.1002e+00 -9.3000e+02 -1.5143e+03 3.9793e+00 -9.3000e+02 -1.4857e+03 3.8541e+00 -9.3000e+02 -1.4571e+03 3.7243e+00 -9.3000e+02 -1.4286e+03 3.5897e+00 -9.3000e+02 -1.4000e+03 3.4501e+00 -9.3000e+02 -1.3714e+03 3.3053e+00 -9.3000e+02 -1.3429e+03 3.1550e+00 -9.3000e+02 -1.3143e+03 2.9989e+00 -9.3000e+02 -1.2857e+03 2.8369e+00 -9.3000e+02 -1.2571e+03 2.6685e+00 -9.3000e+02 -1.2286e+03 2.4936e+00 -9.3000e+02 -1.2000e+03 2.3118e+00 -9.3000e+02 -1.1714e+03 2.1227e+00 -9.3000e+02 -1.1429e+03 1.9262e+00 -9.3000e+02 -1.1143e+03 1.7218e+00 -9.3000e+02 -1.0857e+03 1.5093e+00 -9.3000e+02 -1.0571e+03 1.2882e+00 -9.3000e+02 -1.0286e+03 1.0583e+00 -9.3000e+02 -1.0000e+03 8.1915e-01 -9.3000e+02 -9.7143e+02 5.7048e-01 -9.3000e+02 -9.4286e+02 3.1195e-01 -9.3000e+02 -9.1429e+02 4.3236e-02 -9.3000e+02 -8.8571e+02 -2.3594e-01 -9.3000e+02 -8.5714e+02 -5.2583e-01 -9.3000e+02 -8.2857e+02 -8.2665e-01 -9.3000e+02 -8.0000e+02 -1.1386e+00 -9.3000e+02 -7.7143e+02 -1.4617e+00 -9.3000e+02 -7.4286e+02 -1.7961e+00 -9.3000e+02 -7.1429e+02 -2.1415e+00 -9.3000e+02 -6.8571e+02 -2.4980e+00 -9.3000e+02 -6.5714e+02 -2.8650e+00 -9.3000e+02 -6.2857e+02 -3.2422e+00 -9.3000e+02 -6.0000e+02 -3.6288e+00 -9.3000e+02 -5.7143e+02 -4.0240e+00 -9.3000e+02 -5.4286e+02 -4.4267e+00 -9.3000e+02 -5.1429e+02 -4.8354e+00 -9.3000e+02 -4.8571e+02 -5.2486e+00 -9.3000e+02 -4.5714e+02 -5.6643e+00 -9.3000e+02 -4.2857e+02 -6.0802e+00 -9.3000e+02 -4.0000e+02 -6.4937e+00 -9.3000e+02 -3.7143e+02 -6.9019e+00 -9.3000e+02 -3.4286e+02 -7.3018e+00 -9.3000e+02 -3.1429e+02 -7.6897e+00 -9.3000e+02 -2.8571e+02 -8.0621e+00 -9.3000e+02 -2.5714e+02 -8.4151e+00 -9.3000e+02 -2.2857e+02 -8.7448e+00 -9.3000e+02 -2.0000e+02 -9.0472e+00 -9.3000e+02 -1.7143e+02 -9.3185e+00 -9.3000e+02 -1.4286e+02 -9.5551e+00 -9.3000e+02 -1.1429e+02 -9.7537e+00 -9.3000e+02 -8.5714e+01 -9.9113e+00 -9.3000e+02 -5.7143e+01 -1.0026e+01 -9.3000e+02 -2.8571e+01 -1.0095e+01 -9.3000e+02 0.0000e+00 -1.0118e+01 -9.3000e+02 2.8571e+01 -1.0095e+01 -9.3000e+02 5.7143e+01 -1.0026e+01 -9.3000e+02 8.5714e+01 -9.9113e+00 -9.3000e+02 1.1429e+02 -9.7537e+00 -9.3000e+02 1.4286e+02 -9.5551e+00 -9.3000e+02 1.7143e+02 -9.3185e+00 -9.3000e+02 2.0000e+02 -9.0472e+00 -9.3000e+02 2.2857e+02 -8.7448e+00 -9.3000e+02 2.5714e+02 -8.4151e+00 -9.3000e+02 2.8571e+02 -8.0621e+00 -9.3000e+02 3.1429e+02 -7.6897e+00 -9.3000e+02 3.4286e+02 -7.3018e+00 -9.3000e+02 3.7143e+02 -6.9019e+00 -9.3000e+02 4.0000e+02 -6.4937e+00 -9.3000e+02 4.2857e+02 -6.0802e+00 -9.3000e+02 4.5714e+02 -5.6643e+00 -9.3000e+02 4.8571e+02 -5.2486e+00 -9.3000e+02 5.1429e+02 -4.8354e+00 -9.3000e+02 5.4286e+02 -4.4267e+00 -9.3000e+02 5.7143e+02 -4.0240e+00 -9.3000e+02 6.0000e+02 -3.6288e+00 -9.3000e+02 6.2857e+02 -3.2422e+00 -9.3000e+02 6.5714e+02 -2.8650e+00 -9.3000e+02 6.8571e+02 -2.4980e+00 -9.3000e+02 7.1429e+02 -2.1415e+00 -9.3000e+02 7.4286e+02 -1.7961e+00 -9.3000e+02 7.7143e+02 -1.4617e+00 -9.3000e+02 8.0000e+02 -1.1386e+00 -9.3000e+02 8.2857e+02 -8.2665e-01 -9.3000e+02 8.5714e+02 -5.2583e-01 -9.3000e+02 8.8571e+02 -2.3594e-01 -9.3000e+02 9.1429e+02 4.3236e-02 -9.3000e+02 9.4286e+02 3.1195e-01 -9.3000e+02 9.7143e+02 5.7048e-01 -9.3000e+02 1.0000e+03 8.1915e-01 -9.3000e+02 1.0286e+03 1.0583e+00 -9.3000e+02 1.0571e+03 1.2882e+00 -9.3000e+02 1.0857e+03 1.5093e+00 -9.3000e+02 1.1143e+03 1.7218e+00 -9.3000e+02 1.1429e+03 1.9262e+00 -9.3000e+02 1.1714e+03 2.1227e+00 -9.3000e+02 1.2000e+03 2.3118e+00 -9.3000e+02 1.2286e+03 2.4936e+00 -9.3000e+02 1.2571e+03 2.6685e+00 -9.3000e+02 1.2857e+03 2.8369e+00 -9.3000e+02 1.3143e+03 2.9989e+00 -9.3000e+02 1.3429e+03 3.1550e+00 -9.3000e+02 1.3714e+03 3.3053e+00 -9.3000e+02 1.4000e+03 3.4501e+00 -9.3000e+02 1.4286e+03 3.5897e+00 -9.3000e+02 1.4571e+03 3.7243e+00 -9.3000e+02 1.4857e+03 3.8541e+00 -9.3000e+02 1.5143e+03 3.9793e+00 -9.3000e+02 1.5429e+03 4.1002e+00 -9.3000e+02 1.5714e+03 4.2169e+00 -9.3000e+02 1.6000e+03 4.3296e+00 -9.3000e+02 1.6286e+03 4.4386e+00 -9.3000e+02 1.6571e+03 4.5438e+00 -9.3000e+02 1.6857e+03 4.6456e+00 -9.3000e+02 1.7143e+03 4.7441e+00 -9.3000e+02 1.7429e+03 4.8394e+00 -9.3000e+02 1.7714e+03 4.9316e+00 -9.3000e+02 1.8000e+03 5.0209e+00 -9.3000e+02 1.8286e+03 5.1074e+00 -9.3000e+02 1.8571e+03 5.1913e+00 -9.3000e+02 1.8857e+03 5.2725e+00 -9.3000e+02 1.9143e+03 5.3513e+00 -9.3000e+02 1.9429e+03 5.4278e+00 -9.3000e+02 1.9714e+03 5.5020e+00 -9.3000e+02 2.0000e+03 5.5740e+00 -9.6000e+02 -2.0000e+03 5.6088e+00 -9.6000e+02 -1.9714e+03 5.5383e+00 -9.6000e+02 -1.9429e+03 5.4658e+00 -9.6000e+02 -1.9143e+03 5.3911e+00 -9.6000e+02 -1.8857e+03 5.3141e+00 -9.6000e+02 -1.8571e+03 5.2348e+00 -9.6000e+02 -1.8286e+03 5.1531e+00 -9.6000e+02 -1.8000e+03 5.0687e+00 -9.6000e+02 -1.7714e+03 4.9818e+00 -9.6000e+02 -1.7429e+03 4.8920e+00 -9.6000e+02 -1.7143e+03 4.7994e+00 -9.6000e+02 -1.6857e+03 4.7037e+00 -9.6000e+02 -1.6571e+03 4.6049e+00 -9.6000e+02 -1.6286e+03 4.5028e+00 -9.6000e+02 -1.6000e+03 4.3973e+00 -9.6000e+02 -1.5714e+03 4.2882e+00 -9.6000e+02 -1.5429e+03 4.1753e+00 -9.6000e+02 -1.5143e+03 4.0585e+00 -9.6000e+02 -1.4857e+03 3.9377e+00 -9.6000e+02 -1.4571e+03 3.8126e+00 -9.6000e+02 -1.4286e+03 3.6831e+00 -9.6000e+02 -1.4000e+03 3.5489e+00 -9.6000e+02 -1.3714e+03 3.4099e+00 -9.6000e+02 -1.3429e+03 3.2658e+00 -9.6000e+02 -1.3143e+03 3.1164e+00 -9.6000e+02 -1.2857e+03 2.9615e+00 -9.6000e+02 -1.2571e+03 2.8008e+00 -9.6000e+02 -1.2286e+03 2.6341e+00 -9.6000e+02 -1.2000e+03 2.4612e+00 -9.6000e+02 -1.1714e+03 2.2817e+00 -9.6000e+02 -1.1429e+03 2.0955e+00 -9.6000e+02 -1.1143e+03 1.9022e+00 -9.6000e+02 -1.0857e+03 1.7016e+00 -9.6000e+02 -1.0571e+03 1.4934e+00 -9.6000e+02 -1.0286e+03 1.2774e+00 -9.6000e+02 -1.0000e+03 1.0533e+00 -9.6000e+02 -9.7143e+02 8.2075e-01 -9.6000e+02 -9.4286e+02 5.7963e-01 -9.6000e+02 -9.1429e+02 3.2971e-01 -9.6000e+02 -8.8571e+02 7.0775e-02 -9.6000e+02 -8.5714e+02 -1.9731e-01 -9.6000e+02 -8.2857e+02 -4.7467e-01 -9.6000e+02 -8.0000e+02 -7.6135e-01 -9.6000e+02 -7.7143e+02 -1.0574e+00 -9.6000e+02 -7.4286e+02 -1.3626e+00 -9.6000e+02 -7.1429e+02 -1.6769e+00 -9.6000e+02 -6.8571e+02 -2.0000e+00 -9.6000e+02 -6.5714e+02 -2.3315e+00 -9.6000e+02 -6.2857e+02 -2.6708e+00 -9.6000e+02 -6.0000e+02 -3.0172e+00 -9.6000e+02 -5.7143e+02 -3.3700e+00 -9.6000e+02 -5.4286e+02 -3.7279e+00 -9.6000e+02 -5.1429e+02 -4.0897e+00 -9.6000e+02 -4.8571e+02 -4.4539e+00 -9.6000e+02 -4.5714e+02 -4.8188e+00 -9.6000e+02 -4.2857e+02 -5.1824e+00 -9.6000e+02 -4.0000e+02 -5.5424e+00 -9.6000e+02 -3.7143e+02 -5.8964e+00 -9.6000e+02 -3.4286e+02 -6.2418e+00 -9.6000e+02 -3.1429e+02 -6.5756e+00 -9.6000e+02 -2.8571e+02 -6.8948e+00 -9.6000e+02 -2.5714e+02 -7.1964e+00 -9.6000e+02 -2.2857e+02 -7.4771e+00 -9.6000e+02 -2.0000e+02 -7.7339e+00 -9.6000e+02 -1.7143e+02 -7.9636e+00 -9.6000e+02 -1.4286e+02 -8.1635e+00 -9.6000e+02 -1.1429e+02 -8.3309e+00 -9.6000e+02 -8.5714e+01 -8.4636e+00 -9.6000e+02 -5.7143e+01 -8.5597e+00 -9.6000e+02 -2.8571e+01 -8.6180e+00 -9.6000e+02 0.0000e+00 -8.6375e+00 -9.6000e+02 2.8571e+01 -8.6180e+00 -9.6000e+02 5.7143e+01 -8.5597e+00 -9.6000e+02 8.5714e+01 -8.4636e+00 -9.6000e+02 1.1429e+02 -8.3309e+00 -9.6000e+02 1.4286e+02 -8.1635e+00 -9.6000e+02 1.7143e+02 -7.9636e+00 -9.6000e+02 2.0000e+02 -7.7339e+00 -9.6000e+02 2.2857e+02 -7.4771e+00 -9.6000e+02 2.5714e+02 -7.1964e+00 -9.6000e+02 2.8571e+02 -6.8948e+00 -9.6000e+02 3.1429e+02 -6.5756e+00 -9.6000e+02 3.4286e+02 -6.2418e+00 -9.6000e+02 3.7143e+02 -5.8964e+00 -9.6000e+02 4.0000e+02 -5.5424e+00 -9.6000e+02 4.2857e+02 -5.1824e+00 -9.6000e+02 4.5714e+02 -4.8188e+00 -9.6000e+02 4.8571e+02 -4.4539e+00 -9.6000e+02 5.1429e+02 -4.0897e+00 -9.6000e+02 5.4286e+02 -3.7279e+00 -9.6000e+02 5.7143e+02 -3.3700e+00 -9.6000e+02 6.0000e+02 -3.0172e+00 -9.6000e+02 6.2857e+02 -2.6708e+00 -9.6000e+02 6.5714e+02 -2.3315e+00 -9.6000e+02 6.8571e+02 -2.0000e+00 -9.6000e+02 7.1429e+02 -1.6769e+00 -9.6000e+02 7.4286e+02 -1.3626e+00 -9.6000e+02 7.7143e+02 -1.0574e+00 -9.6000e+02 8.0000e+02 -7.6135e-01 -9.6000e+02 8.2857e+02 -4.7467e-01 -9.6000e+02 8.5714e+02 -1.9731e-01 -9.6000e+02 8.8571e+02 7.0775e-02 -9.6000e+02 9.1429e+02 3.2971e-01 -9.6000e+02 9.4286e+02 5.7963e-01 -9.6000e+02 9.7143e+02 8.2075e-01 -9.6000e+02 1.0000e+03 1.0533e+00 -9.6000e+02 1.0286e+03 1.2774e+00 -9.6000e+02 1.0571e+03 1.4934e+00 -9.6000e+02 1.0857e+03 1.7016e+00 -9.6000e+02 1.1143e+03 1.9022e+00 -9.6000e+02 1.1429e+03 2.0955e+00 -9.6000e+02 1.1714e+03 2.2817e+00 -9.6000e+02 1.2000e+03 2.4612e+00 -9.6000e+02 1.2286e+03 2.6341e+00 -9.6000e+02 1.2571e+03 2.8008e+00 -9.6000e+02 1.2857e+03 2.9615e+00 -9.6000e+02 1.3143e+03 3.1164e+00 -9.6000e+02 1.3429e+03 3.2658e+00 -9.6000e+02 1.3714e+03 3.4099e+00 -9.6000e+02 1.4000e+03 3.5489e+00 -9.6000e+02 1.4286e+03 3.6831e+00 -9.6000e+02 1.4571e+03 3.8126e+00 -9.6000e+02 1.4857e+03 3.9377e+00 -9.6000e+02 1.5143e+03 4.0585e+00 -9.6000e+02 1.5429e+03 4.1753e+00 -9.6000e+02 1.5714e+03 4.2882e+00 -9.6000e+02 1.6000e+03 4.3973e+00 -9.6000e+02 1.6286e+03 4.5028e+00 -9.6000e+02 1.6571e+03 4.6049e+00 -9.6000e+02 1.6857e+03 4.7037e+00 -9.6000e+02 1.7143e+03 4.7994e+00 -9.6000e+02 1.7429e+03 4.8920e+00 -9.6000e+02 1.7714e+03 4.9818e+00 -9.6000e+02 1.8000e+03 5.0687e+00 -9.6000e+02 1.8286e+03 5.1531e+00 -9.6000e+02 1.8571e+03 5.2348e+00 -9.6000e+02 1.8857e+03 5.3141e+00 -9.6000e+02 1.9143e+03 5.3911e+00 -9.6000e+02 1.9429e+03 5.4658e+00 -9.6000e+02 1.9714e+03 5.5383e+00 -9.6000e+02 2.0000e+03 5.6088e+00 -9.9000e+02 -2.0000e+03 5.6439e+00 -9.9000e+02 -1.9714e+03 5.5750e+00 -9.9000e+02 -1.9429e+03 5.5041e+00 -9.9000e+02 -1.9143e+03 5.4312e+00 -9.9000e+02 -1.8857e+03 5.3560e+00 -9.9000e+02 -1.8571e+03 5.2787e+00 -9.9000e+02 -1.8286e+03 5.1989e+00 -9.9000e+02 -1.8000e+03 5.1168e+00 -9.9000e+02 -1.7714e+03 5.0321e+00 -9.9000e+02 -1.7429e+03 4.9448e+00 -9.9000e+02 -1.7143e+03 4.8548e+00 -9.9000e+02 -1.6857e+03 4.7619e+00 -9.9000e+02 -1.6571e+03 4.6660e+00 -9.9000e+02 -1.6286e+03 4.5670e+00 -9.9000e+02 -1.6000e+03 4.4648e+00 -9.9000e+02 -1.5714e+03 4.3592e+00 -9.9000e+02 -1.5429e+03 4.2502e+00 -9.9000e+02 -1.5143e+03 4.1374e+00 -9.9000e+02 -1.4857e+03 4.0209e+00 -9.9000e+02 -1.4571e+03 3.9004e+00 -9.9000e+02 -1.4286e+03 3.7757e+00 -9.9000e+02 -1.4000e+03 3.6468e+00 -9.9000e+02 -1.3714e+03 3.5133e+00 -9.9000e+02 -1.3429e+03 3.3752e+00 -9.9000e+02 -1.3143e+03 3.2322e+00 -9.9000e+02 -1.2857e+03 3.0842e+00 -9.9000e+02 -1.2571e+03 2.9309e+00 -9.9000e+02 -1.2286e+03 2.7721e+00 -9.9000e+02 -1.2000e+03 2.6077e+00 -9.9000e+02 -1.1714e+03 2.4373e+00 -9.9000e+02 -1.1429e+03 2.2608e+00 -9.9000e+02 -1.1143e+03 2.0780e+00 -9.9000e+02 -1.0857e+03 1.8887e+00 -9.9000e+02 -1.0571e+03 1.6926e+00 -9.9000e+02 -1.0286e+03 1.4896e+00 -9.9000e+02 -1.0000e+03 1.2794e+00 -9.9000e+02 -9.7143e+02 1.0619e+00 -9.9000e+02 -9.4286e+02 8.3695e-01 -9.9000e+02 -9.1429e+02 6.0433e-01 -9.9000e+02 -8.8571e+02 3.6398e-01 -9.9000e+02 -8.5714e+02 1.1583e-01 -9.9000e+02 -8.2857e+02 -1.4017e-01 -9.9000e+02 -8.0000e+02 -4.0398e-01 -9.9000e+02 -7.7143e+02 -6.7552e-01 -9.9000e+02 -7.4286e+02 -9.5465e-01 -9.9000e+02 -7.1429e+02 -1.2411e+00 -9.9000e+02 -6.8571e+02 -1.5346e+00 -9.9000e+02 -6.5714e+02 -1.8346e+00 -9.9000e+02 -6.2857e+02 -2.1407e+00 -9.9000e+02 -6.0000e+02 -2.4521e+00 -9.9000e+02 -5.7143e+02 -2.7679e+00 -9.9000e+02 -5.4286e+02 -3.0871e+00 -9.9000e+02 -5.1429e+02 -3.4086e+00 -9.9000e+02 -4.8571e+02 -3.7311e+00 -9.9000e+02 -4.5714e+02 -4.0529e+00 -9.9000e+02 -4.2857e+02 -4.3723e+00 -9.9000e+02 -4.0000e+02 -4.6874e+00 -9.9000e+02 -3.7143e+02 -4.9961e+00 -9.9000e+02 -3.4286e+02 -5.2961e+00 -9.9000e+02 -3.1429e+02 -5.5852e+00 -9.9000e+02 -2.8571e+02 -5.8607e+00 -9.9000e+02 -2.5714e+02 -6.1201e+00 -9.9000e+02 -2.2857e+02 -6.3609e+00 -9.9000e+02 -2.0000e+02 -6.5806e+00 -9.9000e+02 -1.7143e+02 -6.7767e+00 -9.9000e+02 -1.4286e+02 -6.9469e+00 -9.9000e+02 -1.1429e+02 -7.0892e+00 -9.9000e+02 -8.5714e+01 -7.2019e+00 -9.9000e+02 -5.7143e+01 -7.2834e+00 -9.9000e+02 -2.8571e+01 -7.3327e+00 -9.9000e+02 0.0000e+00 -7.3493e+00 -9.9000e+02 2.8571e+01 -7.3327e+00 -9.9000e+02 5.7143e+01 -7.2834e+00 -9.9000e+02 8.5714e+01 -7.2019e+00 -9.9000e+02 1.1429e+02 -7.0892e+00 -9.9000e+02 1.4286e+02 -6.9469e+00 -9.9000e+02 1.7143e+02 -6.7767e+00 -9.9000e+02 2.0000e+02 -6.5806e+00 -9.9000e+02 2.2857e+02 -6.3609e+00 -9.9000e+02 2.5714e+02 -6.1201e+00 -9.9000e+02 2.8571e+02 -5.8607e+00 -9.9000e+02 3.1429e+02 -5.5852e+00 -9.9000e+02 3.4286e+02 -5.2961e+00 -9.9000e+02 3.7143e+02 -4.9961e+00 -9.9000e+02 4.0000e+02 -4.6874e+00 -9.9000e+02 4.2857e+02 -4.3723e+00 -9.9000e+02 4.5714e+02 -4.0529e+00 -9.9000e+02 4.8571e+02 -3.7311e+00 -9.9000e+02 5.1429e+02 -3.4086e+00 -9.9000e+02 5.4286e+02 -3.0871e+00 -9.9000e+02 5.7143e+02 -2.7679e+00 -9.9000e+02 6.0000e+02 -2.4521e+00 -9.9000e+02 6.2857e+02 -2.1407e+00 -9.9000e+02 6.5714e+02 -1.8346e+00 -9.9000e+02 6.8571e+02 -1.5346e+00 -9.9000e+02 7.1429e+02 -1.2411e+00 -9.9000e+02 7.4286e+02 -9.5465e-01 -9.9000e+02 7.7143e+02 -6.7552e-01 -9.9000e+02 8.0000e+02 -4.0398e-01 -9.9000e+02 8.2857e+02 -1.4017e-01 -9.9000e+02 8.5714e+02 1.1583e-01 -9.9000e+02 8.8571e+02 3.6398e-01 -9.9000e+02 9.1429e+02 6.0433e-01 -9.9000e+02 9.4286e+02 8.3695e-01 -9.9000e+02 9.7143e+02 1.0619e+00 -9.9000e+02 1.0000e+03 1.2794e+00 -9.9000e+02 1.0286e+03 1.4896e+00 -9.9000e+02 1.0571e+03 1.6926e+00 -9.9000e+02 1.0857e+03 1.8887e+00 -9.9000e+02 1.1143e+03 2.0780e+00 -9.9000e+02 1.1429e+03 2.2608e+00 -9.9000e+02 1.1714e+03 2.4373e+00 -9.9000e+02 1.2000e+03 2.6077e+00 -9.9000e+02 1.2286e+03 2.7721e+00 -9.9000e+02 1.2571e+03 2.9309e+00 -9.9000e+02 1.2857e+03 3.0842e+00 -9.9000e+02 1.3143e+03 3.2322e+00 -9.9000e+02 1.3429e+03 3.3752e+00 -9.9000e+02 1.3714e+03 3.5133e+00 -9.9000e+02 1.4000e+03 3.6468e+00 -9.9000e+02 1.4286e+03 3.7757e+00 -9.9000e+02 1.4571e+03 3.9004e+00 -9.9000e+02 1.4857e+03 4.0209e+00 -9.9000e+02 1.5143e+03 4.1374e+00 -9.9000e+02 1.5429e+03 4.2502e+00 -9.9000e+02 1.5714e+03 4.3592e+00 -9.9000e+02 1.6000e+03 4.4648e+00 -9.9000e+02 1.6286e+03 4.5670e+00 -9.9000e+02 1.6571e+03 4.6660e+00 -9.9000e+02 1.6857e+03 4.7619e+00 -9.9000e+02 1.7143e+03 4.8548e+00 -9.9000e+02 1.7429e+03 4.9448e+00 -9.9000e+02 1.7714e+03 5.0321e+00 -9.9000e+02 1.8000e+03 5.1168e+00 -9.9000e+02 1.8286e+03 5.1989e+00 -9.9000e+02 1.8571e+03 5.2787e+00 -9.9000e+02 1.8857e+03 5.3560e+00 -9.9000e+02 1.9143e+03 5.4312e+00 -9.9000e+02 1.9429e+03 5.5041e+00 -9.9000e+02 1.9714e+03 5.5750e+00 -9.9000e+02 2.0000e+03 5.6439e+00 -1.0200e+03 -2.0000e+03 5.6794e+00 -1.0200e+03 -1.9714e+03 5.6120e+00 -1.0200e+03 -1.9429e+03 5.5427e+00 -1.0200e+03 -1.9143e+03 5.4715e+00 -1.0200e+03 -1.8857e+03 5.3982e+00 -1.0200e+03 -1.8571e+03 5.3227e+00 -1.0200e+03 -1.8286e+03 5.2450e+00 -1.0200e+03 -1.8000e+03 5.1650e+00 -1.0200e+03 -1.7714e+03 5.0826e+00 -1.0200e+03 -1.7429e+03 4.9977e+00 -1.0200e+03 -1.7143e+03 4.9103e+00 -1.0200e+03 -1.6857e+03 4.8201e+00 -1.0200e+03 -1.6571e+03 4.7271e+00 -1.0200e+03 -1.6286e+03 4.6311e+00 -1.0200e+03 -1.6000e+03 4.5322e+00 -1.0200e+03 -1.5714e+03 4.4301e+00 -1.0200e+03 -1.5429e+03 4.3247e+00 -1.0200e+03 -1.5143e+03 4.2159e+00 -1.0200e+03 -1.4857e+03 4.1035e+00 -1.0200e+03 -1.4571e+03 3.9874e+00 -1.0200e+03 -1.4286e+03 3.8675e+00 -1.0200e+03 -1.4000e+03 3.7436e+00 -1.0200e+03 -1.3714e+03 3.6156e+00 -1.0200e+03 -1.3429e+03 3.4833e+00 -1.0200e+03 -1.3143e+03 3.3464e+00 -1.0200e+03 -1.2857e+03 3.2050e+00 -1.0200e+03 -1.2571e+03 3.0587e+00 -1.0200e+03 -1.2286e+03 2.9075e+00 -1.0200e+03 -1.2000e+03 2.7511e+00 -1.0200e+03 -1.1714e+03 2.5894e+00 -1.0200e+03 -1.1429e+03 2.4222e+00 -1.0200e+03 -1.1143e+03 2.2493e+00 -1.0200e+03 -1.0857e+03 2.0706e+00 -1.0200e+03 -1.0571e+03 1.8858e+00 -1.0200e+03 -1.0286e+03 1.6950e+00 -1.0200e+03 -1.0000e+03 1.4978e+00 -1.0200e+03 -9.7143e+02 1.2943e+00 -1.0200e+03 -9.4286e+02 1.0842e+00 -1.0200e+03 -9.1429e+02 8.6755e-01 -1.0200e+03 -8.8571e+02 6.4427e-01 -1.0200e+03 -8.5714e+02 4.1434e-01 -1.0200e+03 -8.2857e+02 1.7780e-01 -1.0200e+03 -8.0000e+02 -6.5281e-02 -1.0200e+03 -7.7143e+02 -3.1476e-01 -1.0200e+03 -7.4286e+02 -5.7042e-01 -1.0200e+03 -7.1429e+02 -8.3201e-01 -1.0200e+03 -6.8571e+02 -1.0991e+00 -1.0200e+03 -6.5714e+02 -1.3714e+00 -1.0200e+03 -6.2857e+02 -1.6481e+00 -1.0200e+03 -6.0000e+02 -1.9287e+00 -1.0200e+03 -5.7143e+02 -2.2123e+00 -1.0200e+03 -5.4286e+02 -2.4981e+00 -1.0200e+03 -5.1429e+02 -2.7848e+00 -1.0200e+03 -4.8571e+02 -3.0714e+00 -1.0200e+03 -4.5714e+02 -3.3564e+00 -1.0200e+03 -4.2857e+02 -3.6383e+00 -1.0200e+03 -4.0000e+02 -3.9154e+00 -1.0200e+03 -3.7143e+02 -4.1861e+00 -1.0200e+03 -3.4286e+02 -4.4482e+00 -1.0200e+03 -3.1429e+02 -4.7000e+00 -1.0200e+03 -2.8571e+02 -4.9393e+00 -1.0200e+03 -2.5714e+02 -5.1639e+00 -1.0200e+03 -2.2857e+02 -5.3719e+00 -1.0200e+03 -2.0000e+02 -5.5612e+00 -1.0200e+03 -1.7143e+02 -5.7298e+00 -1.0200e+03 -1.4286e+02 -5.8759e+00 -1.0200e+03 -1.1429e+02 -5.9978e+00 -1.0200e+03 -8.5714e+01 -6.0942e+00 -1.0200e+03 -5.7143e+01 -6.1639e+00 -1.0200e+03 -2.8571e+01 -6.2060e+00 -1.0200e+03 0.0000e+00 -6.2201e+00 -1.0200e+03 2.8571e+01 -6.2060e+00 -1.0200e+03 5.7143e+01 -6.1639e+00 -1.0200e+03 8.5714e+01 -6.0942e+00 -1.0200e+03 1.1429e+02 -5.9978e+00 -1.0200e+03 1.4286e+02 -5.8759e+00 -1.0200e+03 1.7143e+02 -5.7298e+00 -1.0200e+03 2.0000e+02 -5.5612e+00 -1.0200e+03 2.2857e+02 -5.3719e+00 -1.0200e+03 2.5714e+02 -5.1639e+00 -1.0200e+03 2.8571e+02 -4.9393e+00 -1.0200e+03 3.1429e+02 -4.7000e+00 -1.0200e+03 3.4286e+02 -4.4482e+00 -1.0200e+03 3.7143e+02 -4.1861e+00 -1.0200e+03 4.0000e+02 -3.9154e+00 -1.0200e+03 4.2857e+02 -3.6383e+00 -1.0200e+03 4.5714e+02 -3.3564e+00 -1.0200e+03 4.8571e+02 -3.0714e+00 -1.0200e+03 5.1429e+02 -2.7848e+00 -1.0200e+03 5.4286e+02 -2.4981e+00 -1.0200e+03 5.7143e+02 -2.2123e+00 -1.0200e+03 6.0000e+02 -1.9287e+00 -1.0200e+03 6.2857e+02 -1.6481e+00 -1.0200e+03 6.5714e+02 -1.3714e+00 -1.0200e+03 6.8571e+02 -1.0991e+00 -1.0200e+03 7.1429e+02 -8.3201e-01 -1.0200e+03 7.4286e+02 -5.7042e-01 -1.0200e+03 7.7143e+02 -3.1476e-01 -1.0200e+03 8.0000e+02 -6.5281e-02 -1.0200e+03 8.2857e+02 1.7780e-01 -1.0200e+03 8.5714e+02 4.1434e-01 -1.0200e+03 8.8571e+02 6.4427e-01 -1.0200e+03 9.1429e+02 8.6755e-01 -1.0200e+03 9.4286e+02 1.0842e+00 -1.0200e+03 9.7143e+02 1.2943e+00 -1.0200e+03 1.0000e+03 1.4978e+00 -1.0200e+03 1.0286e+03 1.6950e+00 -1.0200e+03 1.0571e+03 1.8858e+00 -1.0200e+03 1.0857e+03 2.0706e+00 -1.0200e+03 1.1143e+03 2.2493e+00 -1.0200e+03 1.1429e+03 2.4222e+00 -1.0200e+03 1.1714e+03 2.5894e+00 -1.0200e+03 1.2000e+03 2.7511e+00 -1.0200e+03 1.2286e+03 2.9075e+00 -1.0200e+03 1.2571e+03 3.0587e+00 -1.0200e+03 1.2857e+03 3.2050e+00 -1.0200e+03 1.3143e+03 3.3464e+00 -1.0200e+03 1.3429e+03 3.4833e+00 -1.0200e+03 1.3714e+03 3.6156e+00 -1.0200e+03 1.4000e+03 3.7436e+00 -1.0200e+03 1.4286e+03 3.8675e+00 -1.0200e+03 1.4571e+03 3.9874e+00 -1.0200e+03 1.4857e+03 4.1035e+00 -1.0200e+03 1.5143e+03 4.2159e+00 -1.0200e+03 1.5429e+03 4.3247e+00 -1.0200e+03 1.5714e+03 4.4301e+00 -1.0200e+03 1.6000e+03 4.5322e+00 -1.0200e+03 1.6286e+03 4.6311e+00 -1.0200e+03 1.6571e+03 4.7271e+00 -1.0200e+03 1.6857e+03 4.8201e+00 -1.0200e+03 1.7143e+03 4.9103e+00 -1.0200e+03 1.7429e+03 4.9977e+00 -1.0200e+03 1.7714e+03 5.0826e+00 -1.0200e+03 1.8000e+03 5.1650e+00 -1.0200e+03 1.8286e+03 5.2450e+00 -1.0200e+03 1.8571e+03 5.3227e+00 -1.0200e+03 1.8857e+03 5.3982e+00 -1.0200e+03 1.9143e+03 5.4715e+00 -1.0200e+03 1.9429e+03 5.5427e+00 -1.0200e+03 1.9714e+03 5.6120e+00 -1.0200e+03 2.0000e+03 5.6794e+00 -1.0500e+03 -2.0000e+03 5.7151e+00 -1.0500e+03 -1.9714e+03 5.6492e+00 -1.0500e+03 -1.9429e+03 5.5816e+00 -1.0500e+03 -1.9143e+03 5.5120e+00 -1.0500e+03 -1.8857e+03 5.4405e+00 -1.0500e+03 -1.8571e+03 5.3669e+00 -1.0500e+03 -1.8286e+03 5.2913e+00 -1.0500e+03 -1.8000e+03 5.2134e+00 -1.0500e+03 -1.7714e+03 5.1332e+00 -1.0500e+03 -1.7429e+03 5.0507e+00 -1.0500e+03 -1.7143e+03 4.9657e+00 -1.0500e+03 -1.6857e+03 4.8782e+00 -1.0500e+03 -1.6571e+03 4.7880e+00 -1.0500e+03 -1.6286e+03 4.6951e+00 -1.0500e+03 -1.6000e+03 4.5993e+00 -1.0500e+03 -1.5714e+03 4.5006e+00 -1.0500e+03 -1.5429e+03 4.3988e+00 -1.0500e+03 -1.5143e+03 4.2938e+00 -1.0500e+03 -1.4857e+03 4.1855e+00 -1.0500e+03 -1.4571e+03 4.0737e+00 -1.0500e+03 -1.4286e+03 3.9584e+00 -1.0500e+03 -1.4000e+03 3.8394e+00 -1.0500e+03 -1.3714e+03 3.7166e+00 -1.0500e+03 -1.3429e+03 3.5898e+00 -1.0500e+03 -1.3143e+03 3.4589e+00 -1.0500e+03 -1.2857e+03 3.3238e+00 -1.0500e+03 -1.2571e+03 3.1843e+00 -1.0500e+03 -1.2286e+03 3.0402e+00 -1.0500e+03 -1.2000e+03 2.8915e+00 -1.0500e+03 -1.1714e+03 2.7380e+00 -1.0500e+03 -1.1429e+03 2.5795e+00 -1.0500e+03 -1.1143e+03 2.4160e+00 -1.0500e+03 -1.0857e+03 2.2472e+00 -1.0500e+03 -1.0571e+03 2.0731e+00 -1.0500e+03 -1.0286e+03 1.8936e+00 -1.0500e+03 -1.0000e+03 1.7086e+00 -1.0500e+03 -9.7143e+02 1.5180e+00 -1.0500e+03 -9.4286e+02 1.3217e+00 -1.0500e+03 -9.1429e+02 1.1198e+00 -1.0500e+03 -8.8571e+02 9.1220e-01 -1.0500e+03 -8.5714e+02 6.9895e-01 -1.0500e+03 -8.2857e+02 4.8013e-01 -1.0500e+03 -8.0000e+02 2.5587e-01 -1.0500e+03 -7.7143e+02 2.6339e-02 -1.0500e+03 -7.4286e+02 -2.0822e-01 -1.0500e+03 -7.1429e+02 -4.4752e-01 -1.0500e+03 -6.8571e+02 -6.9116e-01 -1.0500e+03 -6.5714e+02 -9.3869e-01 -1.0500e+03 -6.2857e+02 -1.1896e+00 -1.0500e+03 -6.0000e+02 -1.4431e+00 -1.0500e+03 -5.7143e+02 -1.6986e+00 -1.0500e+03 -5.4286e+02 -1.9552e+00 -1.0500e+03 -5.1429e+02 -2.2118e+00 -1.0500e+03 -4.8571e+02 -2.4675e+00 -1.0500e+03 -4.5714e+02 -2.7209e+00 -1.0500e+03 -4.2857e+02 -2.9708e+00 -1.0500e+03 -4.0000e+02 -3.2157e+00 -1.0500e+03 -3.7143e+02 -3.4541e+00 -1.0500e+03 -3.4286e+02 -3.6844e+00 -1.0500e+03 -3.1429e+02 -3.9049e+00 -1.0500e+03 -2.8571e+02 -4.1139e+00 -1.0500e+03 -2.5714e+02 -4.3097e+00 -1.0500e+03 -2.2857e+02 -4.4905e+00 -1.0500e+03 -2.0000e+02 -4.6547e+00 -1.0500e+03 -1.7143e+02 -4.8006e+00 -1.0500e+03 -1.4286e+02 -4.9268e+00 -1.0500e+03 -1.1429e+02 -5.0320e+00 -1.0500e+03 -8.5714e+01 -5.1151e+00 -1.0500e+03 -5.7143e+01 -5.1751e+00 -1.0500e+03 -2.8571e+01 -5.2114e+00 -1.0500e+03 0.0000e+00 -5.2235e+00 -1.0500e+03 2.8571e+01 -5.2114e+00 -1.0500e+03 5.7143e+01 -5.1751e+00 -1.0500e+03 8.5714e+01 -5.1151e+00 -1.0500e+03 1.1429e+02 -5.0320e+00 -1.0500e+03 1.4286e+02 -4.9268e+00 -1.0500e+03 1.7143e+02 -4.8006e+00 -1.0500e+03 2.0000e+02 -4.6547e+00 -1.0500e+03 2.2857e+02 -4.4905e+00 -1.0500e+03 2.5714e+02 -4.3097e+00 -1.0500e+03 2.8571e+02 -4.1139e+00 -1.0500e+03 3.1429e+02 -3.9049e+00 -1.0500e+03 3.4286e+02 -3.6844e+00 -1.0500e+03 3.7143e+02 -3.4541e+00 -1.0500e+03 4.0000e+02 -3.2157e+00 -1.0500e+03 4.2857e+02 -2.9708e+00 -1.0500e+03 4.5714e+02 -2.7209e+00 -1.0500e+03 4.8571e+02 -2.4675e+00 -1.0500e+03 5.1429e+02 -2.2118e+00 -1.0500e+03 5.4286e+02 -1.9552e+00 -1.0500e+03 5.7143e+02 -1.6986e+00 -1.0500e+03 6.0000e+02 -1.4431e+00 -1.0500e+03 6.2857e+02 -1.1896e+00 -1.0500e+03 6.5714e+02 -9.3869e-01 -1.0500e+03 6.8571e+02 -6.9116e-01 -1.0500e+03 7.1429e+02 -4.4752e-01 -1.0500e+03 7.4286e+02 -2.0822e-01 -1.0500e+03 7.7143e+02 2.6339e-02 -1.0500e+03 8.0000e+02 2.5587e-01 -1.0500e+03 8.2857e+02 4.8013e-01 -1.0500e+03 8.5714e+02 6.9895e-01 -1.0500e+03 8.8571e+02 9.1220e-01 -1.0500e+03 9.1429e+02 1.1198e+00 -1.0500e+03 9.4286e+02 1.3217e+00 -1.0500e+03 9.7143e+02 1.5180e+00 -1.0500e+03 1.0000e+03 1.7086e+00 -1.0500e+03 1.0286e+03 1.8936e+00 -1.0500e+03 1.0571e+03 2.0731e+00 -1.0500e+03 1.0857e+03 2.2472e+00 -1.0500e+03 1.1143e+03 2.4160e+00 -1.0500e+03 1.1429e+03 2.5795e+00 -1.0500e+03 1.1714e+03 2.7380e+00 -1.0500e+03 1.2000e+03 2.8915e+00 -1.0500e+03 1.2286e+03 3.0402e+00 -1.0500e+03 1.2571e+03 3.1843e+00 -1.0500e+03 1.2857e+03 3.3238e+00 -1.0500e+03 1.3143e+03 3.4589e+00 -1.0500e+03 1.3429e+03 3.5898e+00 -1.0500e+03 1.3714e+03 3.7166e+00 -1.0500e+03 1.4000e+03 3.8394e+00 -1.0500e+03 1.4286e+03 3.9584e+00 -1.0500e+03 1.4571e+03 4.0737e+00 -1.0500e+03 1.4857e+03 4.1855e+00 -1.0500e+03 1.5143e+03 4.2938e+00 -1.0500e+03 1.5429e+03 4.3988e+00 -1.0500e+03 1.5714e+03 4.5006e+00 -1.0500e+03 1.6000e+03 4.5993e+00 -1.0500e+03 1.6286e+03 4.6951e+00 -1.0500e+03 1.6571e+03 4.7880e+00 -1.0500e+03 1.6857e+03 4.8782e+00 -1.0500e+03 1.7143e+03 4.9657e+00 -1.0500e+03 1.7429e+03 5.0507e+00 -1.0500e+03 1.7714e+03 5.1332e+00 -1.0500e+03 1.8000e+03 5.2134e+00 -1.0500e+03 1.8286e+03 5.2913e+00 -1.0500e+03 1.8571e+03 5.3669e+00 -1.0500e+03 1.8857e+03 5.4405e+00 -1.0500e+03 1.9143e+03 5.5120e+00 -1.0500e+03 1.9429e+03 5.5816e+00 -1.0500e+03 1.9714e+03 5.6492e+00 -1.0500e+03 2.0000e+03 5.7151e+00 -1.0800e+03 -2.0000e+03 5.7510e+00 -1.0800e+03 -1.9714e+03 5.6866e+00 -1.0800e+03 -1.9429e+03 5.6206e+00 -1.0800e+03 -1.9143e+03 5.5527e+00 -1.0800e+03 -1.8857e+03 5.4830e+00 -1.0800e+03 -1.8571e+03 5.4113e+00 -1.0800e+03 -1.8286e+03 5.3376e+00 -1.0800e+03 -1.8000e+03 5.2618e+00 -1.0800e+03 -1.7714e+03 5.1838e+00 -1.0800e+03 -1.7429e+03 5.1037e+00 -1.0800e+03 -1.7143e+03 5.0212e+00 -1.0800e+03 -1.6857e+03 4.9362e+00 -1.0800e+03 -1.6571e+03 4.8488e+00 -1.0800e+03 -1.6286e+03 4.7588e+00 -1.0800e+03 -1.6000e+03 4.6662e+00 -1.0800e+03 -1.5714e+03 4.5707e+00 -1.0800e+03 -1.5429e+03 4.4724e+00 -1.0800e+03 -1.5143e+03 4.3711e+00 -1.0800e+03 -1.4857e+03 4.2667e+00 -1.0800e+03 -1.4571e+03 4.1592e+00 -1.0800e+03 -1.4286e+03 4.0483e+00 -1.0800e+03 -1.4000e+03 3.9340e+00 -1.0800e+03 -1.3714e+03 3.8162e+00 -1.0800e+03 -1.3429e+03 3.6948e+00 -1.0800e+03 -1.3143e+03 3.5695e+00 -1.0800e+03 -1.2857e+03 3.4405e+00 -1.0800e+03 -1.2571e+03 3.3074e+00 -1.0800e+03 -1.2286e+03 3.1702e+00 -1.0800e+03 -1.2000e+03 3.0287e+00 -1.0800e+03 -1.1714e+03 2.8830e+00 -1.0800e+03 -1.1429e+03 2.7328e+00 -1.0800e+03 -1.1143e+03 2.5780e+00 -1.0800e+03 -1.0857e+03 2.4187e+00 -1.0800e+03 -1.0571e+03 2.2546e+00 -1.0800e+03 -1.0286e+03 2.0857e+00 -1.0800e+03 -1.0000e+03 1.9120e+00 -1.0800e+03 -9.7143e+02 1.7334e+00 -1.0800e+03 -9.4286e+02 1.5499e+00 -1.0800e+03 -9.1429e+02 1.3616e+00 -1.0800e+03 -8.8571e+02 1.1684e+00 -1.0800e+03 -8.5714e+02 9.7037e-01 -1.0800e+03 -8.2857e+02 7.6771e-01 -1.0800e+03 -8.0000e+02 5.6054e-01 -1.0800e+03 -7.7143e+02 3.4905e-01 -1.0800e+03 -7.4286e+02 1.3351e-01 -1.0800e+03 -7.1429e+02 -8.5786e-02 -1.0800e+03 -6.8571e+02 -3.0845e-01 -1.0800e+03 -6.5714e+02 -5.3402e-01 -1.0800e+03 -6.2857e+02 -7.6197e-01 -1.0800e+03 -6.0000e+02 -9.9170e-01 -1.0800e+03 -5.7143e+02 -1.2225e+00 -1.0800e+03 -5.4286e+02 -1.4536e+00 -1.0800e+03 -5.1429e+02 -1.6840e+00 -1.0800e+03 -4.8571e+02 -1.9129e+00 -1.0800e+03 -4.5714e+02 -2.1392e+00 -1.0800e+03 -4.2857e+02 -2.3616e+00 -1.0800e+03 -4.0000e+02 -2.5790e+00 -1.0800e+03 -3.7143e+02 -2.7900e+00 -1.0800e+03 -3.4286e+02 -2.9933e+00 -1.0800e+03 -3.1429e+02 -3.1875e+00 -1.0800e+03 -2.8571e+02 -3.3710e+00 -1.0800e+03 -2.5714e+02 -3.5426e+00 -1.0800e+03 -2.2857e+02 -3.7006e+00 -1.0800e+03 -2.0000e+02 -3.8439e+00 -1.0800e+03 -1.7143e+02 -3.9710e+00 -1.0800e+03 -1.4286e+02 -4.0808e+00 -1.0800e+03 -1.1429e+02 -4.1722e+00 -1.0800e+03 -8.5714e+01 -4.2443e+00 -1.0800e+03 -5.7143e+01 -4.2963e+00 -1.0800e+03 -2.8571e+01 -4.3278e+00 -1.0800e+03 0.0000e+00 -4.3383e+00 -1.0800e+03 2.8571e+01 -4.3278e+00 -1.0800e+03 5.7143e+01 -4.2963e+00 -1.0800e+03 8.5714e+01 -4.2443e+00 -1.0800e+03 1.1429e+02 -4.1722e+00 -1.0800e+03 1.4286e+02 -4.0808e+00 -1.0800e+03 1.7143e+02 -3.9710e+00 -1.0800e+03 2.0000e+02 -3.8439e+00 -1.0800e+03 2.2857e+02 -3.7006e+00 -1.0800e+03 2.5714e+02 -3.5426e+00 -1.0800e+03 2.8571e+02 -3.3710e+00 -1.0800e+03 3.1429e+02 -3.1875e+00 -1.0800e+03 3.4286e+02 -2.9933e+00 -1.0800e+03 3.7143e+02 -2.7900e+00 -1.0800e+03 4.0000e+02 -2.5790e+00 -1.0800e+03 4.2857e+02 -2.3616e+00 -1.0800e+03 4.5714e+02 -2.1392e+00 -1.0800e+03 4.8571e+02 -1.9129e+00 -1.0800e+03 5.1429e+02 -1.6840e+00 -1.0800e+03 5.4286e+02 -1.4536e+00 -1.0800e+03 5.7143e+02 -1.2225e+00 -1.0800e+03 6.0000e+02 -9.9170e-01 -1.0800e+03 6.2857e+02 -7.6197e-01 -1.0800e+03 6.5714e+02 -5.3402e-01 -1.0800e+03 6.8571e+02 -3.0845e-01 -1.0800e+03 7.1429e+02 -8.5786e-02 -1.0800e+03 7.4286e+02 1.3351e-01 -1.0800e+03 7.7143e+02 3.4905e-01 -1.0800e+03 8.0000e+02 5.6054e-01 -1.0800e+03 8.2857e+02 7.6771e-01 -1.0800e+03 8.5714e+02 9.7037e-01 -1.0800e+03 8.8571e+02 1.1684e+00 -1.0800e+03 9.1429e+02 1.3616e+00 -1.0800e+03 9.4286e+02 1.5499e+00 -1.0800e+03 9.7143e+02 1.7334e+00 -1.0800e+03 1.0000e+03 1.9120e+00 -1.0800e+03 1.0286e+03 2.0857e+00 -1.0800e+03 1.0571e+03 2.2546e+00 -1.0800e+03 1.0857e+03 2.4187e+00 -1.0800e+03 1.1143e+03 2.5780e+00 -1.0800e+03 1.1429e+03 2.7328e+00 -1.0800e+03 1.1714e+03 2.8830e+00 -1.0800e+03 1.2000e+03 3.0287e+00 -1.0800e+03 1.2286e+03 3.1702e+00 -1.0800e+03 1.2571e+03 3.3074e+00 -1.0800e+03 1.2857e+03 3.4405e+00 -1.0800e+03 1.3143e+03 3.5695e+00 -1.0800e+03 1.3429e+03 3.6948e+00 -1.0800e+03 1.3714e+03 3.8162e+00 -1.0800e+03 1.4000e+03 3.9340e+00 -1.0800e+03 1.4286e+03 4.0483e+00 -1.0800e+03 1.4571e+03 4.1592e+00 -1.0800e+03 1.4857e+03 4.2667e+00 -1.0800e+03 1.5143e+03 4.3711e+00 -1.0800e+03 1.5429e+03 4.4724e+00 -1.0800e+03 1.5714e+03 4.5707e+00 -1.0800e+03 1.6000e+03 4.6662e+00 -1.0800e+03 1.6286e+03 4.7588e+00 -1.0800e+03 1.6571e+03 4.8488e+00 -1.0800e+03 1.6857e+03 4.9362e+00 -1.0800e+03 1.7143e+03 5.0212e+00 -1.0800e+03 1.7429e+03 5.1037e+00 -1.0800e+03 1.7714e+03 5.1838e+00 -1.0800e+03 1.8000e+03 5.2618e+00 -1.0800e+03 1.8286e+03 5.3376e+00 -1.0800e+03 1.8571e+03 5.4113e+00 -1.0800e+03 1.8857e+03 5.4830e+00 -1.0800e+03 1.9143e+03 5.5527e+00 -1.0800e+03 1.9429e+03 5.6206e+00 -1.0800e+03 1.9714e+03 5.6866e+00 -1.0800e+03 2.0000e+03 5.7510e+00 -1.1100e+03 -2.0000e+03 5.7870e+00 -1.1100e+03 -1.9714e+03 5.7242e+00 -1.1100e+03 -1.9429e+03 5.6597e+00 -1.1100e+03 -1.9143e+03 5.5935e+00 -1.1100e+03 -1.8857e+03 5.5255e+00 -1.1100e+03 -1.8571e+03 5.4557e+00 -1.1100e+03 -1.8286e+03 5.3839e+00 -1.1100e+03 -1.8000e+03 5.3102e+00 -1.1100e+03 -1.7714e+03 5.2344e+00 -1.1100e+03 -1.7429e+03 5.1565e+00 -1.1100e+03 -1.7143e+03 5.0764e+00 -1.1100e+03 -1.6857e+03 4.9941e+00 -1.1100e+03 -1.6571e+03 4.9094e+00 -1.1100e+03 -1.6286e+03 4.8223e+00 -1.1100e+03 -1.6000e+03 4.7326e+00 -1.1100e+03 -1.5714e+03 4.6404e+00 -1.1100e+03 -1.5429e+03 4.5455e+00 -1.1100e+03 -1.5143e+03 4.4478e+00 -1.1100e+03 -1.4857e+03 4.3472e+00 -1.1100e+03 -1.4571e+03 4.2437e+00 -1.1100e+03 -1.4286e+03 4.1371e+00 -1.1100e+03 -1.4000e+03 4.0274e+00 -1.1100e+03 -1.3714e+03 3.9144e+00 -1.1100e+03 -1.3429e+03 3.7981e+00 -1.1100e+03 -1.3143e+03 3.6783e+00 -1.1100e+03 -1.2857e+03 3.5550e+00 -1.1100e+03 -1.2571e+03 3.4280e+00 -1.1100e+03 -1.2286e+03 3.2973e+00 -1.1100e+03 -1.2000e+03 3.1628e+00 -1.1100e+03 -1.1714e+03 3.0244e+00 -1.1100e+03 -1.1429e+03 2.8821e+00 -1.1100e+03 -1.1143e+03 2.7356e+00 -1.1100e+03 -1.0857e+03 2.5851e+00 -1.1100e+03 -1.0571e+03 2.4303e+00 -1.1100e+03 -1.0286e+03 2.2714e+00 -1.1100e+03 -1.0000e+03 2.1082e+00 -1.1100e+03 -9.7143e+02 1.9408e+00 -1.1100e+03 -9.4286e+02 1.7691e+00 -1.1100e+03 -9.1429e+02 1.5933e+00 -1.1100e+03 -8.8571e+02 1.4133e+00 -1.1100e+03 -8.5714e+02 1.2293e+00 -1.1100e+03 -8.2857e+02 1.0414e+00 -1.1100e+03 -8.0000e+02 8.4975e-01 -1.1100e+03 -7.7143e+02 6.5461e-01 -1.1100e+03 -7.4286e+02 4.5622e-01 -1.1100e+03 -7.1429e+02 2.5490e-01 -1.1100e+03 -6.8571e+02 5.1018e-02 -1.1100e+03 -6.5714e+02 -1.5498e-01 -1.1100e+03 -6.2857e+02 -3.6260e-01 -1.1100e+03 -6.0000e+02 -5.7126e-01 -1.1100e+03 -5.7143e+02 -7.8032e-01 -1.1100e+03 -5.4286e+02 -9.8905e-01 -1.1100e+03 -5.1429e+02 -1.1967e+00 -1.1100e+03 -4.8571e+02 -1.4023e+00 -1.1100e+03 -4.5714e+02 -1.6050e+00 -1.1100e+03 -4.2857e+02 -1.8038e+00 -1.1100e+03 -4.0000e+02 -1.9975e+00 -1.1100e+03 -3.7143e+02 -2.1851e+00 -1.1100e+03 -3.4286e+02 -2.3654e+00 -1.1100e+03 -3.1429e+02 -2.5372e+00 -1.1100e+03 -2.8571e+02 -2.6992e+00 -1.1100e+03 -2.5714e+02 -2.8503e+00 -1.1100e+03 -2.2857e+02 -2.9893e+00 -1.1100e+03 -2.0000e+02 -3.1150e+00 -1.1100e+03 -1.7143e+02 -3.2264e+00 -1.1100e+03 -1.4286e+02 -3.3225e+00 -1.1100e+03 -1.1429e+02 -3.4024e+00 -1.1100e+03 -8.5714e+01 -3.4653e+00 -1.1100e+03 -5.7143e+01 -3.5107e+00 -1.1100e+03 -2.8571e+01 -3.5381e+00 -1.1100e+03 0.0000e+00 -3.5473e+00 -1.1100e+03 2.8571e+01 -3.5381e+00 -1.1100e+03 5.7143e+01 -3.5107e+00 -1.1100e+03 8.5714e+01 -3.4653e+00 -1.1100e+03 1.1429e+02 -3.4024e+00 -1.1100e+03 1.4286e+02 -3.3225e+00 -1.1100e+03 1.7143e+02 -3.2264e+00 -1.1100e+03 2.0000e+02 -3.1150e+00 -1.1100e+03 2.2857e+02 -2.9893e+00 -1.1100e+03 2.5714e+02 -2.8503e+00 -1.1100e+03 2.8571e+02 -2.6992e+00 -1.1100e+03 3.1429e+02 -2.5372e+00 -1.1100e+03 3.4286e+02 -2.3654e+00 -1.1100e+03 3.7143e+02 -2.1851e+00 -1.1100e+03 4.0000e+02 -1.9975e+00 -1.1100e+03 4.2857e+02 -1.8038e+00 -1.1100e+03 4.5714e+02 -1.6050e+00 -1.1100e+03 4.8571e+02 -1.4023e+00 -1.1100e+03 5.1429e+02 -1.1967e+00 -1.1100e+03 5.4286e+02 -9.8905e-01 -1.1100e+03 5.7143e+02 -7.8032e-01 -1.1100e+03 6.0000e+02 -5.7126e-01 -1.1100e+03 6.2857e+02 -3.6260e-01 -1.1100e+03 6.5714e+02 -1.5498e-01 -1.1100e+03 6.8571e+02 5.1018e-02 -1.1100e+03 7.1429e+02 2.5490e-01 -1.1100e+03 7.4286e+02 4.5622e-01 -1.1100e+03 7.7143e+02 6.5461e-01 -1.1100e+03 8.0000e+02 8.4975e-01 -1.1100e+03 8.2857e+02 1.0414e+00 -1.1100e+03 8.5714e+02 1.2293e+00 -1.1100e+03 8.8571e+02 1.4133e+00 -1.1100e+03 9.1429e+02 1.5933e+00 -1.1100e+03 9.4286e+02 1.7691e+00 -1.1100e+03 9.7143e+02 1.9408e+00 -1.1100e+03 1.0000e+03 2.1082e+00 -1.1100e+03 1.0286e+03 2.2714e+00 -1.1100e+03 1.0571e+03 2.4303e+00 -1.1100e+03 1.0857e+03 2.5851e+00 -1.1100e+03 1.1143e+03 2.7356e+00 -1.1100e+03 1.1429e+03 2.8821e+00 -1.1100e+03 1.1714e+03 3.0244e+00 -1.1100e+03 1.2000e+03 3.1628e+00 -1.1100e+03 1.2286e+03 3.2973e+00 -1.1100e+03 1.2571e+03 3.4280e+00 -1.1100e+03 1.2857e+03 3.5550e+00 -1.1100e+03 1.3143e+03 3.6783e+00 -1.1100e+03 1.3429e+03 3.7981e+00 -1.1100e+03 1.3714e+03 3.9144e+00 -1.1100e+03 1.4000e+03 4.0274e+00 -1.1100e+03 1.4286e+03 4.1371e+00 -1.1100e+03 1.4571e+03 4.2437e+00 -1.1100e+03 1.4857e+03 4.3472e+00 -1.1100e+03 1.5143e+03 4.4478e+00 -1.1100e+03 1.5429e+03 4.5455e+00 -1.1100e+03 1.5714e+03 4.6404e+00 -1.1100e+03 1.6000e+03 4.7326e+00 -1.1100e+03 1.6286e+03 4.8223e+00 -1.1100e+03 1.6571e+03 4.9094e+00 -1.1100e+03 1.6857e+03 4.9941e+00 -1.1100e+03 1.7143e+03 5.0764e+00 -1.1100e+03 1.7429e+03 5.1565e+00 -1.1100e+03 1.7714e+03 5.2344e+00 -1.1100e+03 1.8000e+03 5.3102e+00 -1.1100e+03 1.8286e+03 5.3839e+00 -1.1100e+03 1.8571e+03 5.4557e+00 -1.1100e+03 1.8857e+03 5.5255e+00 -1.1100e+03 1.9143e+03 5.5935e+00 -1.1100e+03 1.9429e+03 5.6597e+00 -1.1100e+03 1.9714e+03 5.7242e+00 -1.1100e+03 2.0000e+03 5.7870e+00 -1.1400e+03 -2.0000e+03 5.8232e+00 -1.1400e+03 -1.9714e+03 5.7619e+00 -1.1400e+03 -1.9429e+03 5.6990e+00 -1.1400e+03 -1.9143e+03 5.6344e+00 -1.1400e+03 -1.8857e+03 5.5681e+00 -1.1400e+03 -1.8571e+03 5.5001e+00 -1.1400e+03 -1.8286e+03 5.4303e+00 -1.1400e+03 -1.8000e+03 5.3586e+00 -1.1400e+03 -1.7714e+03 5.2849e+00 -1.1400e+03 -1.7429e+03 5.2093e+00 -1.1400e+03 -1.7143e+03 5.1316e+00 -1.1400e+03 -1.6857e+03 5.0517e+00 -1.1400e+03 -1.6571e+03 4.9696e+00 -1.1400e+03 -1.6286e+03 4.8853e+00 -1.1400e+03 -1.6000e+03 4.7986e+00 -1.1400e+03 -1.5714e+03 4.7095e+00 -1.1400e+03 -1.5429e+03 4.6179e+00 -1.1400e+03 -1.5143e+03 4.5237e+00 -1.1400e+03 -1.4857e+03 4.4268e+00 -1.1400e+03 -1.4571e+03 4.3272e+00 -1.1400e+03 -1.4286e+03 4.2247e+00 -1.1400e+03 -1.4000e+03 4.1194e+00 -1.1400e+03 -1.3714e+03 4.0110e+00 -1.1400e+03 -1.3429e+03 3.8996e+00 -1.1400e+03 -1.3143e+03 3.7851e+00 -1.1400e+03 -1.2857e+03 3.6673e+00 -1.1400e+03 -1.2571e+03 3.5462e+00 -1.1400e+03 -1.2286e+03 3.4217e+00 -1.1400e+03 -1.2000e+03 3.2938e+00 -1.1400e+03 -1.1714e+03 3.1623e+00 -1.1400e+03 -1.1429e+03 3.0273e+00 -1.1400e+03 -1.1143e+03 2.8887e+00 -1.1400e+03 -1.0857e+03 2.7464e+00 -1.1400e+03 -1.0571e+03 2.6004e+00 -1.1400e+03 -1.0286e+03 2.4508e+00 -1.1400e+03 -1.0000e+03 2.2974e+00 -1.1400e+03 -9.7143e+02 2.1403e+00 -1.1400e+03 -9.4286e+02 1.9796e+00 -1.1400e+03 -9.1429e+02 1.8153e+00 -1.1400e+03 -8.8571e+02 1.6475e+00 -1.1400e+03 -8.5714e+02 1.4764e+00 -1.1400e+03 -8.2857e+02 1.3019e+00 -1.1400e+03 -8.0000e+02 1.1244e+00 -1.1400e+03 -7.7143e+02 9.4412e-01 -1.1400e+03 -7.4286e+02 7.6124e-01 -1.1400e+03 -7.1429e+02 5.7610e-01 -1.1400e+03 -6.8571e+02 3.8906e-01 -1.1400e+03 -6.5714e+02 2.0055e-01 -1.1400e+03 -6.2857e+02 1.1040e-02 -1.1400e+03 -6.0000e+02 -1.7895e-01 -1.1400e+03 -5.7143e+02 -3.6881e-01 -1.1400e+03 -5.4286e+02 -5.5791e-01 -1.1400e+03 -5.1429e+02 -7.4551e-01 -1.1400e+03 -4.8571e+02 -9.3085e-01 -1.1400e+03 -4.5714e+02 -1.1131e+00 -1.1400e+03 -4.2857e+02 -1.2914e+00 -1.1400e+03 -4.0000e+02 -1.4647e+00 -1.1400e+03 -3.7143e+02 -1.6322e+00 -1.1400e+03 -3.4286e+02 -1.7927e+00 -1.1400e+03 -3.1429e+02 -1.9454e+00 -1.1400e+03 -2.8571e+02 -2.0891e+00 -1.1400e+03 -2.5714e+02 -2.2229e+00 -1.1400e+03 -2.2857e+02 -2.3457e+00 -1.1400e+03 -2.0000e+02 -2.4566e+00 -1.1400e+03 -1.7143e+02 -2.5548e+00 -1.1400e+03 -1.4286e+02 -2.6393e+00 -1.1400e+03 -1.1429e+02 -2.7095e+00 -1.1400e+03 -8.5714e+01 -2.7648e+00 -1.1400e+03 -5.7143e+01 -2.8046e+00 -1.1400e+03 -2.8571e+01 -2.8287e+00 -1.1400e+03 0.0000e+00 -2.8367e+00 -1.1400e+03 2.8571e+01 -2.8287e+00 -1.1400e+03 5.7143e+01 -2.8046e+00 -1.1400e+03 8.5714e+01 -2.7648e+00 -1.1400e+03 1.1429e+02 -2.7095e+00 -1.1400e+03 1.4286e+02 -2.6393e+00 -1.1400e+03 1.7143e+02 -2.5548e+00 -1.1400e+03 2.0000e+02 -2.4566e+00 -1.1400e+03 2.2857e+02 -2.3457e+00 -1.1400e+03 2.5714e+02 -2.2229e+00 -1.1400e+03 2.8571e+02 -2.0891e+00 -1.1400e+03 3.1429e+02 -1.9454e+00 -1.1400e+03 3.4286e+02 -1.7927e+00 -1.1400e+03 3.7143e+02 -1.6322e+00 -1.1400e+03 4.0000e+02 -1.4647e+00 -1.1400e+03 4.2857e+02 -1.2914e+00 -1.1400e+03 4.5714e+02 -1.1131e+00 -1.1400e+03 4.8571e+02 -9.3085e-01 -1.1400e+03 5.1429e+02 -7.4551e-01 -1.1400e+03 5.4286e+02 -5.5791e-01 -1.1400e+03 5.7143e+02 -3.6881e-01 -1.1400e+03 6.0000e+02 -1.7895e-01 -1.1400e+03 6.2857e+02 1.1040e-02 -1.1400e+03 6.5714e+02 2.0055e-01 -1.1400e+03 6.8571e+02 3.8906e-01 -1.1400e+03 7.1429e+02 5.7610e-01 -1.1400e+03 7.4286e+02 7.6124e-01 -1.1400e+03 7.7143e+02 9.4412e-01 -1.1400e+03 8.0000e+02 1.1244e+00 -1.1400e+03 8.2857e+02 1.3019e+00 -1.1400e+03 8.5714e+02 1.4764e+00 -1.1400e+03 8.8571e+02 1.6475e+00 -1.1400e+03 9.1429e+02 1.8153e+00 -1.1400e+03 9.4286e+02 1.9796e+00 -1.1400e+03 9.7143e+02 2.1403e+00 -1.1400e+03 1.0000e+03 2.2974e+00 -1.1400e+03 1.0286e+03 2.4508e+00 -1.1400e+03 1.0571e+03 2.6004e+00 -1.1400e+03 1.0857e+03 2.7464e+00 -1.1400e+03 1.1143e+03 2.8887e+00 -1.1400e+03 1.1429e+03 3.0273e+00 -1.1400e+03 1.1714e+03 3.1623e+00 -1.1400e+03 1.2000e+03 3.2938e+00 -1.1400e+03 1.2286e+03 3.4217e+00 -1.1400e+03 1.2571e+03 3.5462e+00 -1.1400e+03 1.2857e+03 3.6673e+00 -1.1400e+03 1.3143e+03 3.7851e+00 -1.1400e+03 1.3429e+03 3.8996e+00 -1.1400e+03 1.3714e+03 4.0110e+00 -1.1400e+03 1.4000e+03 4.1194e+00 -1.1400e+03 1.4286e+03 4.2247e+00 -1.1400e+03 1.4571e+03 4.3272e+00 -1.1400e+03 1.4857e+03 4.4268e+00 -1.1400e+03 1.5143e+03 4.5237e+00 -1.1400e+03 1.5429e+03 4.6179e+00 -1.1400e+03 1.5714e+03 4.7095e+00 -1.1400e+03 1.6000e+03 4.7986e+00 -1.1400e+03 1.6286e+03 4.8853e+00 -1.1400e+03 1.6571e+03 4.9696e+00 -1.1400e+03 1.6857e+03 5.0517e+00 -1.1400e+03 1.7143e+03 5.1316e+00 -1.1400e+03 1.7429e+03 5.2093e+00 -1.1400e+03 1.7714e+03 5.2849e+00 -1.1400e+03 1.8000e+03 5.3586e+00 -1.1400e+03 1.8286e+03 5.4303e+00 -1.1400e+03 1.8571e+03 5.5001e+00 -1.1400e+03 1.8857e+03 5.5681e+00 -1.1400e+03 1.9143e+03 5.6344e+00 -1.1400e+03 1.9429e+03 5.6990e+00 -1.1400e+03 1.9714e+03 5.7619e+00 -1.1400e+03 2.0000e+03 5.8232e+00 -1.1700e+03 -2.0000e+03 5.8595e+00 -1.1700e+03 -1.9714e+03 5.7996e+00 -1.1700e+03 -1.9429e+03 5.7382e+00 -1.1700e+03 -1.9143e+03 5.6753e+00 -1.1700e+03 -1.8857e+03 5.6107e+00 -1.1700e+03 -1.8571e+03 5.5445e+00 -1.1700e+03 -1.8286e+03 5.4766e+00 -1.1700e+03 -1.8000e+03 5.4068e+00 -1.1700e+03 -1.7714e+03 5.3353e+00 -1.1700e+03 -1.7429e+03 5.2618e+00 -1.1700e+03 -1.7143e+03 5.1864e+00 -1.1700e+03 -1.6857e+03 5.1090e+00 -1.1700e+03 -1.6571e+03 5.0295e+00 -1.1700e+03 -1.6286e+03 4.9479e+00 -1.1700e+03 -1.6000e+03 4.8641e+00 -1.1700e+03 -1.5714e+03 4.7780e+00 -1.1700e+03 -1.5429e+03 4.6896e+00 -1.1700e+03 -1.5143e+03 4.5988e+00 -1.1700e+03 -1.4857e+03 4.5055e+00 -1.1700e+03 -1.4571e+03 4.4096e+00 -1.1700e+03 -1.4286e+03 4.3112e+00 -1.1700e+03 -1.4000e+03 4.2100e+00 -1.1700e+03 -1.3714e+03 4.1061e+00 -1.1700e+03 -1.3429e+03 3.9994e+00 -1.1700e+03 -1.3143e+03 3.8899e+00 -1.1700e+03 -1.2857e+03 3.7773e+00 -1.1700e+03 -1.2571e+03 3.6618e+00 -1.1700e+03 -1.2286e+03 3.5432e+00 -1.1700e+03 -1.2000e+03 3.4215e+00 -1.1700e+03 -1.1714e+03 3.2967e+00 -1.1700e+03 -1.1429e+03 3.1686e+00 -1.1700e+03 -1.1143e+03 3.0374e+00 -1.1700e+03 -1.0857e+03 2.9029e+00 -1.1700e+03 -1.0571e+03 2.7651e+00 -1.1700e+03 -1.0286e+03 2.6241e+00 -1.1700e+03 -1.0000e+03 2.4799e+00 -1.1700e+03 -9.7143e+02 2.3324e+00 -1.1700e+03 -9.4286e+02 2.1819e+00 -1.1700e+03 -9.1429e+02 2.0282e+00 -1.1700e+03 -8.8571e+02 1.8716e+00 -1.1700e+03 -8.5714e+02 1.7122e+00 -1.1700e+03 -8.2857e+02 1.5501e+00 -1.1700e+03 -8.0000e+02 1.3855e+00 -1.1700e+03 -7.7143e+02 1.2187e+00 -1.1700e+03 -7.4286e+02 1.0498e+00 -1.1700e+03 -7.1429e+02 8.7926e-01 -1.1700e+03 -6.8571e+02 7.0736e-01 -1.1700e+03 -6.5714e+02 5.3451e-01 -1.1700e+03 -6.2857e+02 3.6115e-01 -1.1700e+03 -6.0000e+02 1.8776e-01 -1.1700e+03 -5.7143e+02 1.4889e-02 -1.1700e+03 -5.4286e+02 -1.5687e-01 -1.1700e+03 -5.1429e+02 -3.2688e-01 -1.1700e+03 -4.8571e+02 -4.9444e-01 -1.1700e+03 -4.5714e+02 -6.5883e-01 -1.1700e+03 -4.2857e+02 -8.1927e-01 -1.1700e+03 -4.0000e+02 -9.7493e-01 -1.1700e+03 -3.7143e+02 -1.1250e+00 -1.1700e+03 -3.4286e+02 -1.2686e+00 -1.1700e+03 -3.1429e+02 -1.4048e+00 -1.1700e+03 -2.8571e+02 -1.5329e+00 -1.1700e+03 -2.5714e+02 -1.6518e+00 -1.1700e+03 -2.2857e+02 -1.7609e+00 -1.1700e+03 -2.0000e+02 -1.8592e+00 -1.1700e+03 -1.7143e+02 -1.9461e+00 -1.1700e+03 -1.4286e+02 -2.0209e+00 -1.1700e+03 -1.1429e+02 -2.0829e+00 -1.1700e+03 -8.5714e+01 -2.1317e+00 -1.1700e+03 -5.7143e+01 -2.1669e+00 -1.1700e+03 -2.8571e+01 -2.1881e+00 -1.1700e+03 0.0000e+00 -2.1952e+00 -1.1700e+03 2.8571e+01 -2.1881e+00 -1.1700e+03 5.7143e+01 -2.1669e+00 -1.1700e+03 8.5714e+01 -2.1317e+00 -1.1700e+03 1.1429e+02 -2.0829e+00 -1.1700e+03 1.4286e+02 -2.0209e+00 -1.1700e+03 1.7143e+02 -1.9461e+00 -1.1700e+03 2.0000e+02 -1.8592e+00 -1.1700e+03 2.2857e+02 -1.7609e+00 -1.1700e+03 2.5714e+02 -1.6518e+00 -1.1700e+03 2.8571e+02 -1.5329e+00 -1.1700e+03 3.1429e+02 -1.4048e+00 -1.1700e+03 3.4286e+02 -1.2686e+00 -1.1700e+03 3.7143e+02 -1.1250e+00 -1.1700e+03 4.0000e+02 -9.7493e-01 -1.1700e+03 4.2857e+02 -8.1927e-01 -1.1700e+03 4.5714e+02 -6.5883e-01 -1.1700e+03 4.8571e+02 -4.9444e-01 -1.1700e+03 5.1429e+02 -3.2688e-01 -1.1700e+03 5.4286e+02 -1.5687e-01 -1.1700e+03 5.7143e+02 1.4889e-02 -1.1700e+03 6.0000e+02 1.8776e-01 -1.1700e+03 6.2857e+02 3.6115e-01 -1.1700e+03 6.5714e+02 5.3451e-01 -1.1700e+03 6.8571e+02 7.0736e-01 -1.1700e+03 7.1429e+02 8.7926e-01 -1.1700e+03 7.4286e+02 1.0498e+00 -1.1700e+03 7.7143e+02 1.2187e+00 -1.1700e+03 8.0000e+02 1.3855e+00 -1.1700e+03 8.2857e+02 1.5501e+00 -1.1700e+03 8.5714e+02 1.7122e+00 -1.1700e+03 8.8571e+02 1.8716e+00 -1.1700e+03 9.1429e+02 2.0282e+00 -1.1700e+03 9.4286e+02 2.1819e+00 -1.1700e+03 9.7143e+02 2.3324e+00 -1.1700e+03 1.0000e+03 2.4799e+00 -1.1700e+03 1.0286e+03 2.6241e+00 -1.1700e+03 1.0571e+03 2.7651e+00 -1.1700e+03 1.0857e+03 2.9029e+00 -1.1700e+03 1.1143e+03 3.0374e+00 -1.1700e+03 1.1429e+03 3.1686e+00 -1.1700e+03 1.1714e+03 3.2967e+00 -1.1700e+03 1.2000e+03 3.4215e+00 -1.1700e+03 1.2286e+03 3.5432e+00 -1.1700e+03 1.2571e+03 3.6618e+00 -1.1700e+03 1.2857e+03 3.7773e+00 -1.1700e+03 1.3143e+03 3.8899e+00 -1.1700e+03 1.3429e+03 3.9994e+00 -1.1700e+03 1.3714e+03 4.1061e+00 -1.1700e+03 1.4000e+03 4.2100e+00 -1.1700e+03 1.4286e+03 4.3112e+00 -1.1700e+03 1.4571e+03 4.4096e+00 -1.1700e+03 1.4857e+03 4.5055e+00 -1.1700e+03 1.5143e+03 4.5988e+00 -1.1700e+03 1.5429e+03 4.6896e+00 -1.1700e+03 1.5714e+03 4.7780e+00 -1.1700e+03 1.6000e+03 4.8641e+00 -1.1700e+03 1.6286e+03 4.9479e+00 -1.1700e+03 1.6571e+03 5.0295e+00 -1.1700e+03 1.6857e+03 5.1090e+00 -1.1700e+03 1.7143e+03 5.1864e+00 -1.1700e+03 1.7429e+03 5.2618e+00 -1.1700e+03 1.7714e+03 5.3353e+00 -1.1700e+03 1.8000e+03 5.4068e+00 -1.1700e+03 1.8286e+03 5.4766e+00 -1.1700e+03 1.8571e+03 5.5445e+00 -1.1700e+03 1.8857e+03 5.6107e+00 -1.1700e+03 1.9143e+03 5.6753e+00 -1.1700e+03 1.9429e+03 5.7382e+00 -1.1700e+03 1.9714e+03 5.7996e+00 -1.1700e+03 2.0000e+03 5.8595e+00 -1.2000e+03 -2.0000e+03 5.8958e+00 -1.2000e+03 -1.9714e+03 5.8374e+00 -1.2000e+03 -1.9429e+03 5.7776e+00 -1.2000e+03 -1.9143e+03 5.7162e+00 -1.2000e+03 -1.8857e+03 5.6533e+00 -1.2000e+03 -1.8571e+03 5.5888e+00 -1.2000e+03 -1.8286e+03 5.5227e+00 -1.2000e+03 -1.8000e+03 5.4550e+00 -1.2000e+03 -1.7714e+03 5.3854e+00 -1.2000e+03 -1.7429e+03 5.3142e+00 -1.2000e+03 -1.7143e+03 5.2410e+00 -1.2000e+03 -1.6857e+03 5.1660e+00 -1.2000e+03 -1.6571e+03 5.0890e+00 -1.2000e+03 -1.6286e+03 5.0101e+00 -1.2000e+03 -1.6000e+03 4.9290e+00 -1.2000e+03 -1.5714e+03 4.8459e+00 -1.2000e+03 -1.5429e+03 4.7606e+00 -1.2000e+03 -1.5143e+03 4.6730e+00 -1.2000e+03 -1.4857e+03 4.5832e+00 -1.2000e+03 -1.4571e+03 4.4910e+00 -1.2000e+03 -1.4286e+03 4.3963e+00 -1.2000e+03 -1.4000e+03 4.2993e+00 -1.2000e+03 -1.3714e+03 4.1996e+00 -1.2000e+03 -1.3429e+03 4.0975e+00 -1.2000e+03 -1.3143e+03 3.9926e+00 -1.2000e+03 -1.2857e+03 3.8852e+00 -1.2000e+03 -1.2571e+03 3.7749e+00 -1.2000e+03 -1.2286e+03 3.6619e+00 -1.2000e+03 -1.2000e+03 3.5462e+00 -1.2000e+03 -1.1714e+03 3.4275e+00 -1.2000e+03 -1.1429e+03 3.3061e+00 -1.2000e+03 -1.1143e+03 3.1817e+00 -1.2000e+03 -1.0857e+03 3.0545e+00 -1.2000e+03 -1.0571e+03 2.9245e+00 -1.2000e+03 -1.0286e+03 2.7915e+00 -1.2000e+03 -1.0000e+03 2.6558e+00 -1.2000e+03 -9.7143e+02 2.5173e+00 -1.2000e+03 -9.4286e+02 2.3761e+00 -1.2000e+03 -9.1429e+02 2.2324e+00 -1.2000e+03 -8.8571e+02 2.0861e+00 -1.2000e+03 -8.5714e+02 1.9375e+00 -1.2000e+03 -8.2857e+02 1.7866e+00 -1.2000e+03 -8.0000e+02 1.6338e+00 -1.2000e+03 -7.7143e+02 1.4792e+00 -1.2000e+03 -7.4286e+02 1.3231e+00 -1.2000e+03 -7.1429e+02 1.1657e+00 -1.2000e+03 -6.8571e+02 1.0074e+00 -1.2000e+03 -6.5714e+02 8.4863e-01 -1.2000e+03 -6.2857e+02 6.8971e-01 -1.2000e+03 -6.0000e+02 5.3111e-01 -1.2000e+03 -5.7143e+02 3.7334e-01 -1.2000e+03 -5.4286e+02 2.1692e-01 -1.2000e+03 -5.1429e+02 6.2437e-02 -1.2000e+03 -4.8571e+02 -8.9501e-02 -1.2000e+03 -4.5714e+02 -2.3824e-01 -1.2000e+03 -4.2857e+02 -3.8310e-01 -1.2000e+03 -4.0000e+02 -5.2338e-01 -1.2000e+03 -3.7143e+02 -6.5834e-01 -1.2000e+03 -3.4286e+02 -7.8723e-01 -1.2000e+03 -3.1429e+02 -9.0932e-01 -1.2000e+03 -2.8571e+02 -1.0239e+00 -1.2000e+03 -2.5714e+02 -1.1301e+00 -1.2000e+03 -2.2857e+02 -1.2274e+00 -1.2000e+03 -2.0000e+02 -1.3149e+00 -1.2000e+03 -1.7143e+02 -1.3922e+00 -1.2000e+03 -1.4286e+02 -1.4587e+00 -1.2000e+03 -1.1429e+02 -1.5138e+00 -1.2000e+03 -8.5714e+01 -1.5571e+00 -1.2000e+03 -5.7143e+01 -1.5882e+00 -1.2000e+03 -2.8571e+01 -1.6070e+00 -1.2000e+03 0.0000e+00 -1.6133e+00 -1.2000e+03 2.8571e+01 -1.6070e+00 -1.2000e+03 5.7143e+01 -1.5882e+00 -1.2000e+03 8.5714e+01 -1.5571e+00 -1.2000e+03 1.1429e+02 -1.5138e+00 -1.2000e+03 1.4286e+02 -1.4587e+00 -1.2000e+03 1.7143e+02 -1.3922e+00 -1.2000e+03 2.0000e+02 -1.3149e+00 -1.2000e+03 2.2857e+02 -1.2274e+00 -1.2000e+03 2.5714e+02 -1.1301e+00 -1.2000e+03 2.8571e+02 -1.0239e+00 -1.2000e+03 3.1429e+02 -9.0932e-01 -1.2000e+03 3.4286e+02 -7.8723e-01 -1.2000e+03 3.7143e+02 -6.5834e-01 -1.2000e+03 4.0000e+02 -5.2338e-01 -1.2000e+03 4.2857e+02 -3.8310e-01 -1.2000e+03 4.5714e+02 -2.3824e-01 -1.2000e+03 4.8571e+02 -8.9501e-02 -1.2000e+03 5.1429e+02 6.2437e-02 -1.2000e+03 5.4286e+02 2.1692e-01 -1.2000e+03 5.7143e+02 3.7334e-01 -1.2000e+03 6.0000e+02 5.3111e-01 -1.2000e+03 6.2857e+02 6.8971e-01 -1.2000e+03 6.5714e+02 8.4863e-01 -1.2000e+03 6.8571e+02 1.0074e+00 -1.2000e+03 7.1429e+02 1.1657e+00 -1.2000e+03 7.4286e+02 1.3231e+00 -1.2000e+03 7.7143e+02 1.4792e+00 -1.2000e+03 8.0000e+02 1.6338e+00 -1.2000e+03 8.2857e+02 1.7866e+00 -1.2000e+03 8.5714e+02 1.9375e+00 -1.2000e+03 8.8571e+02 2.0861e+00 -1.2000e+03 9.1429e+02 2.2324e+00 -1.2000e+03 9.4286e+02 2.3761e+00 -1.2000e+03 9.7143e+02 2.5173e+00 -1.2000e+03 1.0000e+03 2.6558e+00 -1.2000e+03 1.0286e+03 2.7915e+00 -1.2000e+03 1.0571e+03 2.9245e+00 -1.2000e+03 1.0857e+03 3.0545e+00 -1.2000e+03 1.1143e+03 3.1817e+00 -1.2000e+03 1.1429e+03 3.3061e+00 -1.2000e+03 1.1714e+03 3.4275e+00 -1.2000e+03 1.2000e+03 3.5462e+00 -1.2000e+03 1.2286e+03 3.6619e+00 -1.2000e+03 1.2571e+03 3.7749e+00 -1.2000e+03 1.2857e+03 3.8852e+00 -1.2000e+03 1.3143e+03 3.9926e+00 -1.2000e+03 1.3429e+03 4.0975e+00 -1.2000e+03 1.3714e+03 4.1996e+00 -1.2000e+03 1.4000e+03 4.2993e+00 -1.2000e+03 1.4286e+03 4.3963e+00 -1.2000e+03 1.4571e+03 4.4910e+00 -1.2000e+03 1.4857e+03 4.5832e+00 -1.2000e+03 1.5143e+03 4.6730e+00 -1.2000e+03 1.5429e+03 4.7606e+00 -1.2000e+03 1.5714e+03 4.8459e+00 -1.2000e+03 1.6000e+03 4.9290e+00 -1.2000e+03 1.6286e+03 5.0101e+00 -1.2000e+03 1.6571e+03 5.0890e+00 -1.2000e+03 1.6857e+03 5.1660e+00 -1.2000e+03 1.7143e+03 5.2410e+00 -1.2000e+03 1.7429e+03 5.3142e+00 -1.2000e+03 1.7714e+03 5.3854e+00 -1.2000e+03 1.8000e+03 5.4550e+00 -1.2000e+03 1.8286e+03 5.5227e+00 -1.2000e+03 1.8571e+03 5.5888e+00 -1.2000e+03 1.8857e+03 5.6533e+00 -1.2000e+03 1.9143e+03 5.7162e+00 -1.2000e+03 1.9429e+03 5.7776e+00 -1.2000e+03 1.9714e+03 5.8374e+00 -1.2000e+03 2.0000e+03 5.8958e+00 -1.2300e+03 -2.0000e+03 5.9322e+00 -1.2300e+03 -1.9714e+03 5.8752e+00 -1.2300e+03 -1.9429e+03 5.8168e+00 -1.2300e+03 -1.9143e+03 5.7571e+00 -1.2300e+03 -1.8857e+03 5.6958e+00 -1.2300e+03 -1.8571e+03 5.6331e+00 -1.2300e+03 -1.8286e+03 5.5688e+00 -1.2300e+03 -1.8000e+03 5.5029e+00 -1.2300e+03 -1.7714e+03 5.4354e+00 -1.2300e+03 -1.7429e+03 5.3662e+00 -1.2300e+03 -1.7143e+03 5.2953e+00 -1.2300e+03 -1.6857e+03 5.2226e+00 -1.2300e+03 -1.6571e+03 5.1481e+00 -1.2300e+03 -1.6286e+03 5.0717e+00 -1.2300e+03 -1.6000e+03 4.9934e+00 -1.2300e+03 -1.5714e+03 4.9131e+00 -1.2300e+03 -1.5429e+03 4.8308e+00 -1.2300e+03 -1.5143e+03 4.7464e+00 -1.2300e+03 -1.4857e+03 4.6598e+00 -1.2300e+03 -1.4571e+03 4.5711e+00 -1.2300e+03 -1.4286e+03 4.4802e+00 -1.2300e+03 -1.4000e+03 4.3870e+00 -1.2300e+03 -1.3714e+03 4.2915e+00 -1.2300e+03 -1.3429e+03 4.1937e+00 -1.2300e+03 -1.3143e+03 4.0934e+00 -1.2300e+03 -1.2857e+03 3.9907e+00 -1.2300e+03 -1.2571e+03 3.8855e+00 -1.2300e+03 -1.2286e+03 3.7779e+00 -1.2300e+03 -1.2000e+03 3.6677e+00 -1.2300e+03 -1.1714e+03 3.5549e+00 -1.2300e+03 -1.1429e+03 3.4397e+00 -1.2300e+03 -1.1143e+03 3.3219e+00 -1.2300e+03 -1.0857e+03 3.2015e+00 -1.2300e+03 -1.0571e+03 3.0786e+00 -1.2300e+03 -1.0286e+03 2.9533e+00 -1.2300e+03 -1.0000e+03 2.8255e+00 -1.2300e+03 -9.7143e+02 2.6953e+00 -1.2300e+03 -9.4286e+02 2.5628e+00 -1.2300e+03 -9.1429e+02 2.4282e+00 -1.2300e+03 -8.8571e+02 2.2914e+00 -1.2300e+03 -8.5714e+02 2.1527e+00 -1.2300e+03 -8.2857e+02 2.0122e+00 -1.2300e+03 -8.0000e+02 1.8701e+00 -1.2300e+03 -7.7143e+02 1.7267e+00 -1.2300e+03 -7.4286e+02 1.5821e+00 -1.2300e+03 -7.1429e+02 1.4366e+00 -1.2300e+03 -6.8571e+02 1.2907e+00 -1.2300e+03 -6.5714e+02 1.1445e+00 -1.2300e+03 -6.2857e+02 9.9851e-01 -1.2300e+03 -6.0000e+02 8.5313e-01 -1.2300e+03 -5.7143e+02 7.0880e-01 -1.2300e+03 -5.4286e+02 5.6600e-01 -1.2300e+03 -5.1429e+02 4.2526e-01 -1.2300e+03 -4.8571e+02 2.8711e-01 -1.2300e+03 -4.5714e+02 1.5213e-01 -1.2300e+03 -4.2857e+02 2.0919e-02 -1.2300e+03 -4.0000e+02 -1.0590e-01 -1.2300e+03 -3.7143e+02 -2.2768e-01 -1.2300e+03 -3.4286e+02 -3.4380e-01 -1.2300e+03 -3.1429e+02 -4.5361e-01 -1.2300e+03 -2.8571e+02 -5.5646e-01 -1.2300e+03 -2.5714e+02 -6.5173e-01 -1.2300e+03 -2.2857e+02 -7.3882e-01 -1.2300e+03 -2.0000e+02 -8.1716e-01 -1.2300e+03 -1.7143e+02 -8.8622e-01 -1.2300e+03 -1.4286e+02 -9.4552e-01 -1.2300e+03 -1.1429e+02 -9.9465e-01 -1.2300e+03 -8.5714e+01 -1.0332e+00 -1.2300e+03 -5.7143e+01 -1.0610e+00 -1.2300e+03 -2.8571e+01 -1.0778e+00 -1.2300e+03 0.0000e+00 -1.0834e+00 -1.2300e+03 2.8571e+01 -1.0778e+00 -1.2300e+03 5.7143e+01 -1.0610e+00 -1.2300e+03 8.5714e+01 -1.0332e+00 -1.2300e+03 1.1429e+02 -9.9465e-01 -1.2300e+03 1.4286e+02 -9.4552e-01 -1.2300e+03 1.7143e+02 -8.8622e-01 -1.2300e+03 2.0000e+02 -8.1716e-01 -1.2300e+03 2.2857e+02 -7.3882e-01 -1.2300e+03 2.5714e+02 -6.5173e-01 -1.2300e+03 2.8571e+02 -5.5646e-01 -1.2300e+03 3.1429e+02 -4.5361e-01 -1.2300e+03 3.4286e+02 -3.4380e-01 -1.2300e+03 3.7143e+02 -2.2768e-01 -1.2300e+03 4.0000e+02 -1.0590e-01 -1.2300e+03 4.2857e+02 2.0919e-02 -1.2300e+03 4.5714e+02 1.5213e-01 -1.2300e+03 4.8571e+02 2.8711e-01 -1.2300e+03 5.1429e+02 4.2526e-01 -1.2300e+03 5.4286e+02 5.6600e-01 -1.2300e+03 5.7143e+02 7.0880e-01 -1.2300e+03 6.0000e+02 8.5313e-01 -1.2300e+03 6.2857e+02 9.9851e-01 -1.2300e+03 6.5714e+02 1.1445e+00 -1.2300e+03 6.8571e+02 1.2907e+00 -1.2300e+03 7.1429e+02 1.4366e+00 -1.2300e+03 7.4286e+02 1.5821e+00 -1.2300e+03 7.7143e+02 1.7267e+00 -1.2300e+03 8.0000e+02 1.8701e+00 -1.2300e+03 8.2857e+02 2.0122e+00 -1.2300e+03 8.5714e+02 2.1527e+00 -1.2300e+03 8.8571e+02 2.2914e+00 -1.2300e+03 9.1429e+02 2.4282e+00 -1.2300e+03 9.4286e+02 2.5628e+00 -1.2300e+03 9.7143e+02 2.6953e+00 -1.2300e+03 1.0000e+03 2.8255e+00 -1.2300e+03 1.0286e+03 2.9533e+00 -1.2300e+03 1.0571e+03 3.0786e+00 -1.2300e+03 1.0857e+03 3.2015e+00 -1.2300e+03 1.1143e+03 3.3219e+00 -1.2300e+03 1.1429e+03 3.4397e+00 -1.2300e+03 1.1714e+03 3.5549e+00 -1.2300e+03 1.2000e+03 3.6677e+00 -1.2300e+03 1.2286e+03 3.7779e+00 -1.2300e+03 1.2571e+03 3.8855e+00 -1.2300e+03 1.2857e+03 3.9907e+00 -1.2300e+03 1.3143e+03 4.0934e+00 -1.2300e+03 1.3429e+03 4.1937e+00 -1.2300e+03 1.3714e+03 4.2915e+00 -1.2300e+03 1.4000e+03 4.3870e+00 -1.2300e+03 1.4286e+03 4.4802e+00 -1.2300e+03 1.4571e+03 4.5711e+00 -1.2300e+03 1.4857e+03 4.6598e+00 -1.2300e+03 1.5143e+03 4.7464e+00 -1.2300e+03 1.5429e+03 4.8308e+00 -1.2300e+03 1.5714e+03 4.9131e+00 -1.2300e+03 1.6000e+03 4.9934e+00 -1.2300e+03 1.6286e+03 5.0717e+00 -1.2300e+03 1.6571e+03 5.1481e+00 -1.2300e+03 1.6857e+03 5.2226e+00 -1.2300e+03 1.7143e+03 5.2953e+00 -1.2300e+03 1.7429e+03 5.3662e+00 -1.2300e+03 1.7714e+03 5.4354e+00 -1.2300e+03 1.8000e+03 5.5029e+00 -1.2300e+03 1.8286e+03 5.5688e+00 -1.2300e+03 1.8571e+03 5.6331e+00 -1.2300e+03 1.8857e+03 5.6958e+00 -1.2300e+03 1.9143e+03 5.7571e+00 -1.2300e+03 1.9429e+03 5.8168e+00 -1.2300e+03 1.9714e+03 5.8752e+00 -1.2300e+03 2.0000e+03 5.9322e+00 -1.2600e+03 -2.0000e+03 5.9686e+00 -1.2600e+03 -1.9714e+03 5.9130e+00 -1.2600e+03 -1.9429e+03 5.8561e+00 -1.2600e+03 -1.9143e+03 5.7978e+00 -1.2600e+03 -1.8857e+03 5.7382e+00 -1.2600e+03 -1.8571e+03 5.6772e+00 -1.2600e+03 -1.8286e+03 5.6146e+00 -1.2600e+03 -1.8000e+03 5.5506e+00 -1.2600e+03 -1.7714e+03 5.4851e+00 -1.2600e+03 -1.7429e+03 5.4180e+00 -1.2600e+03 -1.7143e+03 5.3492e+00 -1.2600e+03 -1.6857e+03 5.2788e+00 -1.2600e+03 -1.6571e+03 5.2066e+00 -1.2600e+03 -1.6286e+03 5.1327e+00 -1.2600e+03 -1.6000e+03 5.0570e+00 -1.2600e+03 -1.5714e+03 4.9795e+00 -1.2600e+03 -1.5429e+03 4.9001e+00 -1.2600e+03 -1.5143e+03 4.8188e+00 -1.2600e+03 -1.4857e+03 4.7355e+00 -1.2600e+03 -1.4571e+03 4.6501e+00 -1.2600e+03 -1.4286e+03 4.5628e+00 -1.2600e+03 -1.4000e+03 4.4733e+00 -1.2600e+03 -1.3714e+03 4.3817e+00 -1.2600e+03 -1.3429e+03 4.2880e+00 -1.2600e+03 -1.3143e+03 4.1921e+00 -1.2600e+03 -1.2857e+03 4.0939e+00 -1.2600e+03 -1.2571e+03 3.9936e+00 -1.2600e+03 -1.2286e+03 3.8910e+00 -1.2600e+03 -1.2000e+03 3.7861e+00 -1.2600e+03 -1.1714e+03 3.6789e+00 -1.2600e+03 -1.1429e+03 3.5695e+00 -1.2600e+03 -1.1143e+03 3.4578e+00 -1.2600e+03 -1.0857e+03 3.3439e+00 -1.2600e+03 -1.0571e+03 3.2278e+00 -1.2600e+03 -1.0286e+03 3.1095e+00 -1.2600e+03 -1.0000e+03 2.9891e+00 -1.2600e+03 -9.7143e+02 2.8666e+00 -1.2600e+03 -9.4286e+02 2.7422e+00 -1.2600e+03 -9.1429e+02 2.6160e+00 -1.2600e+03 -8.8571e+02 2.4880e+00 -1.2600e+03 -8.5714e+02 2.3584e+00 -1.2600e+03 -8.2857e+02 2.2274e+00 -1.2600e+03 -8.0000e+02 2.0951e+00 -1.2600e+03 -7.7143e+02 1.9619e+00 -1.2600e+03 -7.4286e+02 1.8278e+00 -1.2600e+03 -7.1429e+02 1.6931e+00 -1.2600e+03 -6.8571e+02 1.5583e+00 -1.2600e+03 -6.5714e+02 1.4235e+00 -1.2600e+03 -6.2857e+02 1.2892e+00 -1.2600e+03 -6.0000e+02 1.1556e+00 -1.2600e+03 -5.7143e+02 1.0233e+00 -1.2600e+03 -5.4286e+02 8.9262e-01 -1.2600e+03 -5.1429e+02 7.6407e-01 -1.2600e+03 -4.8571e+02 6.3812e-01 -1.2600e+03 -4.5714e+02 5.1529e-01 -1.2600e+03 -4.2857e+02 3.9610e-01 -1.2600e+03 -4.0000e+02 2.8110e-01 -1.2600e+03 -3.7143e+02 1.7084e-01 -1.2600e+03 -3.4286e+02 6.5885e-02 -1.2600e+03 -3.1429e+02 -3.3215e-02 -1.2600e+03 -2.8571e+02 -1.2591e-01 -1.2600e+03 -2.5714e+02 -2.1165e-01 -1.2600e+03 -2.2857e+02 -2.8994e-01 -1.2600e+03 -2.0000e+02 -3.6029e-01 -1.2600e+03 -1.7143e+02 -4.2224e-01 -1.2600e+03 -1.4286e+02 -4.7540e-01 -1.2600e+03 -1.1429e+02 -5.1940e-01 -1.2600e+03 -8.5714e+01 -5.5394e-01 -1.2600e+03 -5.7143e+01 -5.7879e-01 -1.2600e+03 -2.8571e+01 -5.9377e-01 -1.2600e+03 0.0000e+00 -5.9877e-01 -1.2600e+03 2.8571e+01 -5.9377e-01 -1.2600e+03 5.7143e+01 -5.7879e-01 -1.2600e+03 8.5714e+01 -5.5394e-01 -1.2600e+03 1.1429e+02 -5.1940e-01 -1.2600e+03 1.4286e+02 -4.7540e-01 -1.2600e+03 1.7143e+02 -4.2224e-01 -1.2600e+03 2.0000e+02 -3.6029e-01 -1.2600e+03 2.2857e+02 -2.8994e-01 -1.2600e+03 2.5714e+02 -2.1165e-01 -1.2600e+03 2.8571e+02 -1.2591e-01 -1.2600e+03 3.1429e+02 -3.3215e-02 -1.2600e+03 3.4286e+02 6.5885e-02 -1.2600e+03 3.7143e+02 1.7084e-01 -1.2600e+03 4.0000e+02 2.8110e-01 -1.2600e+03 4.2857e+02 3.9610e-01 -1.2600e+03 4.5714e+02 5.1529e-01 -1.2600e+03 4.8571e+02 6.3812e-01 -1.2600e+03 5.1429e+02 7.6407e-01 -1.2600e+03 5.4286e+02 8.9262e-01 -1.2600e+03 5.7143e+02 1.0233e+00 -1.2600e+03 6.0000e+02 1.1556e+00 -1.2600e+03 6.2857e+02 1.2892e+00 -1.2600e+03 6.5714e+02 1.4235e+00 -1.2600e+03 6.8571e+02 1.5583e+00 -1.2600e+03 7.1429e+02 1.6931e+00 -1.2600e+03 7.4286e+02 1.8278e+00 -1.2600e+03 7.7143e+02 1.9619e+00 -1.2600e+03 8.0000e+02 2.0951e+00 -1.2600e+03 8.2857e+02 2.2274e+00 -1.2600e+03 8.5714e+02 2.3584e+00 -1.2600e+03 8.8571e+02 2.4880e+00 -1.2600e+03 9.1429e+02 2.6160e+00 -1.2600e+03 9.4286e+02 2.7422e+00 -1.2600e+03 9.7143e+02 2.8666e+00 -1.2600e+03 1.0000e+03 2.9891e+00 -1.2600e+03 1.0286e+03 3.1095e+00 -1.2600e+03 1.0571e+03 3.2278e+00 -1.2600e+03 1.0857e+03 3.3439e+00 -1.2600e+03 1.1143e+03 3.4578e+00 -1.2600e+03 1.1429e+03 3.5695e+00 -1.2600e+03 1.1714e+03 3.6789e+00 -1.2600e+03 1.2000e+03 3.7861e+00 -1.2600e+03 1.2286e+03 3.8910e+00 -1.2600e+03 1.2571e+03 3.9936e+00 -1.2600e+03 1.2857e+03 4.0939e+00 -1.2600e+03 1.3143e+03 4.1921e+00 -1.2600e+03 1.3429e+03 4.2880e+00 -1.2600e+03 1.3714e+03 4.3817e+00 -1.2600e+03 1.4000e+03 4.4733e+00 -1.2600e+03 1.4286e+03 4.5628e+00 -1.2600e+03 1.4571e+03 4.6501e+00 -1.2600e+03 1.4857e+03 4.7355e+00 -1.2600e+03 1.5143e+03 4.8188e+00 -1.2600e+03 1.5429e+03 4.9001e+00 -1.2600e+03 1.5714e+03 4.9795e+00 -1.2600e+03 1.6000e+03 5.0570e+00 -1.2600e+03 1.6286e+03 5.1327e+00 -1.2600e+03 1.6571e+03 5.2066e+00 -1.2600e+03 1.6857e+03 5.2788e+00 -1.2600e+03 1.7143e+03 5.3492e+00 -1.2600e+03 1.7429e+03 5.4180e+00 -1.2600e+03 1.7714e+03 5.4851e+00 -1.2600e+03 1.8000e+03 5.5506e+00 -1.2600e+03 1.8286e+03 5.6146e+00 -1.2600e+03 1.8571e+03 5.6772e+00 -1.2600e+03 1.8857e+03 5.7382e+00 -1.2600e+03 1.9143e+03 5.7978e+00 -1.2600e+03 1.9429e+03 5.8561e+00 -1.2600e+03 1.9714e+03 5.9130e+00 -1.2600e+03 2.0000e+03 5.9686e+00 -1.2900e+03 -2.0000e+03 6.0049e+00 -1.2900e+03 -1.9714e+03 5.9507e+00 -1.2900e+03 -1.9429e+03 5.8952e+00 -1.2900e+03 -1.9143e+03 5.8385e+00 -1.2900e+03 -1.8857e+03 5.7805e+00 -1.2900e+03 -1.8571e+03 5.7211e+00 -1.2900e+03 -1.8286e+03 5.6603e+00 -1.2900e+03 -1.8000e+03 5.5981e+00 -1.2900e+03 -1.7714e+03 5.5345e+00 -1.2900e+03 -1.7429e+03 5.4693e+00 -1.2900e+03 -1.7143e+03 5.4027e+00 -1.2900e+03 -1.6857e+03 5.3345e+00 -1.2900e+03 -1.6571e+03 5.2646e+00 -1.2900e+03 -1.6286e+03 5.1932e+00 -1.2900e+03 -1.6000e+03 5.1200e+00 -1.2900e+03 -1.5714e+03 5.0452e+00 -1.2900e+03 -1.5429e+03 4.9686e+00 -1.2900e+03 -1.5143e+03 4.8902e+00 -1.2900e+03 -1.4857e+03 4.8100e+00 -1.2900e+03 -1.4571e+03 4.7279e+00 -1.2900e+03 -1.4286e+03 4.6440e+00 -1.2900e+03 -1.4000e+03 4.5581e+00 -1.2900e+03 -1.3714e+03 4.4703e+00 -1.2900e+03 -1.3429e+03 4.3805e+00 -1.2900e+03 -1.3143e+03 4.2887e+00 -1.2900e+03 -1.2857e+03 4.1949e+00 -1.2900e+03 -1.2571e+03 4.0991e+00 -1.2900e+03 -1.2286e+03 4.0013e+00 -1.2900e+03 -1.2000e+03 3.9014e+00 -1.2900e+03 -1.1714e+03 3.7996e+00 -1.2900e+03 -1.1429e+03 3.6957e+00 -1.2900e+03 -1.1143e+03 3.5898e+00 -1.2900e+03 -1.0857e+03 3.4819e+00 -1.2900e+03 -1.0571e+03 3.3721e+00 -1.2900e+03 -1.0286e+03 3.2604e+00 -1.2900e+03 -1.0000e+03 3.1469e+00 -1.2900e+03 -9.7143e+02 3.0316e+00 -1.2900e+03 -9.4286e+02 2.9147e+00 -1.2900e+03 -9.1429e+02 2.7962e+00 -1.2900e+03 -8.8571e+02 2.6764e+00 -1.2900e+03 -8.5714e+02 2.5552e+00 -1.2900e+03 -8.2857e+02 2.4329e+00 -1.2900e+03 -8.0000e+02 2.3096e+00 -1.2900e+03 -7.7143e+02 2.1856e+00 -1.2900e+03 -7.4286e+02 2.0611e+00 -1.2900e+03 -7.1429e+02 1.9363e+00 -1.2900e+03 -6.8571e+02 1.8115e+00 -1.2900e+03 -6.5714e+02 1.6870e+00 -1.2900e+03 -6.2857e+02 1.5631e+00 -1.2900e+03 -6.0000e+02 1.4402e+00 -1.2900e+03 -5.7143e+02 1.3186e+00 -1.2900e+03 -5.4286e+02 1.1988e+00 -1.2900e+03 -5.1429e+02 1.0811e+00 -1.2900e+03 -4.8571e+02 9.6596e-01 -1.2900e+03 -4.5714e+02 8.5389e-01 -1.2900e+03 -4.2857e+02 7.4532e-01 -1.2900e+03 -4.0000e+02 6.4073e-01 -1.2900e+03 -3.7143e+02 5.4061e-01 -1.2900e+03 -3.4286e+02 4.4544e-01 -1.2900e+03 -3.1429e+02 3.5570e-01 -1.2900e+03 -2.8571e+02 2.7188e-01 -1.2900e+03 -2.5714e+02 1.9443e-01 -1.2900e+03 -2.2857e+02 1.2380e-01 -1.2900e+03 -2.0000e+02 6.0403e-02 -1.2900e+03 -1.7143e+02 4.6172e-03 -1.2900e+03 -1.4286e+02 -4.3208e-02 -1.2900e+03 -1.1429e+02 -8.2769e-02 -1.2900e+03 -8.5714e+01 -1.1381e-01 -1.2900e+03 -5.7143e+01 -1.3613e-01 -1.2900e+03 -2.8571e+01 -1.4959e-01 -1.2900e+03 0.0000e+00 -1.5408e-01 -1.2900e+03 2.8571e+01 -1.4959e-01 -1.2900e+03 5.7143e+01 -1.3613e-01 -1.2900e+03 8.5714e+01 -1.1381e-01 -1.2900e+03 1.1429e+02 -8.2769e-02 -1.2900e+03 1.4286e+02 -4.3208e-02 -1.2900e+03 1.7143e+02 4.6172e-03 -1.2900e+03 2.0000e+02 6.0403e-02 -1.2900e+03 2.2857e+02 1.2380e-01 -1.2900e+03 2.5714e+02 1.9443e-01 -1.2900e+03 2.8571e+02 2.7188e-01 -1.2900e+03 3.1429e+02 3.5570e-01 -1.2900e+03 3.4286e+02 4.4544e-01 -1.2900e+03 3.7143e+02 5.4061e-01 -1.2900e+03 4.0000e+02 6.4073e-01 -1.2900e+03 4.2857e+02 7.4532e-01 -1.2900e+03 4.5714e+02 8.5389e-01 -1.2900e+03 4.8571e+02 9.6596e-01 -1.2900e+03 5.1429e+02 1.0811e+00 -1.2900e+03 5.4286e+02 1.1988e+00 -1.2900e+03 5.7143e+02 1.3186e+00 -1.2900e+03 6.0000e+02 1.4402e+00 -1.2900e+03 6.2857e+02 1.5631e+00 -1.2900e+03 6.5714e+02 1.6870e+00 -1.2900e+03 6.8571e+02 1.8115e+00 -1.2900e+03 7.1429e+02 1.9363e+00 -1.2900e+03 7.4286e+02 2.0611e+00 -1.2900e+03 7.7143e+02 2.1856e+00 -1.2900e+03 8.0000e+02 2.3096e+00 -1.2900e+03 8.2857e+02 2.4329e+00 -1.2900e+03 8.5714e+02 2.5552e+00 -1.2900e+03 8.8571e+02 2.6764e+00 -1.2900e+03 9.1429e+02 2.7962e+00 -1.2900e+03 9.4286e+02 2.9147e+00 -1.2900e+03 9.7143e+02 3.0316e+00 -1.2900e+03 1.0000e+03 3.1469e+00 -1.2900e+03 1.0286e+03 3.2604e+00 -1.2900e+03 1.0571e+03 3.3721e+00 -1.2900e+03 1.0857e+03 3.4819e+00 -1.2900e+03 1.1143e+03 3.5898e+00 -1.2900e+03 1.1429e+03 3.6957e+00 -1.2900e+03 1.1714e+03 3.7996e+00 -1.2900e+03 1.2000e+03 3.9014e+00 -1.2900e+03 1.2286e+03 4.0013e+00 -1.2900e+03 1.2571e+03 4.0991e+00 -1.2900e+03 1.2857e+03 4.1949e+00 -1.2900e+03 1.3143e+03 4.2887e+00 -1.2900e+03 1.3429e+03 4.3805e+00 -1.2900e+03 1.3714e+03 4.4703e+00 -1.2900e+03 1.4000e+03 4.5581e+00 -1.2900e+03 1.4286e+03 4.6440e+00 -1.2900e+03 1.4571e+03 4.7279e+00 -1.2900e+03 1.4857e+03 4.8100e+00 -1.2900e+03 1.5143e+03 4.8902e+00 -1.2900e+03 1.5429e+03 4.9686e+00 -1.2900e+03 1.5714e+03 5.0452e+00 -1.2900e+03 1.6000e+03 5.1200e+00 -1.2900e+03 1.6286e+03 5.1932e+00 -1.2900e+03 1.6571e+03 5.2646e+00 -1.2900e+03 1.6857e+03 5.3345e+00 -1.2900e+03 1.7143e+03 5.4027e+00 -1.2900e+03 1.7429e+03 5.4693e+00 -1.2900e+03 1.7714e+03 5.5345e+00 -1.2900e+03 1.8000e+03 5.5981e+00 -1.2900e+03 1.8286e+03 5.6603e+00 -1.2900e+03 1.8571e+03 5.7211e+00 -1.2900e+03 1.8857e+03 5.7805e+00 -1.2900e+03 1.9143e+03 5.8385e+00 -1.2900e+03 1.9429e+03 5.8952e+00 -1.2900e+03 1.9714e+03 5.9507e+00 -1.2900e+03 2.0000e+03 6.0049e+00 -1.3200e+03 -2.0000e+03 6.0412e+00 -1.3200e+03 -1.9714e+03 5.9883e+00 -1.3200e+03 -1.9429e+03 5.9343e+00 -1.3200e+03 -1.9143e+03 5.8790e+00 -1.3200e+03 -1.8857e+03 5.8225e+00 -1.3200e+03 -1.8571e+03 5.7648e+00 -1.3200e+03 -1.8286e+03 5.7057e+00 -1.3200e+03 -1.8000e+03 5.6453e+00 -1.3200e+03 -1.7714e+03 5.5835e+00 -1.3200e+03 -1.7429e+03 5.5204e+00 -1.3200e+03 -1.7143e+03 5.4557e+00 -1.3200e+03 -1.6857e+03 5.3897e+00 -1.3200e+03 -1.6571e+03 5.3221e+00 -1.3200e+03 -1.6286e+03 5.2530e+00 -1.3200e+03 -1.6000e+03 5.1823e+00 -1.3200e+03 -1.5714e+03 5.1100e+00 -1.3200e+03 -1.5429e+03 5.0362e+00 -1.3200e+03 -1.5143e+03 4.9606e+00 -1.3200e+03 -1.4857e+03 4.8834e+00 -1.3200e+03 -1.4571e+03 4.8044e+00 -1.3200e+03 -1.4286e+03 4.7238e+00 -1.3200e+03 -1.4000e+03 4.6413e+00 -1.3200e+03 -1.3714e+03 4.5571e+00 -1.3200e+03 -1.3429e+03 4.4711e+00 -1.3200e+03 -1.3143e+03 4.3833e+00 -1.3200e+03 -1.2857e+03 4.2937e+00 -1.3200e+03 -1.2571e+03 4.2022e+00 -1.3200e+03 -1.2286e+03 4.1089e+00 -1.3200e+03 -1.2000e+03 4.0138e+00 -1.3200e+03 -1.1714e+03 3.9169e+00 -1.3200e+03 -1.1429e+03 3.8182e+00 -1.3200e+03 -1.1143e+03 3.7177e+00 -1.3200e+03 -1.0857e+03 3.6155e+00 -1.3200e+03 -1.0571e+03 3.5117e+00 -1.3200e+03 -1.0286e+03 3.4061e+00 -1.3200e+03 -1.0000e+03 3.2991e+00 -1.3200e+03 -9.7143e+02 3.1905e+00 -1.3200e+03 -9.4286e+02 3.0805e+00 -1.3200e+03 -9.1429e+02 2.9693e+00 -1.3200e+03 -8.8571e+02 2.8569e+00 -1.3200e+03 -8.5714e+02 2.7434e+00 -1.3200e+03 -8.2857e+02 2.6291e+00 -1.3200e+03 -8.0000e+02 2.5141e+00 -1.3200e+03 -7.7143e+02 2.3986e+00 -1.3200e+03 -7.4286e+02 2.2828e+00 -1.3200e+03 -7.1429e+02 2.1669e+00 -1.3200e+03 -6.8571e+02 2.0513e+00 -1.3200e+03 -6.5714e+02 1.9361e+00 -1.3200e+03 -6.2857e+02 1.8216e+00 -1.3200e+03 -6.0000e+02 1.7083e+00 -1.3200e+03 -5.7143e+02 1.5964e+00 -1.3200e+03 -5.4286e+02 1.4862e+00 -1.3200e+03 -5.1429e+02 1.3782e+00 -1.3200e+03 -4.8571e+02 1.2728e+00 -1.3200e+03 -4.5714e+02 1.1702e+00 -1.3200e+03 -4.2857e+02 1.0711e+00 -1.3200e+03 -4.0000e+02 9.7570e-01 -1.3200e+03 -3.7143e+02 8.8452e-01 -1.3200e+03 -3.4286e+02 7.9797e-01 -1.3200e+03 -3.1429e+02 7.1647e-01 -1.3200e+03 -2.8571e+02 6.4043e-01 -1.3200e+03 -2.5714e+02 5.7025e-01 -1.3200e+03 -2.2857e+02 5.0631e-01 -1.3200e+03 -2.0000e+02 4.4897e-01 -1.3200e+03 -1.7143e+02 3.9856e-01 -1.3200e+03 -1.4286e+02 3.5538e-01 -1.3200e+03 -1.1429e+02 3.1968e-01 -1.3200e+03 -8.5714e+01 2.9168e-01 -1.3200e+03 -5.7143e+01 2.7155e-01 -1.3200e+03 -2.8571e+01 2.5942e-01 -1.3200e+03 0.0000e+00 2.5537e-01 -1.3200e+03 2.8571e+01 2.5942e-01 -1.3200e+03 5.7143e+01 2.7155e-01 -1.3200e+03 8.5714e+01 2.9168e-01 -1.3200e+03 1.1429e+02 3.1968e-01 -1.3200e+03 1.4286e+02 3.5538e-01 -1.3200e+03 1.7143e+02 3.9856e-01 -1.3200e+03 2.0000e+02 4.4897e-01 -1.3200e+03 2.2857e+02 5.0631e-01 -1.3200e+03 2.5714e+02 5.7025e-01 -1.3200e+03 2.8571e+02 6.4043e-01 -1.3200e+03 3.1429e+02 7.1647e-01 -1.3200e+03 3.4286e+02 7.9797e-01 -1.3200e+03 3.7143e+02 8.8452e-01 -1.3200e+03 4.0000e+02 9.7570e-01 -1.3200e+03 4.2857e+02 1.0711e+00 -1.3200e+03 4.5714e+02 1.1702e+00 -1.3200e+03 4.8571e+02 1.2728e+00 -1.3200e+03 5.1429e+02 1.3782e+00 -1.3200e+03 5.4286e+02 1.4862e+00 -1.3200e+03 5.7143e+02 1.5964e+00 -1.3200e+03 6.0000e+02 1.7083e+00 -1.3200e+03 6.2857e+02 1.8216e+00 -1.3200e+03 6.5714e+02 1.9361e+00 -1.3200e+03 6.8571e+02 2.0513e+00 -1.3200e+03 7.1429e+02 2.1669e+00 -1.3200e+03 7.4286e+02 2.2828e+00 -1.3200e+03 7.7143e+02 2.3986e+00 -1.3200e+03 8.0000e+02 2.5141e+00 -1.3200e+03 8.2857e+02 2.6291e+00 -1.3200e+03 8.5714e+02 2.7434e+00 -1.3200e+03 8.8571e+02 2.8569e+00 -1.3200e+03 9.1429e+02 2.9693e+00 -1.3200e+03 9.4286e+02 3.0805e+00 -1.3200e+03 9.7143e+02 3.1905e+00 -1.3200e+03 1.0000e+03 3.2991e+00 -1.3200e+03 1.0286e+03 3.4061e+00 -1.3200e+03 1.0571e+03 3.5117e+00 -1.3200e+03 1.0857e+03 3.6155e+00 -1.3200e+03 1.1143e+03 3.7177e+00 -1.3200e+03 1.1429e+03 3.8182e+00 -1.3200e+03 1.1714e+03 3.9169e+00 -1.3200e+03 1.2000e+03 4.0138e+00 -1.3200e+03 1.2286e+03 4.1089e+00 -1.3200e+03 1.2571e+03 4.2022e+00 -1.3200e+03 1.2857e+03 4.2937e+00 -1.3200e+03 1.3143e+03 4.3833e+00 -1.3200e+03 1.3429e+03 4.4711e+00 -1.3200e+03 1.3714e+03 4.5571e+00 -1.3200e+03 1.4000e+03 4.6413e+00 -1.3200e+03 1.4286e+03 4.7238e+00 -1.3200e+03 1.4571e+03 4.8044e+00 -1.3200e+03 1.4857e+03 4.8834e+00 -1.3200e+03 1.5143e+03 4.9606e+00 -1.3200e+03 1.5429e+03 5.0362e+00 -1.3200e+03 1.5714e+03 5.1100e+00 -1.3200e+03 1.6000e+03 5.1823e+00 -1.3200e+03 1.6286e+03 5.2530e+00 -1.3200e+03 1.6571e+03 5.3221e+00 -1.3200e+03 1.6857e+03 5.3897e+00 -1.3200e+03 1.7143e+03 5.4557e+00 -1.3200e+03 1.7429e+03 5.5204e+00 -1.3200e+03 1.7714e+03 5.5835e+00 -1.3200e+03 1.8000e+03 5.6453e+00 -1.3200e+03 1.8286e+03 5.7057e+00 -1.3200e+03 1.8571e+03 5.7648e+00 -1.3200e+03 1.8857e+03 5.8225e+00 -1.3200e+03 1.9143e+03 5.8790e+00 -1.3200e+03 1.9429e+03 5.9343e+00 -1.3200e+03 1.9714e+03 5.9883e+00 -1.3200e+03 2.0000e+03 6.0412e+00 -1.3500e+03 -2.0000e+03 6.0773e+00 -1.3500e+03 -1.9714e+03 6.0258e+00 -1.3500e+03 -1.9429e+03 5.9732e+00 -1.3500e+03 -1.9143e+03 5.9194e+00 -1.3500e+03 -1.8857e+03 5.8644e+00 -1.3500e+03 -1.8571e+03 5.8082e+00 -1.3500e+03 -1.8286e+03 5.7508e+00 -1.3500e+03 -1.8000e+03 5.6922e+00 -1.3500e+03 -1.7714e+03 5.6322e+00 -1.3500e+03 -1.7429e+03 5.5709e+00 -1.3500e+03 -1.7143e+03 5.5083e+00 -1.3500e+03 -1.6857e+03 5.4443e+00 -1.3500e+03 -1.6571e+03 5.3789e+00 -1.3500e+03 -1.6286e+03 5.3121e+00 -1.3500e+03 -1.6000e+03 5.2438e+00 -1.3500e+03 -1.5714e+03 5.1741e+00 -1.3500e+03 -1.5429e+03 5.1028e+00 -1.3500e+03 -1.5143e+03 5.0300e+00 -1.3500e+03 -1.4857e+03 4.9556e+00 -1.3500e+03 -1.4571e+03 4.8797e+00 -1.3500e+03 -1.4286e+03 4.8022e+00 -1.3500e+03 -1.4000e+03 4.7231e+00 -1.3500e+03 -1.3714e+03 4.6423e+00 -1.3500e+03 -1.3429e+03 4.5599e+00 -1.3500e+03 -1.3143e+03 4.4758e+00 -1.3500e+03 -1.2857e+03 4.3902e+00 -1.3500e+03 -1.2571e+03 4.3028e+00 -1.3500e+03 -1.2286e+03 4.2139e+00 -1.3500e+03 -1.2000e+03 4.1233e+00 -1.3500e+03 -1.1714e+03 4.0310e+00 -1.3500e+03 -1.1429e+03 3.9372e+00 -1.3500e+03 -1.1143e+03 3.8419e+00 -1.3500e+03 -1.0857e+03 3.7450e+00 -1.3500e+03 -1.0571e+03 3.6467e+00 -1.3500e+03 -1.0286e+03 3.5469e+00 -1.3500e+03 -1.0000e+03 3.4459e+00 -1.3500e+03 -9.7143e+02 3.3435e+00 -1.3500e+03 -9.4286e+02 3.2400e+00 -1.3500e+03 -9.1429e+02 3.1355e+00 -1.3500e+03 -8.8571e+02 3.0300e+00 -1.3500e+03 -8.5714e+02 2.9237e+00 -1.3500e+03 -8.2857e+02 2.8167e+00 -1.3500e+03 -8.0000e+02 2.7093e+00 -1.3500e+03 -7.7143e+02 2.6016e+00 -1.3500e+03 -7.4286e+02 2.4937e+00 -1.3500e+03 -7.1429e+02 2.3860e+00 -1.3500e+03 -6.8571e+02 2.2786e+00 -1.3500e+03 -6.5714e+02 2.1718e+00 -1.3500e+03 -6.2857e+02 2.0660e+00 -1.3500e+03 -6.0000e+02 1.9612e+00 -1.3500e+03 -5.7143e+02 1.8580e+00 -1.3500e+03 -5.4286e+02 1.7566e+00 -1.3500e+03 -5.1429e+02 1.6572e+00 -1.3500e+03 -4.8571e+02 1.5604e+00 -1.3500e+03 -4.5714e+02 1.4664e+00 -1.3500e+03 -4.2857e+02 1.3756e+00 -1.3500e+03 -4.0000e+02 1.2884e+00 -1.3500e+03 -3.7143e+02 1.2051e+00 -1.3500e+03 -3.4286e+02 1.1262e+00 -1.3500e+03 -3.1429e+02 1.0520e+00 -1.3500e+03 -2.8571e+02 9.8277e-01 -1.3500e+03 -2.5714e+02 9.1898e-01 -1.3500e+03 -2.2857e+02 8.6092e-01 -1.3500e+03 -2.0000e+02 8.0890e-01 -1.3500e+03 -1.7143e+02 7.6319e-01 -1.3500e+03 -1.4286e+02 7.2407e-01 -1.3500e+03 -1.1429e+02 6.9174e-01 -1.3500e+03 -8.5714e+01 6.6640e-01 -1.3500e+03 -5.7143e+01 6.4819e-01 -1.3500e+03 -2.8571e+01 6.3722e-01 -1.3500e+03 0.0000e+00 6.3355e-01 -1.3500e+03 2.8571e+01 6.3722e-01 -1.3500e+03 5.7143e+01 6.4819e-01 -1.3500e+03 8.5714e+01 6.6640e-01 -1.3500e+03 1.1429e+02 6.9174e-01 -1.3500e+03 1.4286e+02 7.2407e-01 -1.3500e+03 1.7143e+02 7.6319e-01 -1.3500e+03 2.0000e+02 8.0890e-01 -1.3500e+03 2.2857e+02 8.6092e-01 -1.3500e+03 2.5714e+02 9.1898e-01 -1.3500e+03 2.8571e+02 9.8277e-01 -1.3500e+03 3.1429e+02 1.0520e+00 -1.3500e+03 3.4286e+02 1.1262e+00 -1.3500e+03 3.7143e+02 1.2051e+00 -1.3500e+03 4.0000e+02 1.2884e+00 -1.3500e+03 4.2857e+02 1.3756e+00 -1.3500e+03 4.5714e+02 1.4664e+00 -1.3500e+03 4.8571e+02 1.5604e+00 -1.3500e+03 5.1429e+02 1.6572e+00 -1.3500e+03 5.4286e+02 1.7566e+00 -1.3500e+03 5.7143e+02 1.8580e+00 -1.3500e+03 6.0000e+02 1.9612e+00 -1.3500e+03 6.2857e+02 2.0660e+00 -1.3500e+03 6.5714e+02 2.1718e+00 -1.3500e+03 6.8571e+02 2.2786e+00 -1.3500e+03 7.1429e+02 2.3860e+00 -1.3500e+03 7.4286e+02 2.4937e+00 -1.3500e+03 7.7143e+02 2.6016e+00 -1.3500e+03 8.0000e+02 2.7093e+00 -1.3500e+03 8.2857e+02 2.8167e+00 -1.3500e+03 8.5714e+02 2.9237e+00 -1.3500e+03 8.8571e+02 3.0300e+00 -1.3500e+03 9.1429e+02 3.1355e+00 -1.3500e+03 9.4286e+02 3.2400e+00 -1.3500e+03 9.7143e+02 3.3435e+00 -1.3500e+03 1.0000e+03 3.4459e+00 -1.3500e+03 1.0286e+03 3.5469e+00 -1.3500e+03 1.0571e+03 3.6467e+00 -1.3500e+03 1.0857e+03 3.7450e+00 -1.3500e+03 1.1143e+03 3.8419e+00 -1.3500e+03 1.1429e+03 3.9372e+00 -1.3500e+03 1.1714e+03 4.0310e+00 -1.3500e+03 1.2000e+03 4.1233e+00 -1.3500e+03 1.2286e+03 4.2139e+00 -1.3500e+03 1.2571e+03 4.3028e+00 -1.3500e+03 1.2857e+03 4.3902e+00 -1.3500e+03 1.3143e+03 4.4758e+00 -1.3500e+03 1.3429e+03 4.5599e+00 -1.3500e+03 1.3714e+03 4.6423e+00 -1.3500e+03 1.4000e+03 4.7231e+00 -1.3500e+03 1.4286e+03 4.8022e+00 -1.3500e+03 1.4571e+03 4.8797e+00 -1.3500e+03 1.4857e+03 4.9556e+00 -1.3500e+03 1.5143e+03 5.0300e+00 -1.3500e+03 1.5429e+03 5.1028e+00 -1.3500e+03 1.5714e+03 5.1741e+00 -1.3500e+03 1.6000e+03 5.2438e+00 -1.3500e+03 1.6286e+03 5.3121e+00 -1.3500e+03 1.6571e+03 5.3789e+00 -1.3500e+03 1.6857e+03 5.4443e+00 -1.3500e+03 1.7143e+03 5.5083e+00 -1.3500e+03 1.7429e+03 5.5709e+00 -1.3500e+03 1.7714e+03 5.6322e+00 -1.3500e+03 1.8000e+03 5.6922e+00 -1.3500e+03 1.8286e+03 5.7508e+00 -1.3500e+03 1.8571e+03 5.8082e+00 -1.3500e+03 1.8857e+03 5.8644e+00 -1.3500e+03 1.9143e+03 5.9194e+00 -1.3500e+03 1.9429e+03 5.9732e+00 -1.3500e+03 1.9714e+03 6.0258e+00 -1.3500e+03 2.0000e+03 6.0773e+00 -1.3800e+03 -2.0000e+03 6.1134e+00 -1.3800e+03 -1.9714e+03 6.0632e+00 -1.3800e+03 -1.9429e+03 6.0119e+00 -1.3800e+03 -1.9143e+03 5.9595e+00 -1.3800e+03 -1.8857e+03 5.9061e+00 -1.3800e+03 -1.8571e+03 5.8514e+00 -1.3800e+03 -1.8286e+03 5.7957e+00 -1.3800e+03 -1.8000e+03 5.7387e+00 -1.3800e+03 -1.7714e+03 5.6805e+00 -1.3800e+03 -1.7429e+03 5.6211e+00 -1.3800e+03 -1.7143e+03 5.5604e+00 -1.3800e+03 -1.6857e+03 5.4984e+00 -1.3800e+03 -1.6571e+03 5.4352e+00 -1.3800e+03 -1.6286e+03 5.3706e+00 -1.3800e+03 -1.6000e+03 5.3046e+00 -1.3800e+03 -1.5714e+03 5.2373e+00 -1.3800e+03 -1.5429e+03 5.1685e+00 -1.3800e+03 -1.5143e+03 5.0984e+00 -1.3800e+03 -1.4857e+03 5.0268e+00 -1.3800e+03 -1.4571e+03 4.9537e+00 -1.3800e+03 -1.4286e+03 4.8792e+00 -1.3800e+03 -1.4000e+03 4.8032e+00 -1.3800e+03 -1.3714e+03 4.7258e+00 -1.3800e+03 -1.3429e+03 4.6468e+00 -1.3800e+03 -1.3143e+03 4.5664e+00 -1.3800e+03 -1.2857e+03 4.4844e+00 -1.3800e+03 -1.2571e+03 4.4010e+00 -1.3800e+03 -1.2286e+03 4.3161e+00 -1.3800e+03 -1.2000e+03 4.2298e+00 -1.3800e+03 -1.1714e+03 4.1420e+00 -1.3800e+03 -1.1429e+03 4.0529e+00 -1.3800e+03 -1.1143e+03 3.9623e+00 -1.3800e+03 -1.0857e+03 3.8705e+00 -1.3800e+03 -1.0571e+03 3.7773e+00 -1.3800e+03 -1.0286e+03 3.6830e+00 -1.3800e+03 -1.0000e+03 3.5875e+00 -1.3800e+03 -9.7143e+02 3.4910e+00 -1.3800e+03 -9.4286e+02 3.3935e+00 -1.3800e+03 -9.1429e+02 3.2951e+00 -1.3800e+03 -8.8571e+02 3.1960e+00 -1.3800e+03 -8.5714e+02 3.0963e+00 -1.3800e+03 -8.2857e+02 2.9962e+00 -1.3800e+03 -8.0000e+02 2.8957e+00 -1.3800e+03 -7.7143e+02 2.7951e+00 -1.3800e+03 -7.4286e+02 2.6945e+00 -1.3800e+03 -7.1429e+02 2.5942e+00 -1.3800e+03 -6.8571e+02 2.4944e+00 -1.3800e+03 -6.5714e+02 2.3953e+00 -1.3800e+03 -6.2857e+02 2.2971e+00 -1.3800e+03 -6.0000e+02 2.2002e+00 -1.3800e+03 -5.7143e+02 2.1048e+00 -1.3800e+03 -5.4286e+02 2.0112e+00 -1.3800e+03 -5.1429e+02 1.9197e+00 -1.3800e+03 -4.8571e+02 1.8306e+00 -1.3800e+03 -4.5714e+02 1.7442e+00 -1.3800e+03 -4.2857e+02 1.6609e+00 -1.3800e+03 -4.0000e+02 1.5809e+00 -1.3800e+03 -3.7143e+02 1.5047e+00 -1.3800e+03 -3.4286e+02 1.4325e+00 -1.3800e+03 -3.1429e+02 1.3647e+00 -1.3800e+03 -2.8571e+02 1.3016e+00 -1.3800e+03 -2.5714e+02 1.2434e+00 -1.3800e+03 -2.2857e+02 1.1905e+00 -1.3800e+03 -2.0000e+02 1.1432e+00 -1.3800e+03 -1.7143e+02 1.1016e+00 -1.3800e+03 -1.4286e+02 1.0661e+00 -1.3800e+03 -1.1429e+02 1.0367e+00 -1.3800e+03 -8.5714e+01 1.0137e+00 -1.3800e+03 -5.7143e+01 9.9714e-01 -1.3800e+03 -2.8571e+01 9.8719e-01 -1.3800e+03 0.0000e+00 9.8386e-01 -1.3800e+03 2.8571e+01 9.8719e-01 -1.3800e+03 5.7143e+01 9.9714e-01 -1.3800e+03 8.5714e+01 1.0137e+00 -1.3800e+03 1.1429e+02 1.0367e+00 -1.3800e+03 1.4286e+02 1.0661e+00 -1.3800e+03 1.7143e+02 1.1016e+00 -1.3800e+03 2.0000e+02 1.1432e+00 -1.3800e+03 2.2857e+02 1.1905e+00 -1.3800e+03 2.5714e+02 1.2434e+00 -1.3800e+03 2.8571e+02 1.3016e+00 -1.3800e+03 3.1429e+02 1.3647e+00 -1.3800e+03 3.4286e+02 1.4325e+00 -1.3800e+03 3.7143e+02 1.5047e+00 -1.3800e+03 4.0000e+02 1.5809e+00 -1.3800e+03 4.2857e+02 1.6609e+00 -1.3800e+03 4.5714e+02 1.7442e+00 -1.3800e+03 4.8571e+02 1.8306e+00 -1.3800e+03 5.1429e+02 1.9197e+00 -1.3800e+03 5.4286e+02 2.0112e+00 -1.3800e+03 5.7143e+02 2.1048e+00 -1.3800e+03 6.0000e+02 2.2002e+00 -1.3800e+03 6.2857e+02 2.2971e+00 -1.3800e+03 6.5714e+02 2.3953e+00 -1.3800e+03 6.8571e+02 2.4944e+00 -1.3800e+03 7.1429e+02 2.5942e+00 -1.3800e+03 7.4286e+02 2.6945e+00 -1.3800e+03 7.7143e+02 2.7951e+00 -1.3800e+03 8.0000e+02 2.8957e+00 -1.3800e+03 8.2857e+02 2.9962e+00 -1.3800e+03 8.5714e+02 3.0963e+00 -1.3800e+03 8.8571e+02 3.1960e+00 -1.3800e+03 9.1429e+02 3.2951e+00 -1.3800e+03 9.4286e+02 3.3935e+00 -1.3800e+03 9.7143e+02 3.4910e+00 -1.3800e+03 1.0000e+03 3.5875e+00 -1.3800e+03 1.0286e+03 3.6830e+00 -1.3800e+03 1.0571e+03 3.7773e+00 -1.3800e+03 1.0857e+03 3.8705e+00 -1.3800e+03 1.1143e+03 3.9623e+00 -1.3800e+03 1.1429e+03 4.0529e+00 -1.3800e+03 1.1714e+03 4.1420e+00 -1.3800e+03 1.2000e+03 4.2298e+00 -1.3800e+03 1.2286e+03 4.3161e+00 -1.3800e+03 1.2571e+03 4.4010e+00 -1.3800e+03 1.2857e+03 4.4844e+00 -1.3800e+03 1.3143e+03 4.5664e+00 -1.3800e+03 1.3429e+03 4.6468e+00 -1.3800e+03 1.3714e+03 4.7258e+00 -1.3800e+03 1.4000e+03 4.8032e+00 -1.3800e+03 1.4286e+03 4.8792e+00 -1.3800e+03 1.4571e+03 4.9537e+00 -1.3800e+03 1.4857e+03 5.0268e+00 -1.3800e+03 1.5143e+03 5.0984e+00 -1.3800e+03 1.5429e+03 5.1685e+00 -1.3800e+03 1.5714e+03 5.2373e+00 -1.3800e+03 1.6000e+03 5.3046e+00 -1.3800e+03 1.6286e+03 5.3706e+00 -1.3800e+03 1.6571e+03 5.4352e+00 -1.3800e+03 1.6857e+03 5.4984e+00 -1.3800e+03 1.7143e+03 5.5604e+00 -1.3800e+03 1.7429e+03 5.6211e+00 -1.3800e+03 1.7714e+03 5.6805e+00 -1.3800e+03 1.8000e+03 5.7387e+00 -1.3800e+03 1.8286e+03 5.7957e+00 -1.3800e+03 1.8571e+03 5.8514e+00 -1.3800e+03 1.8857e+03 5.9061e+00 -1.3800e+03 1.9143e+03 5.9595e+00 -1.3800e+03 1.9429e+03 6.0119e+00 -1.3800e+03 1.9714e+03 6.0632e+00 -1.3800e+03 2.0000e+03 6.1134e+00 -1.4100e+03 -2.0000e+03 6.1493e+00 -1.4100e+03 -1.9714e+03 6.1004e+00 -1.4100e+03 -1.9429e+03 6.0505e+00 -1.4100e+03 -1.9143e+03 5.9995e+00 -1.4100e+03 -1.8857e+03 5.9475e+00 -1.4100e+03 -1.8571e+03 5.8944e+00 -1.4100e+03 -1.8286e+03 5.8402e+00 -1.4100e+03 -1.8000e+03 5.7849e+00 -1.4100e+03 -1.7714e+03 5.7284e+00 -1.4100e+03 -1.7429e+03 5.6708e+00 -1.4100e+03 -1.7143e+03 5.6120e+00 -1.4100e+03 -1.6857e+03 5.5520e+00 -1.4100e+03 -1.6571e+03 5.4908e+00 -1.4100e+03 -1.6286e+03 5.4283e+00 -1.4100e+03 -1.6000e+03 5.3646e+00 -1.4100e+03 -1.5714e+03 5.2995e+00 -1.4100e+03 -1.5429e+03 5.2332e+00 -1.4100e+03 -1.5143e+03 5.1656e+00 -1.4100e+03 -1.4857e+03 5.0967e+00 -1.4100e+03 -1.4571e+03 5.0264e+00 -1.4100e+03 -1.4286e+03 4.9548e+00 -1.4100e+03 -1.4000e+03 4.8819e+00 -1.4100e+03 -1.3714e+03 4.8076e+00 -1.4100e+03 -1.3429e+03 4.7319e+00 -1.4100e+03 -1.3143e+03 4.6549e+00 -1.4100e+03 -1.2857e+03 4.5765e+00 -1.4100e+03 -1.2571e+03 4.4968e+00 -1.4100e+03 -1.2286e+03 4.4158e+00 -1.4100e+03 -1.2000e+03 4.3335e+00 -1.4100e+03 -1.1714e+03 4.2499e+00 -1.4100e+03 -1.1429e+03 4.1651e+00 -1.4100e+03 -1.1143e+03 4.0791e+00 -1.4100e+03 -1.0857e+03 3.9920e+00 -1.4100e+03 -1.0571e+03 3.9037e+00 -1.4100e+03 -1.0286e+03 3.8144e+00 -1.4100e+03 -1.0000e+03 3.7242e+00 -1.4100e+03 -9.7143e+02 3.6331e+00 -1.4100e+03 -9.4286e+02 3.5412e+00 -1.4100e+03 -9.1429e+02 3.4486e+00 -1.4100e+03 -8.8571e+02 3.3554e+00 -1.4100e+03 -8.5714e+02 3.2618e+00 -1.4100e+03 -8.2857e+02 3.1679e+00 -1.4100e+03 -8.0000e+02 3.0738e+00 -1.4100e+03 -7.7143e+02 2.9797e+00 -1.4100e+03 -7.4286e+02 2.8858e+00 -1.4100e+03 -7.1429e+02 2.7923e+00 -1.4100e+03 -6.8571e+02 2.6994e+00 -1.4100e+03 -6.5714e+02 2.6073e+00 -1.4100e+03 -6.2857e+02 2.5161e+00 -1.4100e+03 -6.0000e+02 2.4263e+00 -1.4100e+03 -5.7143e+02 2.3380e+00 -1.4100e+03 -5.4286e+02 2.2514e+00 -1.4100e+03 -5.1429e+02 2.1669e+00 -1.4100e+03 -4.8571e+02 2.0847e+00 -1.4100e+03 -4.5714e+02 2.0052e+00 -1.4100e+03 -4.2857e+02 1.9285e+00 -1.4100e+03 -4.0000e+02 1.8551e+00 -1.4100e+03 -3.7143e+02 1.7851e+00 -1.4100e+03 -3.4286e+02 1.7190e+00 -1.4100e+03 -3.1429e+02 1.6569e+00 -1.4100e+03 -2.8571e+02 1.5991e+00 -1.4100e+03 -2.5714e+02 1.5459e+00 -1.4100e+03 -2.2857e+02 1.4976e+00 -1.4100e+03 -2.0000e+02 1.4544e+00 -1.4100e+03 -1.7143e+02 1.4165e+00 -1.4100e+03 -1.4286e+02 1.3841e+00 -1.4100e+03 -1.1429e+02 1.3573e+00 -1.4100e+03 -8.5714e+01 1.3364e+00 -1.4100e+03 -5.7143e+01 1.3213e+00 -1.4100e+03 -2.8571e+01 1.3123e+00 -1.4100e+03 0.0000e+00 1.3092e+00 -1.4100e+03 2.8571e+01 1.3123e+00 -1.4100e+03 5.7143e+01 1.3213e+00 -1.4100e+03 8.5714e+01 1.3364e+00 -1.4100e+03 1.1429e+02 1.3573e+00 -1.4100e+03 1.4286e+02 1.3841e+00 -1.4100e+03 1.7143e+02 1.4165e+00 -1.4100e+03 2.0000e+02 1.4544e+00 -1.4100e+03 2.2857e+02 1.4976e+00 -1.4100e+03 2.5714e+02 1.5459e+00 -1.4100e+03 2.8571e+02 1.5991e+00 -1.4100e+03 3.1429e+02 1.6569e+00 -1.4100e+03 3.4286e+02 1.7190e+00 -1.4100e+03 3.7143e+02 1.7851e+00 -1.4100e+03 4.0000e+02 1.8551e+00 -1.4100e+03 4.2857e+02 1.9285e+00 -1.4100e+03 4.5714e+02 2.0052e+00 -1.4100e+03 4.8571e+02 2.0847e+00 -1.4100e+03 5.1429e+02 2.1669e+00 -1.4100e+03 5.4286e+02 2.2514e+00 -1.4100e+03 5.7143e+02 2.3380e+00 -1.4100e+03 6.0000e+02 2.4263e+00 -1.4100e+03 6.2857e+02 2.5161e+00 -1.4100e+03 6.5714e+02 2.6073e+00 -1.4100e+03 6.8571e+02 2.6994e+00 -1.4100e+03 7.1429e+02 2.7923e+00 -1.4100e+03 7.4286e+02 2.8858e+00 -1.4100e+03 7.7143e+02 2.9797e+00 -1.4100e+03 8.0000e+02 3.0738e+00 -1.4100e+03 8.2857e+02 3.1679e+00 -1.4100e+03 8.5714e+02 3.2618e+00 -1.4100e+03 8.8571e+02 3.3554e+00 -1.4100e+03 9.1429e+02 3.4486e+00 -1.4100e+03 9.4286e+02 3.5412e+00 -1.4100e+03 9.7143e+02 3.6331e+00 -1.4100e+03 1.0000e+03 3.7242e+00 -1.4100e+03 1.0286e+03 3.8144e+00 -1.4100e+03 1.0571e+03 3.9037e+00 -1.4100e+03 1.0857e+03 3.9920e+00 -1.4100e+03 1.1143e+03 4.0791e+00 -1.4100e+03 1.1429e+03 4.1651e+00 -1.4100e+03 1.1714e+03 4.2499e+00 -1.4100e+03 1.2000e+03 4.3335e+00 -1.4100e+03 1.2286e+03 4.4158e+00 -1.4100e+03 1.2571e+03 4.4968e+00 -1.4100e+03 1.2857e+03 4.5765e+00 -1.4100e+03 1.3143e+03 4.6549e+00 -1.4100e+03 1.3429e+03 4.7319e+00 -1.4100e+03 1.3714e+03 4.8076e+00 -1.4100e+03 1.4000e+03 4.8819e+00 -1.4100e+03 1.4286e+03 4.9548e+00 -1.4100e+03 1.4571e+03 5.0264e+00 -1.4100e+03 1.4857e+03 5.0967e+00 -1.4100e+03 1.5143e+03 5.1656e+00 -1.4100e+03 1.5429e+03 5.2332e+00 -1.4100e+03 1.5714e+03 5.2995e+00 -1.4100e+03 1.6000e+03 5.3646e+00 -1.4100e+03 1.6286e+03 5.4283e+00 -1.4100e+03 1.6571e+03 5.4908e+00 -1.4100e+03 1.6857e+03 5.5520e+00 -1.4100e+03 1.7143e+03 5.6120e+00 -1.4100e+03 1.7429e+03 5.6708e+00 -1.4100e+03 1.7714e+03 5.7284e+00 -1.4100e+03 1.8000e+03 5.7849e+00 -1.4100e+03 1.8286e+03 5.8402e+00 -1.4100e+03 1.8571e+03 5.8944e+00 -1.4100e+03 1.8857e+03 5.9475e+00 -1.4100e+03 1.9143e+03 5.9995e+00 -1.4100e+03 1.9429e+03 6.0505e+00 -1.4100e+03 1.9714e+03 6.1004e+00 -1.4100e+03 2.0000e+03 6.1493e+00 -1.4400e+03 -2.0000e+03 6.1851e+00 -1.4400e+03 -1.9714e+03 6.1374e+00 -1.4400e+03 -1.9429e+03 6.0888e+00 -1.4400e+03 -1.9143e+03 6.0392e+00 -1.4400e+03 -1.8857e+03 5.9886e+00 -1.4400e+03 -1.8571e+03 5.9370e+00 -1.4400e+03 -1.8286e+03 5.8843e+00 -1.4400e+03 -1.8000e+03 5.8306e+00 -1.4400e+03 -1.7714e+03 5.7758e+00 -1.4400e+03 -1.7429e+03 5.7200e+00 -1.4400e+03 -1.7143e+03 5.6630e+00 -1.4400e+03 -1.6857e+03 5.6049e+00 -1.4400e+03 -1.6571e+03 5.5457e+00 -1.4400e+03 -1.6286e+03 5.4853e+00 -1.4400e+03 -1.6000e+03 5.4237e+00 -1.4400e+03 -1.5714e+03 5.3610e+00 -1.4400e+03 -1.5429e+03 5.2970e+00 -1.4400e+03 -1.5143e+03 5.2318e+00 -1.4400e+03 -1.4857e+03 5.1655e+00 -1.4400e+03 -1.4571e+03 5.0979e+00 -1.4400e+03 -1.4286e+03 5.0290e+00 -1.4400e+03 -1.4000e+03 4.9590e+00 -1.4400e+03 -1.3714e+03 4.8877e+00 -1.4400e+03 -1.3429e+03 4.8151e+00 -1.4400e+03 -1.3143e+03 4.7414e+00 -1.4400e+03 -1.2857e+03 4.6664e+00 -1.4400e+03 -1.2571e+03 4.5903e+00 -1.4400e+03 -1.2286e+03 4.5130e+00 -1.4400e+03 -1.2000e+03 4.4345e+00 -1.4400e+03 -1.1714e+03 4.3549e+00 -1.4400e+03 -1.1429e+03 4.2742e+00 -1.4400e+03 -1.1143e+03 4.1924e+00 -1.4400e+03 -1.0857e+03 4.1097e+00 -1.4400e+03 -1.0571e+03 4.0260e+00 -1.4400e+03 -1.0286e+03 3.9415e+00 -1.4400e+03 -1.0000e+03 3.8561e+00 -1.4400e+03 -9.7143e+02 3.7701e+00 -1.4400e+03 -9.4286e+02 3.6833e+00 -1.4400e+03 -9.1429e+02 3.5961e+00 -1.4400e+03 -8.8571e+02 3.5084e+00 -1.4400e+03 -8.5714e+02 3.4205e+00 -1.4400e+03 -8.2857e+02 3.3323e+00 -1.4400e+03 -8.0000e+02 3.2441e+00 -1.4400e+03 -7.7143e+02 3.1561e+00 -1.4400e+03 -7.4286e+02 3.0683e+00 -1.4400e+03 -7.1429e+02 2.9810e+00 -1.4400e+03 -6.8571e+02 2.8944e+00 -1.4400e+03 -6.5714e+02 2.8086e+00 -1.4400e+03 -6.2857e+02 2.7239e+00 -1.4400e+03 -6.0000e+02 2.6404e+00 -1.4400e+03 -5.7143e+02 2.5585e+00 -1.4400e+03 -5.4286e+02 2.4783e+00 -1.4400e+03 -5.1429e+02 2.4001e+00 -1.4400e+03 -4.8571e+02 2.3242e+00 -1.4400e+03 -4.5714e+02 2.2508e+00 -1.4400e+03 -4.2857e+02 2.1802e+00 -1.4400e+03 -4.0000e+02 2.1125e+00 -1.4400e+03 -3.7143e+02 2.0482e+00 -1.4400e+03 -3.4286e+02 1.9874e+00 -1.4400e+03 -3.1429e+02 1.9304e+00 -1.4400e+03 -2.8571e+02 1.8774e+00 -1.4400e+03 -2.5714e+02 1.8287e+00 -1.4400e+03 -2.2857e+02 1.7844e+00 -1.4400e+03 -2.0000e+02 1.7449e+00 -1.4400e+03 -1.7143e+02 1.7102e+00 -1.4400e+03 -1.4286e+02 1.6806e+00 -1.4400e+03 -1.1429e+02 1.6561e+00 -1.4400e+03 -8.5714e+01 1.6370e+00 -1.4400e+03 -5.7143e+01 1.6232e+00 -1.4400e+03 -2.8571e+01 1.6150e+00 -1.4400e+03 0.0000e+00 1.6122e+00 -1.4400e+03 2.8571e+01 1.6150e+00 -1.4400e+03 5.7143e+01 1.6232e+00 -1.4400e+03 8.5714e+01 1.6370e+00 -1.4400e+03 1.1429e+02 1.6561e+00 -1.4400e+03 1.4286e+02 1.6806e+00 -1.4400e+03 1.7143e+02 1.7102e+00 -1.4400e+03 2.0000e+02 1.7449e+00 -1.4400e+03 2.2857e+02 1.7844e+00 -1.4400e+03 2.5714e+02 1.8287e+00 -1.4400e+03 2.8571e+02 1.8774e+00 -1.4400e+03 3.1429e+02 1.9304e+00 -1.4400e+03 3.4286e+02 1.9874e+00 -1.4400e+03 3.7143e+02 2.0482e+00 -1.4400e+03 4.0000e+02 2.1125e+00 -1.4400e+03 4.2857e+02 2.1802e+00 -1.4400e+03 4.5714e+02 2.2508e+00 -1.4400e+03 4.8571e+02 2.3242e+00 -1.4400e+03 5.1429e+02 2.4001e+00 -1.4400e+03 5.4286e+02 2.4783e+00 -1.4400e+03 5.7143e+02 2.5585e+00 -1.4400e+03 6.0000e+02 2.6404e+00 -1.4400e+03 6.2857e+02 2.7239e+00 -1.4400e+03 6.5714e+02 2.8086e+00 -1.4400e+03 6.8571e+02 2.8944e+00 -1.4400e+03 7.1429e+02 2.9810e+00 -1.4400e+03 7.4286e+02 3.0683e+00 -1.4400e+03 7.7143e+02 3.1561e+00 -1.4400e+03 8.0000e+02 3.2441e+00 -1.4400e+03 8.2857e+02 3.3323e+00 -1.4400e+03 8.5714e+02 3.4205e+00 -1.4400e+03 8.8571e+02 3.5084e+00 -1.4400e+03 9.1429e+02 3.5961e+00 -1.4400e+03 9.4286e+02 3.6833e+00 -1.4400e+03 9.7143e+02 3.7701e+00 -1.4400e+03 1.0000e+03 3.8561e+00 -1.4400e+03 1.0286e+03 3.9415e+00 -1.4400e+03 1.0571e+03 4.0260e+00 -1.4400e+03 1.0857e+03 4.1097e+00 -1.4400e+03 1.1143e+03 4.1924e+00 -1.4400e+03 1.1429e+03 4.2742e+00 -1.4400e+03 1.1714e+03 4.3549e+00 -1.4400e+03 1.2000e+03 4.4345e+00 -1.4400e+03 1.2286e+03 4.5130e+00 -1.4400e+03 1.2571e+03 4.5903e+00 -1.4400e+03 1.2857e+03 4.6664e+00 -1.4400e+03 1.3143e+03 4.7414e+00 -1.4400e+03 1.3429e+03 4.8151e+00 -1.4400e+03 1.3714e+03 4.8877e+00 -1.4400e+03 1.4000e+03 4.9590e+00 -1.4400e+03 1.4286e+03 5.0290e+00 -1.4400e+03 1.4571e+03 5.0979e+00 -1.4400e+03 1.4857e+03 5.1655e+00 -1.4400e+03 1.5143e+03 5.2318e+00 -1.4400e+03 1.5429e+03 5.2970e+00 -1.4400e+03 1.5714e+03 5.3610e+00 -1.4400e+03 1.6000e+03 5.4237e+00 -1.4400e+03 1.6286e+03 5.4853e+00 -1.4400e+03 1.6571e+03 5.5457e+00 -1.4400e+03 1.6857e+03 5.6049e+00 -1.4400e+03 1.7143e+03 5.6630e+00 -1.4400e+03 1.7429e+03 5.7200e+00 -1.4400e+03 1.7714e+03 5.7758e+00 -1.4400e+03 1.8000e+03 5.8306e+00 -1.4400e+03 1.8286e+03 5.8843e+00 -1.4400e+03 1.8571e+03 5.9370e+00 -1.4400e+03 1.8857e+03 5.9886e+00 -1.4400e+03 1.9143e+03 6.0392e+00 -1.4400e+03 1.9429e+03 6.0888e+00 -1.4400e+03 1.9714e+03 6.1374e+00 -1.4400e+03 2.0000e+03 6.1851e+00 -1.4700e+03 -2.0000e+03 6.2207e+00 -1.4700e+03 -1.9714e+03 6.1743e+00 -1.4700e+03 -1.9429e+03 6.1269e+00 -1.4700e+03 -1.9143e+03 6.0786e+00 -1.4700e+03 -1.8857e+03 6.0294e+00 -1.4700e+03 -1.8571e+03 5.9792e+00 -1.4700e+03 -1.8286e+03 5.9281e+00 -1.4700e+03 -1.8000e+03 5.8760e+00 -1.4700e+03 -1.7714e+03 5.8228e+00 -1.4700e+03 -1.7429e+03 5.7687e+00 -1.4700e+03 -1.7143e+03 5.7135e+00 -1.4700e+03 -1.6857e+03 5.6572e+00 -1.4700e+03 -1.6571e+03 5.5999e+00 -1.4700e+03 -1.6286e+03 5.5415e+00 -1.4700e+03 -1.6000e+03 5.4820e+00 -1.4700e+03 -1.5714e+03 5.4215e+00 -1.4700e+03 -1.5429e+03 5.3598e+00 -1.4700e+03 -1.5143e+03 5.2970e+00 -1.4700e+03 -1.4857e+03 5.2330e+00 -1.4700e+03 -1.4571e+03 5.1680e+00 -1.4700e+03 -1.4286e+03 5.1018e+00 -1.4700e+03 -1.4000e+03 5.0345e+00 -1.4700e+03 -1.3714e+03 4.9661e+00 -1.4700e+03 -1.3429e+03 4.8966e+00 -1.4700e+03 -1.3143e+03 4.8260e+00 -1.4700e+03 -1.2857e+03 4.7542e+00 -1.4700e+03 -1.2571e+03 4.6814e+00 -1.4700e+03 -1.2286e+03 4.6076e+00 -1.4700e+03 -1.2000e+03 4.5327e+00 -1.4700e+03 -1.1714e+03 4.4569e+00 -1.4700e+03 -1.1429e+03 4.3801e+00 -1.4700e+03 -1.1143e+03 4.3024e+00 -1.4700e+03 -1.0857e+03 4.2238e+00 -1.4700e+03 -1.0571e+03 4.1444e+00 -1.4700e+03 -1.0286e+03 4.0643e+00 -1.4700e+03 -1.0000e+03 3.9835e+00 -1.4700e+03 -9.7143e+02 3.9021e+00 -1.4700e+03 -9.4286e+02 3.8203e+00 -1.4700e+03 -9.1429e+02 3.7380e+00 -1.4700e+03 -8.8571e+02 3.6554e+00 -1.4700e+03 -8.5714e+02 3.5727e+00 -1.4700e+03 -8.2857e+02 3.4899e+00 -1.4700e+03 -8.0000e+02 3.4071e+00 -1.4700e+03 -7.7143e+02 3.3246e+00 -1.4700e+03 -7.4286e+02 3.2425e+00 -1.4700e+03 -7.1429e+02 3.1609e+00 -1.4700e+03 -6.8571e+02 3.0800e+00 -1.4700e+03 -6.5714e+02 3.0000e+00 -1.4700e+03 -6.2857e+02 2.9211e+00 -1.4700e+03 -6.0000e+02 2.8435e+00 -1.4700e+03 -5.7143e+02 2.7674e+00 -1.4700e+03 -5.4286e+02 2.6930e+00 -1.4700e+03 -5.1429e+02 2.6205e+00 -1.4700e+03 -4.8571e+02 2.5503e+00 -1.4700e+03 -4.5714e+02 2.4824e+00 -1.4700e+03 -4.2857e+02 2.4171e+00 -1.4700e+03 -4.0000e+02 2.3547e+00 -1.4700e+03 -3.7143e+02 2.2954e+00 -1.4700e+03 -3.4286e+02 2.2394e+00 -1.4700e+03 -3.1429e+02 2.1869e+00 -1.4700e+03 -2.8571e+02 2.1382e+00 -1.4700e+03 -2.5714e+02 2.0935e+00 -1.4700e+03 -2.2857e+02 2.0529e+00 -1.4700e+03 -2.0000e+02 2.0166e+00 -1.4700e+03 -1.7143e+02 1.9848e+00 -1.4700e+03 -1.4286e+02 1.9576e+00 -1.4700e+03 -1.1429e+02 1.9352e+00 -1.4700e+03 -8.5714e+01 1.9177e+00 -1.4700e+03 -5.7143e+01 1.9051e+00 -1.4700e+03 -2.8571e+01 1.8975e+00 -1.4700e+03 0.0000e+00 1.8950e+00 -1.4700e+03 2.8571e+01 1.8975e+00 -1.4700e+03 5.7143e+01 1.9051e+00 -1.4700e+03 8.5714e+01 1.9177e+00 -1.4700e+03 1.1429e+02 1.9352e+00 -1.4700e+03 1.4286e+02 1.9576e+00 -1.4700e+03 1.7143e+02 1.9848e+00 -1.4700e+03 2.0000e+02 2.0166e+00 -1.4700e+03 2.2857e+02 2.0529e+00 -1.4700e+03 2.5714e+02 2.0935e+00 -1.4700e+03 2.8571e+02 2.1382e+00 -1.4700e+03 3.1429e+02 2.1869e+00 -1.4700e+03 3.4286e+02 2.2394e+00 -1.4700e+03 3.7143e+02 2.2954e+00 -1.4700e+03 4.0000e+02 2.3547e+00 -1.4700e+03 4.2857e+02 2.4171e+00 -1.4700e+03 4.5714e+02 2.4824e+00 -1.4700e+03 4.8571e+02 2.5503e+00 -1.4700e+03 5.1429e+02 2.6205e+00 -1.4700e+03 5.4286e+02 2.6930e+00 -1.4700e+03 5.7143e+02 2.7674e+00 -1.4700e+03 6.0000e+02 2.8435e+00 -1.4700e+03 6.2857e+02 2.9211e+00 -1.4700e+03 6.5714e+02 3.0000e+00 -1.4700e+03 6.8571e+02 3.0800e+00 -1.4700e+03 7.1429e+02 3.1609e+00 -1.4700e+03 7.4286e+02 3.2425e+00 -1.4700e+03 7.7143e+02 3.3246e+00 -1.4700e+03 8.0000e+02 3.4071e+00 -1.4700e+03 8.2857e+02 3.4899e+00 -1.4700e+03 8.5714e+02 3.5727e+00 -1.4700e+03 8.8571e+02 3.6554e+00 -1.4700e+03 9.1429e+02 3.7380e+00 -1.4700e+03 9.4286e+02 3.8203e+00 -1.4700e+03 9.7143e+02 3.9021e+00 -1.4700e+03 1.0000e+03 3.9835e+00 -1.4700e+03 1.0286e+03 4.0643e+00 -1.4700e+03 1.0571e+03 4.1444e+00 -1.4700e+03 1.0857e+03 4.2238e+00 -1.4700e+03 1.1143e+03 4.3024e+00 -1.4700e+03 1.1429e+03 4.3801e+00 -1.4700e+03 1.1714e+03 4.4569e+00 -1.4700e+03 1.2000e+03 4.5327e+00 -1.4700e+03 1.2286e+03 4.6076e+00 -1.4700e+03 1.2571e+03 4.6814e+00 -1.4700e+03 1.2857e+03 4.7542e+00 -1.4700e+03 1.3143e+03 4.8260e+00 -1.4700e+03 1.3429e+03 4.8966e+00 -1.4700e+03 1.3714e+03 4.9661e+00 -1.4700e+03 1.4000e+03 5.0345e+00 -1.4700e+03 1.4286e+03 5.1018e+00 -1.4700e+03 1.4571e+03 5.1680e+00 -1.4700e+03 1.4857e+03 5.2330e+00 -1.4700e+03 1.5143e+03 5.2970e+00 -1.4700e+03 1.5429e+03 5.3598e+00 -1.4700e+03 1.5714e+03 5.4215e+00 -1.4700e+03 1.6000e+03 5.4820e+00 -1.4700e+03 1.6286e+03 5.5415e+00 -1.4700e+03 1.6571e+03 5.5999e+00 -1.4700e+03 1.6857e+03 5.6572e+00 -1.4700e+03 1.7143e+03 5.7135e+00 -1.4700e+03 1.7429e+03 5.7687e+00 -1.4700e+03 1.7714e+03 5.8228e+00 -1.4700e+03 1.8000e+03 5.8760e+00 -1.4700e+03 1.8286e+03 5.9281e+00 -1.4700e+03 1.8571e+03 5.9792e+00 -1.4700e+03 1.8857e+03 6.0294e+00 -1.4700e+03 1.9143e+03 6.0786e+00 -1.4700e+03 1.9429e+03 6.1269e+00 -1.4700e+03 1.9714e+03 6.1743e+00 -1.4700e+03 2.0000e+03 6.2207e+00 -1.5000e+03 -2.0000e+03 6.2561e+00 -1.5000e+03 -1.9714e+03 6.2109e+00 -1.5000e+03 -1.9429e+03 6.1648e+00 -1.5000e+03 -1.9143e+03 6.1178e+00 -1.5000e+03 -1.8857e+03 6.0699e+00 -1.5000e+03 -1.8571e+03 6.0212e+00 -1.5000e+03 -1.8286e+03 5.9715e+00 -1.5000e+03 -1.8000e+03 5.9209e+00 -1.5000e+03 -1.7714e+03 5.8693e+00 -1.5000e+03 -1.7429e+03 5.8168e+00 -1.5000e+03 -1.7143e+03 5.7633e+00 -1.5000e+03 -1.6857e+03 5.7089e+00 -1.5000e+03 -1.6571e+03 5.6534e+00 -1.5000e+03 -1.6286e+03 5.5970e+00 -1.5000e+03 -1.6000e+03 5.5395e+00 -1.5000e+03 -1.5714e+03 5.4810e+00 -1.5000e+03 -1.5429e+03 5.4215e+00 -1.5000e+03 -1.5143e+03 5.3610e+00 -1.5000e+03 -1.4857e+03 5.2994e+00 -1.5000e+03 -1.4571e+03 5.2369e+00 -1.5000e+03 -1.4286e+03 5.1732e+00 -1.5000e+03 -1.4000e+03 5.1086e+00 -1.5000e+03 -1.3714e+03 5.0429e+00 -1.5000e+03 -1.3429e+03 4.9763e+00 -1.5000e+03 -1.3143e+03 4.9086e+00 -1.5000e+03 -1.2857e+03 4.8400e+00 -1.5000e+03 -1.2571e+03 4.7704e+00 -1.5000e+03 -1.2286e+03 4.6998e+00 -1.5000e+03 -1.2000e+03 4.6284e+00 -1.5000e+03 -1.1714e+03 4.5561e+00 -1.5000e+03 -1.1429e+03 4.4829e+00 -1.5000e+03 -1.1143e+03 4.4090e+00 -1.5000e+03 -1.0857e+03 4.3343e+00 -1.5000e+03 -1.0571e+03 4.2590e+00 -1.5000e+03 -1.0286e+03 4.1830e+00 -1.5000e+03 -1.0000e+03 4.1065e+00 -1.5000e+03 -9.7143e+02 4.0296e+00 -1.5000e+03 -9.4286e+02 3.9522e+00 -1.5000e+03 -9.1429e+02 3.8745e+00 -1.5000e+03 -8.8571e+02 3.7967e+00 -1.5000e+03 -8.5714e+02 3.7188e+00 -1.5000e+03 -8.2857e+02 3.6409e+00 -1.5000e+03 -8.0000e+02 3.5632e+00 -1.5000e+03 -7.7143e+02 3.4858e+00 -1.5000e+03 -7.4286e+02 3.4088e+00 -1.5000e+03 -7.1429e+02 3.3324e+00 -1.5000e+03 -6.8571e+02 3.2568e+00 -1.5000e+03 -6.5714e+02 3.1821e+00 -1.5000e+03 -6.2857e+02 3.1086e+00 -1.5000e+03 -6.0000e+02 3.0363e+00 -1.5000e+03 -5.7143e+02 2.9655e+00 -1.5000e+03 -5.4286e+02 2.8963e+00 -1.5000e+03 -5.1429e+02 2.8291e+00 -1.5000e+03 -4.8571e+02 2.7639e+00 -1.5000e+03 -4.5714e+02 2.7010e+00 -1.5000e+03 -4.2857e+02 2.6406e+00 -1.5000e+03 -4.0000e+02 2.5829e+00 -1.5000e+03 -3.7143e+02 2.5281e+00 -1.5000e+03 -3.4286e+02 2.4764e+00 -1.5000e+03 -3.1429e+02 2.4280e+00 -1.5000e+03 -2.8571e+02 2.3832e+00 -1.5000e+03 -2.5714e+02 2.3419e+00 -1.5000e+03 -2.2857e+02 2.3046e+00 -1.5000e+03 -2.0000e+02 2.2712e+00 -1.5000e+03 -1.7143e+02 2.2420e+00 -1.5000e+03 -1.4286e+02 2.2170e+00 -1.5000e+03 -1.1429e+02 2.1965e+00 -1.5000e+03 -8.5714e+01 2.1804e+00 -1.5000e+03 -5.7143e+01 2.1688e+00 -1.5000e+03 -2.8571e+01 2.1619e+00 -1.5000e+03 0.0000e+00 2.1595e+00 -1.5000e+03 2.8571e+01 2.1619e+00 -1.5000e+03 5.7143e+01 2.1688e+00 -1.5000e+03 8.5714e+01 2.1804e+00 -1.5000e+03 1.1429e+02 2.1965e+00 -1.5000e+03 1.4286e+02 2.2170e+00 -1.5000e+03 1.7143e+02 2.2420e+00 -1.5000e+03 2.0000e+02 2.2712e+00 -1.5000e+03 2.2857e+02 2.3046e+00 -1.5000e+03 2.5714e+02 2.3419e+00 -1.5000e+03 2.8571e+02 2.3832e+00 -1.5000e+03 3.1429e+02 2.4280e+00 -1.5000e+03 3.4286e+02 2.4764e+00 -1.5000e+03 3.7143e+02 2.5281e+00 -1.5000e+03 4.0000e+02 2.5829e+00 -1.5000e+03 4.2857e+02 2.6406e+00 -1.5000e+03 4.5714e+02 2.7010e+00 -1.5000e+03 4.8571e+02 2.7639e+00 -1.5000e+03 5.1429e+02 2.8291e+00 -1.5000e+03 5.4286e+02 2.8963e+00 -1.5000e+03 5.7143e+02 2.9655e+00 -1.5000e+03 6.0000e+02 3.0363e+00 -1.5000e+03 6.2857e+02 3.1086e+00 -1.5000e+03 6.5714e+02 3.1821e+00 -1.5000e+03 6.8571e+02 3.2568e+00 -1.5000e+03 7.1429e+02 3.3324e+00 -1.5000e+03 7.4286e+02 3.4088e+00 -1.5000e+03 7.7143e+02 3.4858e+00 -1.5000e+03 8.0000e+02 3.5632e+00 -1.5000e+03 8.2857e+02 3.6409e+00 -1.5000e+03 8.5714e+02 3.7188e+00 -1.5000e+03 8.8571e+02 3.7967e+00 -1.5000e+03 9.1429e+02 3.8745e+00 -1.5000e+03 9.4286e+02 3.9522e+00 -1.5000e+03 9.7143e+02 4.0296e+00 -1.5000e+03 1.0000e+03 4.1065e+00 -1.5000e+03 1.0286e+03 4.1830e+00 -1.5000e+03 1.0571e+03 4.2590e+00 -1.5000e+03 1.0857e+03 4.3343e+00 -1.5000e+03 1.1143e+03 4.4090e+00 -1.5000e+03 1.1429e+03 4.4829e+00 -1.5000e+03 1.1714e+03 4.5561e+00 -1.5000e+03 1.2000e+03 4.6284e+00 -1.5000e+03 1.2286e+03 4.6998e+00 -1.5000e+03 1.2571e+03 4.7704e+00 -1.5000e+03 1.2857e+03 4.8400e+00 -1.5000e+03 1.3143e+03 4.9086e+00 -1.5000e+03 1.3429e+03 4.9763e+00 -1.5000e+03 1.3714e+03 5.0429e+00 -1.5000e+03 1.4000e+03 5.1086e+00 -1.5000e+03 1.4286e+03 5.1732e+00 -1.5000e+03 1.4571e+03 5.2369e+00 -1.5000e+03 1.4857e+03 5.2994e+00 -1.5000e+03 1.5143e+03 5.3610e+00 -1.5000e+03 1.5429e+03 5.4215e+00 -1.5000e+03 1.5714e+03 5.4810e+00 -1.5000e+03 1.6000e+03 5.5395e+00 -1.5000e+03 1.6286e+03 5.5970e+00 -1.5000e+03 1.6571e+03 5.6534e+00 -1.5000e+03 1.6857e+03 5.7089e+00 -1.5000e+03 1.7143e+03 5.7633e+00 -1.5000e+03 1.7429e+03 5.8168e+00 -1.5000e+03 1.7714e+03 5.8693e+00 -1.5000e+03 1.8000e+03 5.9209e+00 -1.5000e+03 1.8286e+03 5.9715e+00 -1.5000e+03 1.8571e+03 6.0212e+00 -1.5000e+03 1.8857e+03 6.0699e+00 -1.5000e+03 1.9143e+03 6.1178e+00 -1.5000e+03 1.9429e+03 6.1648e+00 -1.5000e+03 1.9714e+03 6.2109e+00 -1.5000e+03 2.0000e+03 6.2561e+00 -1.5300e+03 -2.0000e+03 6.2913e+00 -1.5300e+03 -1.9714e+03 6.2472e+00 -1.5300e+03 -1.9429e+03 6.2024e+00 -1.5300e+03 -1.9143e+03 6.1567e+00 -1.5300e+03 -1.8857e+03 6.1101e+00 -1.5300e+03 -1.8571e+03 6.0627e+00 -1.5300e+03 -1.8286e+03 6.0145e+00 -1.5300e+03 -1.8000e+03 5.9653e+00 -1.5300e+03 -1.7714e+03 5.9153e+00 -1.5300e+03 -1.7429e+03 5.8644e+00 -1.5300e+03 -1.7143e+03 5.8126e+00 -1.5300e+03 -1.6857e+03 5.7599e+00 -1.5300e+03 -1.6571e+03 5.7062e+00 -1.5300e+03 -1.6286e+03 5.6517e+00 -1.5300e+03 -1.6000e+03 5.5962e+00 -1.5300e+03 -1.5714e+03 5.5397e+00 -1.5300e+03 -1.5429e+03 5.4823e+00 -1.5300e+03 -1.5143e+03 5.4240e+00 -1.5300e+03 -1.4857e+03 5.3647e+00 -1.5300e+03 -1.4571e+03 5.3044e+00 -1.5300e+03 -1.4286e+03 5.2432e+00 -1.5300e+03 -1.4000e+03 5.1811e+00 -1.5300e+03 -1.3714e+03 5.1181e+00 -1.5300e+03 -1.3429e+03 5.0542e+00 -1.5300e+03 -1.3143e+03 4.9893e+00 -1.5300e+03 -1.2857e+03 4.9236e+00 -1.5300e+03 -1.2571e+03 4.8570e+00 -1.5300e+03 -1.2286e+03 4.7896e+00 -1.5300e+03 -1.2000e+03 4.7215e+00 -1.5300e+03 -1.1714e+03 4.6525e+00 -1.5300e+03 -1.1429e+03 4.5828e+00 -1.5300e+03 -1.1143e+03 4.5125e+00 -1.5300e+03 -1.0857e+03 4.4415e+00 -1.5300e+03 -1.0571e+03 4.3699e+00 -1.5300e+03 -1.0286e+03 4.2979e+00 -1.5300e+03 -1.0000e+03 4.2254e+00 -1.5300e+03 -9.7143e+02 4.1525e+00 -1.5300e+03 -9.4286e+02 4.0793e+00 -1.5300e+03 -9.1429e+02 4.0060e+00 -1.5300e+03 -8.8571e+02 3.9326e+00 -1.5300e+03 -8.5714e+02 3.8591e+00 -1.5300e+03 -8.2857e+02 3.7858e+00 -1.5300e+03 -8.0000e+02 3.7127e+00 -1.5300e+03 -7.7143e+02 3.6400e+00 -1.5300e+03 -7.4286e+02 3.5678e+00 -1.5300e+03 -7.1429e+02 3.4963e+00 -1.5300e+03 -6.8571e+02 3.4255e+00 -1.5300e+03 -6.5714e+02 3.3557e+00 -1.5300e+03 -6.2857e+02 3.2870e+00 -1.5300e+03 -6.0000e+02 3.2195e+00 -1.5300e+03 -5.7143e+02 3.1535e+00 -1.5300e+03 -5.4286e+02 3.0892e+00 -1.5300e+03 -5.1429e+02 3.0266e+00 -1.5300e+03 -4.8571e+02 2.9661e+00 -1.5300e+03 -4.5714e+02 2.9077e+00 -1.5300e+03 -4.2857e+02 2.8517e+00 -1.5300e+03 -4.0000e+02 2.7983e+00 -1.5300e+03 -3.7143e+02 2.7475e+00 -1.5300e+03 -3.4286e+02 2.6997e+00 -1.5300e+03 -3.1429e+02 2.6550e+00 -1.5300e+03 -2.8571e+02 2.6136e+00 -1.5300e+03 -2.5714e+02 2.5756e+00 -1.5300e+03 -2.2857e+02 2.5411e+00 -1.5300e+03 -2.0000e+02 2.5103e+00 -1.5300e+03 -1.7143e+02 2.4834e+00 -1.5300e+03 -1.4286e+02 2.4604e+00 -1.5300e+03 -1.1429e+02 2.4415e+00 -1.5300e+03 -8.5714e+01 2.4267e+00 -1.5300e+03 -5.7143e+01 2.4160e+00 -1.5300e+03 -2.8571e+01 2.4096e+00 -1.5300e+03 0.0000e+00 2.4075e+00 -1.5300e+03 2.8571e+01 2.4096e+00 -1.5300e+03 5.7143e+01 2.4160e+00 -1.5300e+03 8.5714e+01 2.4267e+00 -1.5300e+03 1.1429e+02 2.4415e+00 -1.5300e+03 1.4286e+02 2.4604e+00 -1.5300e+03 1.7143e+02 2.4834e+00 -1.5300e+03 2.0000e+02 2.5103e+00 -1.5300e+03 2.2857e+02 2.5411e+00 -1.5300e+03 2.5714e+02 2.5756e+00 -1.5300e+03 2.8571e+02 2.6136e+00 -1.5300e+03 3.1429e+02 2.6550e+00 -1.5300e+03 3.4286e+02 2.6997e+00 -1.5300e+03 3.7143e+02 2.7475e+00 -1.5300e+03 4.0000e+02 2.7983e+00 -1.5300e+03 4.2857e+02 2.8517e+00 -1.5300e+03 4.5714e+02 2.9077e+00 -1.5300e+03 4.8571e+02 2.9661e+00 -1.5300e+03 5.1429e+02 3.0266e+00 -1.5300e+03 5.4286e+02 3.0892e+00 -1.5300e+03 5.7143e+02 3.1535e+00 -1.5300e+03 6.0000e+02 3.2195e+00 -1.5300e+03 6.2857e+02 3.2870e+00 -1.5300e+03 6.5714e+02 3.3557e+00 -1.5300e+03 6.8571e+02 3.4255e+00 -1.5300e+03 7.1429e+02 3.4963e+00 -1.5300e+03 7.4286e+02 3.5678e+00 -1.5300e+03 7.7143e+02 3.6400e+00 -1.5300e+03 8.0000e+02 3.7127e+00 -1.5300e+03 8.2857e+02 3.7858e+00 -1.5300e+03 8.5714e+02 3.8591e+00 -1.5300e+03 8.8571e+02 3.9326e+00 -1.5300e+03 9.1429e+02 4.0060e+00 -1.5300e+03 9.4286e+02 4.0793e+00 -1.5300e+03 9.7143e+02 4.1525e+00 -1.5300e+03 1.0000e+03 4.2254e+00 -1.5300e+03 1.0286e+03 4.2979e+00 -1.5300e+03 1.0571e+03 4.3699e+00 -1.5300e+03 1.0857e+03 4.4415e+00 -1.5300e+03 1.1143e+03 4.5125e+00 -1.5300e+03 1.1429e+03 4.5828e+00 -1.5300e+03 1.1714e+03 4.6525e+00 -1.5300e+03 1.2000e+03 4.7215e+00 -1.5300e+03 1.2286e+03 4.7896e+00 -1.5300e+03 1.2571e+03 4.8570e+00 -1.5300e+03 1.2857e+03 4.9236e+00 -1.5300e+03 1.3143e+03 4.9893e+00 -1.5300e+03 1.3429e+03 5.0542e+00 -1.5300e+03 1.3714e+03 5.1181e+00 -1.5300e+03 1.4000e+03 5.1811e+00 -1.5300e+03 1.4286e+03 5.2432e+00 -1.5300e+03 1.4571e+03 5.3044e+00 -1.5300e+03 1.4857e+03 5.3647e+00 -1.5300e+03 1.5143e+03 5.4240e+00 -1.5300e+03 1.5429e+03 5.4823e+00 -1.5300e+03 1.5714e+03 5.5397e+00 -1.5300e+03 1.6000e+03 5.5962e+00 -1.5300e+03 1.6286e+03 5.6517e+00 -1.5300e+03 1.6571e+03 5.7062e+00 -1.5300e+03 1.6857e+03 5.7599e+00 -1.5300e+03 1.7143e+03 5.8126e+00 -1.5300e+03 1.7429e+03 5.8644e+00 -1.5300e+03 1.7714e+03 5.9153e+00 -1.5300e+03 1.8000e+03 5.9653e+00 -1.5300e+03 1.8286e+03 6.0145e+00 -1.5300e+03 1.8571e+03 6.0627e+00 -1.5300e+03 1.8857e+03 6.1101e+00 -1.5300e+03 1.9143e+03 6.1567e+00 -1.5300e+03 1.9429e+03 6.2024e+00 -1.5300e+03 1.9714e+03 6.2472e+00 -1.5300e+03 2.0000e+03 6.2913e+00 -1.5600e+03 -2.0000e+03 6.3263e+00 -1.5600e+03 -1.9714e+03 6.2834e+00 -1.5600e+03 -1.9429e+03 6.2397e+00 -1.5600e+03 -1.9143e+03 6.1952e+00 -1.5600e+03 -1.8857e+03 6.1499e+00 -1.5600e+03 -1.8571e+03 6.1039e+00 -1.5600e+03 -1.8286e+03 6.0570e+00 -1.5600e+03 -1.8000e+03 6.0093e+00 -1.5600e+03 -1.7714e+03 5.9608e+00 -1.5600e+03 -1.7429e+03 5.9115e+00 -1.5600e+03 -1.7143e+03 5.8613e+00 -1.5600e+03 -1.6857e+03 5.8102e+00 -1.5600e+03 -1.6571e+03 5.7583e+00 -1.5600e+03 -1.6286e+03 5.7056e+00 -1.5600e+03 -1.6000e+03 5.6519e+00 -1.5600e+03 -1.5714e+03 5.5974e+00 -1.5600e+03 -1.5429e+03 5.5421e+00 -1.5600e+03 -1.5143e+03 5.4858e+00 -1.5600e+03 -1.4857e+03 5.4287e+00 -1.5600e+03 -1.4571e+03 5.3707e+00 -1.5600e+03 -1.4286e+03 5.3119e+00 -1.5600e+03 -1.4000e+03 5.2522e+00 -1.5600e+03 -1.3714e+03 5.1917e+00 -1.5600e+03 -1.3429e+03 5.1303e+00 -1.5600e+03 -1.3143e+03 5.0682e+00 -1.5600e+03 -1.2857e+03 5.0053e+00 -1.5600e+03 -1.2571e+03 4.9416e+00 -1.5600e+03 -1.2286e+03 4.8772e+00 -1.5600e+03 -1.2000e+03 4.8120e+00 -1.5600e+03 -1.1714e+03 4.7462e+00 -1.5600e+03 -1.1429e+03 4.6798e+00 -1.5600e+03 -1.1143e+03 4.6128e+00 -1.5600e+03 -1.0857e+03 4.5453e+00 -1.5600e+03 -1.0571e+03 4.4773e+00 -1.5600e+03 -1.0286e+03 4.4089e+00 -1.5600e+03 -1.0000e+03 4.3402e+00 -1.5600e+03 -9.7143e+02 4.2711e+00 -1.5600e+03 -9.4286e+02 4.2019e+00 -1.5600e+03 -9.1429e+02 4.1326e+00 -1.5600e+03 -8.8571e+02 4.0632e+00 -1.5600e+03 -8.5714e+02 3.9940e+00 -1.5600e+03 -8.2857e+02 3.9249e+00 -1.5600e+03 -8.0000e+02 3.8561e+00 -1.5600e+03 -7.7143e+02 3.7878e+00 -1.5600e+03 -7.4286e+02 3.7200e+00 -1.5600e+03 -7.1429e+02 3.6528e+00 -1.5600e+03 -6.8571e+02 3.5865e+00 -1.5600e+03 -6.5714e+02 3.5211e+00 -1.5600e+03 -6.2857e+02 3.4569e+00 -1.5600e+03 -6.0000e+02 3.3939e+00 -1.5600e+03 -5.7143e+02 3.3323e+00 -1.5600e+03 -5.4286e+02 3.2723e+00 -1.5600e+03 -5.1429e+02 3.2140e+00 -1.5600e+03 -4.8571e+02 3.1577e+00 -1.5600e+03 -4.5714e+02 3.1034e+00 -1.5600e+03 -4.2857e+02 3.0514e+00 -1.5600e+03 -4.0000e+02 3.0018e+00 -1.5600e+03 -3.7143e+02 2.9548e+00 -1.5600e+03 -3.4286e+02 2.9105e+00 -1.5600e+03 -3.1429e+02 2.8691e+00 -1.5600e+03 -2.8571e+02 2.8307e+00 -1.5600e+03 -2.5714e+02 2.7956e+00 -1.5600e+03 -2.2857e+02 2.7637e+00 -1.5600e+03 -2.0000e+02 2.7353e+00 -1.5600e+03 -1.7143e+02 2.7104e+00 -1.5600e+03 -1.4286e+02 2.6892e+00 -1.5600e+03 -1.1429e+02 2.6718e+00 -1.5600e+03 -8.5714e+01 2.6581e+00 -1.5600e+03 -5.7143e+01 2.6483e+00 -1.5600e+03 -2.8571e+01 2.6424e+00 -1.5600e+03 0.0000e+00 2.6404e+00 -1.5600e+03 2.8571e+01 2.6424e+00 -1.5600e+03 5.7143e+01 2.6483e+00 -1.5600e+03 8.5714e+01 2.6581e+00 -1.5600e+03 1.1429e+02 2.6718e+00 -1.5600e+03 1.4286e+02 2.6892e+00 -1.5600e+03 1.7143e+02 2.7104e+00 -1.5600e+03 2.0000e+02 2.7353e+00 -1.5600e+03 2.2857e+02 2.7637e+00 -1.5600e+03 2.5714e+02 2.7956e+00 -1.5600e+03 2.8571e+02 2.8307e+00 -1.5600e+03 3.1429e+02 2.8691e+00 -1.5600e+03 3.4286e+02 2.9105e+00 -1.5600e+03 3.7143e+02 2.9548e+00 -1.5600e+03 4.0000e+02 3.0018e+00 -1.5600e+03 4.2857e+02 3.0514e+00 -1.5600e+03 4.5714e+02 3.1034e+00 -1.5600e+03 4.8571e+02 3.1577e+00 -1.5600e+03 5.1429e+02 3.2140e+00 -1.5600e+03 5.4286e+02 3.2723e+00 -1.5600e+03 5.7143e+02 3.3323e+00 -1.5600e+03 6.0000e+02 3.3939e+00 -1.5600e+03 6.2857e+02 3.4569e+00 -1.5600e+03 6.5714e+02 3.5211e+00 -1.5600e+03 6.8571e+02 3.5865e+00 -1.5600e+03 7.1429e+02 3.6528e+00 -1.5600e+03 7.4286e+02 3.7200e+00 -1.5600e+03 7.7143e+02 3.7878e+00 -1.5600e+03 8.0000e+02 3.8561e+00 -1.5600e+03 8.2857e+02 3.9249e+00 -1.5600e+03 8.5714e+02 3.9940e+00 -1.5600e+03 8.8571e+02 4.0632e+00 -1.5600e+03 9.1429e+02 4.1326e+00 -1.5600e+03 9.4286e+02 4.2019e+00 -1.5600e+03 9.7143e+02 4.2711e+00 -1.5600e+03 1.0000e+03 4.3402e+00 -1.5600e+03 1.0286e+03 4.4089e+00 -1.5600e+03 1.0571e+03 4.4773e+00 -1.5600e+03 1.0857e+03 4.5453e+00 -1.5600e+03 1.1143e+03 4.6128e+00 -1.5600e+03 1.1429e+03 4.6798e+00 -1.5600e+03 1.1714e+03 4.7462e+00 -1.5600e+03 1.2000e+03 4.8120e+00 -1.5600e+03 1.2286e+03 4.8772e+00 -1.5600e+03 1.2571e+03 4.9416e+00 -1.5600e+03 1.2857e+03 5.0053e+00 -1.5600e+03 1.3143e+03 5.0682e+00 -1.5600e+03 1.3429e+03 5.1303e+00 -1.5600e+03 1.3714e+03 5.1917e+00 -1.5600e+03 1.4000e+03 5.2522e+00 -1.5600e+03 1.4286e+03 5.3119e+00 -1.5600e+03 1.4571e+03 5.3707e+00 -1.5600e+03 1.4857e+03 5.4287e+00 -1.5600e+03 1.5143e+03 5.4858e+00 -1.5600e+03 1.5429e+03 5.5421e+00 -1.5600e+03 1.5714e+03 5.5974e+00 -1.5600e+03 1.6000e+03 5.6519e+00 -1.5600e+03 1.6286e+03 5.7056e+00 -1.5600e+03 1.6571e+03 5.7583e+00 -1.5600e+03 1.6857e+03 5.8102e+00 -1.5600e+03 1.7143e+03 5.8613e+00 -1.5600e+03 1.7429e+03 5.9115e+00 -1.5600e+03 1.7714e+03 5.9608e+00 -1.5600e+03 1.8000e+03 6.0093e+00 -1.5600e+03 1.8286e+03 6.0570e+00 -1.5600e+03 1.8571e+03 6.1039e+00 -1.5600e+03 1.8857e+03 6.1499e+00 -1.5600e+03 1.9143e+03 6.1952e+00 -1.5600e+03 1.9429e+03 6.2397e+00 -1.5600e+03 1.9714e+03 6.2834e+00 -1.5600e+03 2.0000e+03 6.3263e+00 -1.5900e+03 -2.0000e+03 6.3610e+00 -1.5900e+03 -1.9714e+03 6.3192e+00 -1.5900e+03 -1.9429e+03 6.2767e+00 -1.5900e+03 -1.9143e+03 6.2334e+00 -1.5900e+03 -1.8857e+03 6.1894e+00 -1.5900e+03 -1.8571e+03 6.1447e+00 -1.5900e+03 -1.8286e+03 6.0992e+00 -1.5900e+03 -1.8000e+03 6.0529e+00 -1.5900e+03 -1.7714e+03 6.0058e+00 -1.5900e+03 -1.7429e+03 5.9580e+00 -1.5900e+03 -1.7143e+03 5.9093e+00 -1.5900e+03 -1.6857e+03 5.8599e+00 -1.5900e+03 -1.6571e+03 5.8097e+00 -1.5900e+03 -1.6286e+03 5.7587e+00 -1.5900e+03 -1.6000e+03 5.7069e+00 -1.5900e+03 -1.5714e+03 5.6542e+00 -1.5900e+03 -1.5429e+03 5.6008e+00 -1.5900e+03 -1.5143e+03 5.5466e+00 -1.5900e+03 -1.4857e+03 5.4916e+00 -1.5900e+03 -1.4571e+03 5.4357e+00 -1.5900e+03 -1.4286e+03 5.3791e+00 -1.5900e+03 -1.4000e+03 5.3218e+00 -1.5900e+03 -1.3714e+03 5.2637e+00 -1.5900e+03 -1.3429e+03 5.2048e+00 -1.5900e+03 -1.3143e+03 5.1452e+00 -1.5900e+03 -1.2857e+03 5.0850e+00 -1.5900e+03 -1.2571e+03 5.0240e+00 -1.5900e+03 -1.2286e+03 4.9624e+00 -1.5900e+03 -1.2000e+03 4.9002e+00 -1.5900e+03 -1.1714e+03 4.8374e+00 -1.5900e+03 -1.1429e+03 4.7741e+00 -1.5900e+03 -1.1143e+03 4.7103e+00 -1.5900e+03 -1.0857e+03 4.6460e+00 -1.5900e+03 -1.0571e+03 4.5813e+00 -1.5900e+03 -1.0286e+03 4.5164e+00 -1.5900e+03 -1.0000e+03 4.4511e+00 -1.5900e+03 -9.7143e+02 4.3857e+00 -1.5900e+03 -9.4286e+02 4.3201e+00 -1.5900e+03 -9.1429e+02 4.2546e+00 -1.5900e+03 -8.8571e+02 4.1890e+00 -1.5900e+03 -8.5714e+02 4.1236e+00 -1.5900e+03 -8.2857e+02 4.0585e+00 -1.5900e+03 -8.0000e+02 3.9937e+00 -1.5900e+03 -7.7143e+02 3.9294e+00 -1.5900e+03 -7.4286e+02 3.8656e+00 -1.5900e+03 -7.1429e+02 3.8026e+00 -1.5900e+03 -6.8571e+02 3.7403e+00 -1.5900e+03 -6.5714e+02 3.6791e+00 -1.5900e+03 -6.2857e+02 3.6189e+00 -1.5900e+03 -6.0000e+02 3.5600e+00 -1.5900e+03 -5.7143e+02 3.5024e+00 -1.5900e+03 -5.4286e+02 3.4464e+00 -1.5900e+03 -5.1429e+02 3.3920e+00 -1.5900e+03 -4.8571e+02 3.3395e+00 -1.5900e+03 -4.5714e+02 3.2890e+00 -1.5900e+03 -4.2857e+02 3.2406e+00 -1.5900e+03 -4.0000e+02 3.1945e+00 -1.5900e+03 -3.7143e+02 3.1508e+00 -1.5900e+03 -3.4286e+02 3.1097e+00 -1.5900e+03 -3.1429e+02 3.0713e+00 -1.5900e+03 -2.8571e+02 3.0357e+00 -1.5900e+03 -2.5714e+02 3.0031e+00 -1.5900e+03 -2.2857e+02 2.9736e+00 -1.5900e+03 -2.0000e+02 2.9473e+00 -1.5900e+03 -1.7143e+02 2.9243e+00 -1.5900e+03 -1.4286e+02 2.9047e+00 -1.5900e+03 -1.1429e+02 2.8885e+00 -1.5900e+03 -8.5714e+01 2.8759e+00 -1.5900e+03 -5.7143e+01 2.8668e+00 -1.5900e+03 -2.8571e+01 2.8614e+00 -1.5900e+03 0.0000e+00 2.8596e+00 -1.5900e+03 2.8571e+01 2.8614e+00 -1.5900e+03 5.7143e+01 2.8668e+00 -1.5900e+03 8.5714e+01 2.8759e+00 -1.5900e+03 1.1429e+02 2.8885e+00 -1.5900e+03 1.4286e+02 2.9047e+00 -1.5900e+03 1.7143e+02 2.9243e+00 -1.5900e+03 2.0000e+02 2.9473e+00 -1.5900e+03 2.2857e+02 2.9736e+00 -1.5900e+03 2.5714e+02 3.0031e+00 -1.5900e+03 2.8571e+02 3.0357e+00 -1.5900e+03 3.1429e+02 3.0713e+00 -1.5900e+03 3.4286e+02 3.1097e+00 -1.5900e+03 3.7143e+02 3.1508e+00 -1.5900e+03 4.0000e+02 3.1945e+00 -1.5900e+03 4.2857e+02 3.2406e+00 -1.5900e+03 4.5714e+02 3.2890e+00 -1.5900e+03 4.8571e+02 3.3395e+00 -1.5900e+03 5.1429e+02 3.3920e+00 -1.5900e+03 5.4286e+02 3.4464e+00 -1.5900e+03 5.7143e+02 3.5024e+00 -1.5900e+03 6.0000e+02 3.5600e+00 -1.5900e+03 6.2857e+02 3.6189e+00 -1.5900e+03 6.5714e+02 3.6791e+00 -1.5900e+03 6.8571e+02 3.7403e+00 -1.5900e+03 7.1429e+02 3.8026e+00 -1.5900e+03 7.4286e+02 3.8656e+00 -1.5900e+03 7.7143e+02 3.9294e+00 -1.5900e+03 8.0000e+02 3.9937e+00 -1.5900e+03 8.2857e+02 4.0585e+00 -1.5900e+03 8.5714e+02 4.1236e+00 -1.5900e+03 8.8571e+02 4.1890e+00 -1.5900e+03 9.1429e+02 4.2546e+00 -1.5900e+03 9.4286e+02 4.3201e+00 -1.5900e+03 9.7143e+02 4.3857e+00 -1.5900e+03 1.0000e+03 4.4511e+00 -1.5900e+03 1.0286e+03 4.5164e+00 -1.5900e+03 1.0571e+03 4.5813e+00 -1.5900e+03 1.0857e+03 4.6460e+00 -1.5900e+03 1.1143e+03 4.7103e+00 -1.5900e+03 1.1429e+03 4.7741e+00 -1.5900e+03 1.1714e+03 4.8374e+00 -1.5900e+03 1.2000e+03 4.9002e+00 -1.5900e+03 1.2286e+03 4.9624e+00 -1.5900e+03 1.2571e+03 5.0240e+00 -1.5900e+03 1.2857e+03 5.0850e+00 -1.5900e+03 1.3143e+03 5.1452e+00 -1.5900e+03 1.3429e+03 5.2048e+00 -1.5900e+03 1.3714e+03 5.2637e+00 -1.5900e+03 1.4000e+03 5.3218e+00 -1.5900e+03 1.4286e+03 5.3791e+00 -1.5900e+03 1.4571e+03 5.4357e+00 -1.5900e+03 1.4857e+03 5.4916e+00 -1.5900e+03 1.5143e+03 5.5466e+00 -1.5900e+03 1.5429e+03 5.6008e+00 -1.5900e+03 1.5714e+03 5.6542e+00 -1.5900e+03 1.6000e+03 5.7069e+00 -1.5900e+03 1.6286e+03 5.7587e+00 -1.5900e+03 1.6571e+03 5.8097e+00 -1.5900e+03 1.6857e+03 5.8599e+00 -1.5900e+03 1.7143e+03 5.9093e+00 -1.5900e+03 1.7429e+03 5.9580e+00 -1.5900e+03 1.7714e+03 6.0058e+00 -1.5900e+03 1.8000e+03 6.0529e+00 -1.5900e+03 1.8286e+03 6.0992e+00 -1.5900e+03 1.8571e+03 6.1447e+00 -1.5900e+03 1.8857e+03 6.1894e+00 -1.5900e+03 1.9143e+03 6.2334e+00 -1.5900e+03 1.9429e+03 6.2767e+00 -1.5900e+03 1.9714e+03 6.3192e+00 -1.5900e+03 2.0000e+03 6.3610e+00 -1.6200e+03 -2.0000e+03 6.3955e+00 -1.6200e+03 -1.9714e+03 6.3548e+00 -1.6200e+03 -1.9429e+03 6.3134e+00 -1.6200e+03 -1.9143e+03 6.2713e+00 -1.6200e+03 -1.8857e+03 6.2285e+00 -1.6200e+03 -1.8571e+03 6.1850e+00 -1.6200e+03 -1.8286e+03 6.1408e+00 -1.6200e+03 -1.8000e+03 6.0959e+00 -1.6200e+03 -1.7714e+03 6.0503e+00 -1.6200e+03 -1.7429e+03 6.0039e+00 -1.6200e+03 -1.7143e+03 5.9568e+00 -1.6200e+03 -1.6857e+03 5.9089e+00 -1.6200e+03 -1.6571e+03 5.8603e+00 -1.6200e+03 -1.6286e+03 5.8110e+00 -1.6200e+03 -1.6000e+03 5.7609e+00 -1.6200e+03 -1.5714e+03 5.7101e+00 -1.6200e+03 -1.5429e+03 5.6586e+00 -1.6200e+03 -1.5143e+03 5.6063e+00 -1.6200e+03 -1.4857e+03 5.5532e+00 -1.6200e+03 -1.4571e+03 5.4995e+00 -1.6200e+03 -1.4286e+03 5.4451e+00 -1.6200e+03 -1.4000e+03 5.3899e+00 -1.6200e+03 -1.3714e+03 5.3341e+00 -1.6200e+03 -1.3429e+03 5.2776e+00 -1.6200e+03 -1.3143e+03 5.2205e+00 -1.6200e+03 -1.2857e+03 5.1627e+00 -1.6200e+03 -1.2571e+03 5.1044e+00 -1.6200e+03 -1.2286e+03 5.0454e+00 -1.6200e+03 -1.2000e+03 4.9860e+00 -1.6200e+03 -1.1714e+03 4.9260e+00 -1.6200e+03 -1.1429e+03 4.8656e+00 -1.6200e+03 -1.1143e+03 4.8048e+00 -1.6200e+03 -1.0857e+03 4.7436e+00 -1.6200e+03 -1.0571e+03 4.6821e+00 -1.6200e+03 -1.0286e+03 4.6204e+00 -1.6200e+03 -1.0000e+03 4.5584e+00 -1.6200e+03 -9.7143e+02 4.4963e+00 -1.6200e+03 -9.4286e+02 4.4342e+00 -1.6200e+03 -9.1429e+02 4.3721e+00 -1.6200e+03 -8.8571e+02 4.3102e+00 -1.6200e+03 -8.5714e+02 4.2484e+00 -1.6200e+03 -8.2857e+02 4.1869e+00 -1.6200e+03 -8.0000e+02 4.1258e+00 -1.6200e+03 -7.7143e+02 4.0652e+00 -1.6200e+03 -7.4286e+02 4.0052e+00 -1.6200e+03 -7.1429e+02 3.9459e+00 -1.6200e+03 -6.8571e+02 3.8874e+00 -1.6200e+03 -6.5714e+02 3.8299e+00 -1.6200e+03 -6.2857e+02 3.7735e+00 -1.6200e+03 -6.0000e+02 3.7183e+00 -1.6200e+03 -5.7143e+02 3.6645e+00 -1.6200e+03 -5.4286e+02 3.6121e+00 -1.6200e+03 -5.1429e+02 3.5613e+00 -1.6200e+03 -4.8571e+02 3.5123e+00 -1.6200e+03 -4.5714e+02 3.4652e+00 -1.6200e+03 -4.2857e+02 3.4201e+00 -1.6200e+03 -4.0000e+02 3.3771e+00 -1.6200e+03 -3.7143e+02 3.3365e+00 -1.6200e+03 -3.4286e+02 3.2982e+00 -1.6200e+03 -3.1429e+02 3.2625e+00 -1.6200e+03 -2.8571e+02 3.2295e+00 -1.6200e+03 -2.5714e+02 3.1992e+00 -1.6200e+03 -2.2857e+02 3.1719e+00 -1.6200e+03 -2.0000e+02 3.1475e+00 -1.6200e+03 -1.7143e+02 3.1261e+00 -1.6200e+03 -1.4286e+02 3.1080e+00 -1.6200e+03 -1.1429e+02 3.0930e+00 -1.6200e+03 -8.5714e+01 3.0813e+00 -1.6200e+03 -5.7143e+01 3.0729e+00 -1.6200e+03 -2.8571e+01 3.0679e+00 -1.6200e+03 0.0000e+00 3.0662e+00 -1.6200e+03 2.8571e+01 3.0679e+00 -1.6200e+03 5.7143e+01 3.0729e+00 -1.6200e+03 8.5714e+01 3.0813e+00 -1.6200e+03 1.1429e+02 3.0930e+00 -1.6200e+03 1.4286e+02 3.1080e+00 -1.6200e+03 1.7143e+02 3.1261e+00 -1.6200e+03 2.0000e+02 3.1475e+00 -1.6200e+03 2.2857e+02 3.1719e+00 -1.6200e+03 2.5714e+02 3.1992e+00 -1.6200e+03 2.8571e+02 3.2295e+00 -1.6200e+03 3.1429e+02 3.2625e+00 -1.6200e+03 3.4286e+02 3.2982e+00 -1.6200e+03 3.7143e+02 3.3365e+00 -1.6200e+03 4.0000e+02 3.3771e+00 -1.6200e+03 4.2857e+02 3.4201e+00 -1.6200e+03 4.5714e+02 3.4652e+00 -1.6200e+03 4.8571e+02 3.5123e+00 -1.6200e+03 5.1429e+02 3.5613e+00 -1.6200e+03 5.4286e+02 3.6121e+00 -1.6200e+03 5.7143e+02 3.6645e+00 -1.6200e+03 6.0000e+02 3.7183e+00 -1.6200e+03 6.2857e+02 3.7735e+00 -1.6200e+03 6.5714e+02 3.8299e+00 -1.6200e+03 6.8571e+02 3.8874e+00 -1.6200e+03 7.1429e+02 3.9459e+00 -1.6200e+03 7.4286e+02 4.0052e+00 -1.6200e+03 7.7143e+02 4.0652e+00 -1.6200e+03 8.0000e+02 4.1258e+00 -1.6200e+03 8.2857e+02 4.1869e+00 -1.6200e+03 8.5714e+02 4.2484e+00 -1.6200e+03 8.8571e+02 4.3102e+00 -1.6200e+03 9.1429e+02 4.3721e+00 -1.6200e+03 9.4286e+02 4.4342e+00 -1.6200e+03 9.7143e+02 4.4963e+00 -1.6200e+03 1.0000e+03 4.5584e+00 -1.6200e+03 1.0286e+03 4.6204e+00 -1.6200e+03 1.0571e+03 4.6821e+00 -1.6200e+03 1.0857e+03 4.7436e+00 -1.6200e+03 1.1143e+03 4.8048e+00 -1.6200e+03 1.1429e+03 4.8656e+00 -1.6200e+03 1.1714e+03 4.9260e+00 -1.6200e+03 1.2000e+03 4.9860e+00 -1.6200e+03 1.2286e+03 5.0454e+00 -1.6200e+03 1.2571e+03 5.1044e+00 -1.6200e+03 1.2857e+03 5.1627e+00 -1.6200e+03 1.3143e+03 5.2205e+00 -1.6200e+03 1.3429e+03 5.2776e+00 -1.6200e+03 1.3714e+03 5.3341e+00 -1.6200e+03 1.4000e+03 5.3899e+00 -1.6200e+03 1.4286e+03 5.4451e+00 -1.6200e+03 1.4571e+03 5.4995e+00 -1.6200e+03 1.4857e+03 5.5532e+00 -1.6200e+03 1.5143e+03 5.6063e+00 -1.6200e+03 1.5429e+03 5.6586e+00 -1.6200e+03 1.5714e+03 5.7101e+00 -1.6200e+03 1.6000e+03 5.7609e+00 -1.6200e+03 1.6286e+03 5.8110e+00 -1.6200e+03 1.6571e+03 5.8603e+00 -1.6200e+03 1.6857e+03 5.9089e+00 -1.6200e+03 1.7143e+03 5.9568e+00 -1.6200e+03 1.7429e+03 6.0039e+00 -1.6200e+03 1.7714e+03 6.0503e+00 -1.6200e+03 1.8000e+03 6.0959e+00 -1.6200e+03 1.8286e+03 6.1408e+00 -1.6200e+03 1.8571e+03 6.1850e+00 -1.6200e+03 1.8857e+03 6.2285e+00 -1.6200e+03 1.9143e+03 6.2713e+00 -1.6200e+03 1.9429e+03 6.3134e+00 -1.6200e+03 1.9714e+03 6.3548e+00 -1.6200e+03 2.0000e+03 6.3955e+00 -1.6500e+03 -2.0000e+03 6.4297e+00 -1.6500e+03 -1.9714e+03 6.3900e+00 -1.6500e+03 -1.9429e+03 6.3498e+00 -1.6500e+03 -1.9143e+03 6.3088e+00 -1.6500e+03 -1.8857e+03 6.2672e+00 -1.6500e+03 -1.8571e+03 6.2250e+00 -1.6500e+03 -1.8286e+03 6.1821e+00 -1.6500e+03 -1.8000e+03 6.1385e+00 -1.6500e+03 -1.7714e+03 6.0942e+00 -1.6500e+03 -1.7429e+03 6.0492e+00 -1.6500e+03 -1.7143e+03 6.0036e+00 -1.6500e+03 -1.6857e+03 5.9572e+00 -1.6500e+03 -1.6571e+03 5.9102e+00 -1.6500e+03 -1.6286e+03 5.8625e+00 -1.6500e+03 -1.6000e+03 5.8141e+00 -1.6500e+03 -1.5714e+03 5.7651e+00 -1.6500e+03 -1.5429e+03 5.7153e+00 -1.6500e+03 -1.5143e+03 5.6649e+00 -1.6500e+03 -1.4857e+03 5.6138e+00 -1.6500e+03 -1.4571e+03 5.5620e+00 -1.6500e+03 -1.4286e+03 5.5096e+00 -1.6500e+03 -1.4000e+03 5.4566e+00 -1.6500e+03 -1.3714e+03 5.4030e+00 -1.6500e+03 -1.3429e+03 5.3488e+00 -1.6500e+03 -1.3143e+03 5.2940e+00 -1.6500e+03 -1.2857e+03 5.2386e+00 -1.6500e+03 -1.2571e+03 5.1827e+00 -1.6500e+03 -1.2286e+03 5.1263e+00 -1.6500e+03 -1.2000e+03 5.0695e+00 -1.6500e+03 -1.1714e+03 5.0122e+00 -1.6500e+03 -1.1429e+03 4.9546e+00 -1.6500e+03 -1.1143e+03 4.8966e+00 -1.6500e+03 -1.0857e+03 4.8383e+00 -1.6500e+03 -1.0571e+03 4.7797e+00 -1.6500e+03 -1.0286e+03 4.7210e+00 -1.6500e+03 -1.0000e+03 4.6622e+00 -1.6500e+03 -9.7143e+02 4.6032e+00 -1.6500e+03 -9.4286e+02 4.5443e+00 -1.6500e+03 -9.1429e+02 4.4855e+00 -1.6500e+03 -8.8571e+02 4.4268e+00 -1.6500e+03 -8.5714e+02 4.3684e+00 -1.6500e+03 -8.2857e+02 4.3103e+00 -1.6500e+03 -8.0000e+02 4.2527e+00 -1.6500e+03 -7.7143e+02 4.1955e+00 -1.6500e+03 -7.4286e+02 4.1390e+00 -1.6500e+03 -7.1429e+02 4.0832e+00 -1.6500e+03 -6.8571e+02 4.0282e+00 -1.6500e+03 -6.5714e+02 3.9742e+00 -1.6500e+03 -6.2857e+02 3.9212e+00 -1.6500e+03 -6.0000e+02 3.8695e+00 -1.6500e+03 -5.7143e+02 3.8190e+00 -1.6500e+03 -5.4286e+02 3.7699e+00 -1.6500e+03 -5.1429e+02 3.7224e+00 -1.6500e+03 -4.8571e+02 3.6766e+00 -1.6500e+03 -4.5714e+02 3.6326e+00 -1.6500e+03 -4.2857e+02 3.5905e+00 -1.6500e+03 -4.0000e+02 3.5504e+00 -1.6500e+03 -3.7143e+02 3.5125e+00 -1.6500e+03 -3.4286e+02 3.4769e+00 -1.6500e+03 -3.1429e+02 3.4437e+00 -1.6500e+03 -2.8571e+02 3.4130e+00 -1.6500e+03 -2.5714e+02 3.3848e+00 -1.6500e+03 -2.2857e+02 3.3594e+00 -1.6500e+03 -2.0000e+02 3.3367e+00 -1.6500e+03 -1.7143e+02 3.3169e+00 -1.6500e+03 -1.4286e+02 3.3000e+00 -1.6500e+03 -1.1429e+02 3.2861e+00 -1.6500e+03 -8.5714e+01 3.2753e+00 -1.6500e+03 -5.7143e+01 3.2675e+00 -1.6500e+03 -2.8571e+01 3.2628e+00 -1.6500e+03 0.0000e+00 3.2612e+00 -1.6500e+03 2.8571e+01 3.2628e+00 -1.6500e+03 5.7143e+01 3.2675e+00 -1.6500e+03 8.5714e+01 3.2753e+00 -1.6500e+03 1.1429e+02 3.2861e+00 -1.6500e+03 1.4286e+02 3.3000e+00 -1.6500e+03 1.7143e+02 3.3169e+00 -1.6500e+03 2.0000e+02 3.3367e+00 -1.6500e+03 2.2857e+02 3.3594e+00 -1.6500e+03 2.5714e+02 3.3848e+00 -1.6500e+03 2.8571e+02 3.4130e+00 -1.6500e+03 3.1429e+02 3.4437e+00 -1.6500e+03 3.4286e+02 3.4769e+00 -1.6500e+03 3.7143e+02 3.5125e+00 -1.6500e+03 4.0000e+02 3.5504e+00 -1.6500e+03 4.2857e+02 3.5905e+00 -1.6500e+03 4.5714e+02 3.6326e+00 -1.6500e+03 4.8571e+02 3.6766e+00 -1.6500e+03 5.1429e+02 3.7224e+00 -1.6500e+03 5.4286e+02 3.7699e+00 -1.6500e+03 5.7143e+02 3.8190e+00 -1.6500e+03 6.0000e+02 3.8695e+00 -1.6500e+03 6.2857e+02 3.9212e+00 -1.6500e+03 6.5714e+02 3.9742e+00 -1.6500e+03 6.8571e+02 4.0282e+00 -1.6500e+03 7.1429e+02 4.0832e+00 -1.6500e+03 7.4286e+02 4.1390e+00 -1.6500e+03 7.7143e+02 4.1955e+00 -1.6500e+03 8.0000e+02 4.2527e+00 -1.6500e+03 8.2857e+02 4.3103e+00 -1.6500e+03 8.5714e+02 4.3684e+00 -1.6500e+03 8.8571e+02 4.4268e+00 -1.6500e+03 9.1429e+02 4.4855e+00 -1.6500e+03 9.4286e+02 4.5443e+00 -1.6500e+03 9.7143e+02 4.6032e+00 -1.6500e+03 1.0000e+03 4.6622e+00 -1.6500e+03 1.0286e+03 4.7210e+00 -1.6500e+03 1.0571e+03 4.7797e+00 -1.6500e+03 1.0857e+03 4.8383e+00 -1.6500e+03 1.1143e+03 4.8966e+00 -1.6500e+03 1.1429e+03 4.9546e+00 -1.6500e+03 1.1714e+03 5.0122e+00 -1.6500e+03 1.2000e+03 5.0695e+00 -1.6500e+03 1.2286e+03 5.1263e+00 -1.6500e+03 1.2571e+03 5.1827e+00 -1.6500e+03 1.2857e+03 5.2386e+00 -1.6500e+03 1.3143e+03 5.2940e+00 -1.6500e+03 1.3429e+03 5.3488e+00 -1.6500e+03 1.3714e+03 5.4030e+00 -1.6500e+03 1.4000e+03 5.4566e+00 -1.6500e+03 1.4286e+03 5.5096e+00 -1.6500e+03 1.4571e+03 5.5620e+00 -1.6500e+03 1.4857e+03 5.6138e+00 -1.6500e+03 1.5143e+03 5.6649e+00 -1.6500e+03 1.5429e+03 5.7153e+00 -1.6500e+03 1.5714e+03 5.7651e+00 -1.6500e+03 1.6000e+03 5.8141e+00 -1.6500e+03 1.6286e+03 5.8625e+00 -1.6500e+03 1.6571e+03 5.9102e+00 -1.6500e+03 1.6857e+03 5.9572e+00 -1.6500e+03 1.7143e+03 6.0036e+00 -1.6500e+03 1.7429e+03 6.0492e+00 -1.6500e+03 1.7714e+03 6.0942e+00 -1.6500e+03 1.8000e+03 6.1385e+00 -1.6500e+03 1.8286e+03 6.1821e+00 -1.6500e+03 1.8571e+03 6.2250e+00 -1.6500e+03 1.8857e+03 6.2672e+00 -1.6500e+03 1.9143e+03 6.3088e+00 -1.6500e+03 1.9429e+03 6.3498e+00 -1.6500e+03 1.9714e+03 6.3900e+00 -1.6500e+03 2.0000e+03 6.4297e+00 -1.6800e+03 -2.0000e+03 6.4636e+00 -1.6800e+03 -1.9714e+03 6.4250e+00 -1.6800e+03 -1.9429e+03 6.3858e+00 -1.6800e+03 -1.9143e+03 6.3460e+00 -1.6800e+03 -1.8857e+03 6.3055e+00 -1.6800e+03 -1.8571e+03 6.2645e+00 -1.6800e+03 -1.8286e+03 6.2228e+00 -1.6800e+03 -1.8000e+03 6.1805e+00 -1.6800e+03 -1.7714e+03 6.1375e+00 -1.6800e+03 -1.7429e+03 6.0940e+00 -1.6800e+03 -1.7143e+03 6.0497e+00 -1.6800e+03 -1.6857e+03 6.0049e+00 -1.6800e+03 -1.6571e+03 5.9594e+00 -1.6800e+03 -1.6286e+03 5.9132e+00 -1.6800e+03 -1.6000e+03 5.8665e+00 -1.6800e+03 -1.5714e+03 5.8191e+00 -1.6800e+03 -1.5429e+03 5.7710e+00 -1.6800e+03 -1.5143e+03 5.7224e+00 -1.6800e+03 -1.4857e+03 5.6732e+00 -1.6800e+03 -1.4571e+03 5.6233e+00 -1.6800e+03 -1.4286e+03 5.5729e+00 -1.6800e+03 -1.4000e+03 5.5219e+00 -1.6800e+03 -1.3714e+03 5.4704e+00 -1.6800e+03 -1.3429e+03 5.4183e+00 -1.6800e+03 -1.3143e+03 5.3657e+00 -1.6800e+03 -1.2857e+03 5.3126e+00 -1.6800e+03 -1.2571e+03 5.2591e+00 -1.6800e+03 -1.2286e+03 5.2051e+00 -1.6800e+03 -1.2000e+03 5.1508e+00 -1.6800e+03 -1.1714e+03 5.0960e+00 -1.6800e+03 -1.1429e+03 5.0410e+00 -1.6800e+03 -1.1143e+03 4.9857e+00 -1.6800e+03 -1.0857e+03 4.9301e+00 -1.6800e+03 -1.0571e+03 4.8744e+00 -1.6800e+03 -1.0286e+03 4.8185e+00 -1.6800e+03 -1.0000e+03 4.7625e+00 -1.6800e+03 -9.7143e+02 4.7066e+00 -1.6800e+03 -9.4286e+02 4.6507e+00 -1.6800e+03 -9.1429e+02 4.5949e+00 -1.6800e+03 -8.8571e+02 4.5393e+00 -1.6800e+03 -8.5714e+02 4.4840e+00 -1.6800e+03 -8.2857e+02 4.4291e+00 -1.6800e+03 -8.0000e+02 4.3746e+00 -1.6800e+03 -7.7143e+02 4.3207e+00 -1.6800e+03 -7.4286e+02 4.2674e+00 -1.6800e+03 -7.1429e+02 4.2148e+00 -1.6800e+03 -6.8571e+02 4.1630e+00 -1.6800e+03 -6.5714e+02 4.1122e+00 -1.6800e+03 -6.2857e+02 4.0624e+00 -1.6800e+03 -6.0000e+02 4.0138e+00 -1.6800e+03 -5.7143e+02 3.9665e+00 -1.6800e+03 -5.4286e+02 3.9205e+00 -1.6800e+03 -5.1429e+02 3.8760e+00 -1.6800e+03 -4.8571e+02 3.8331e+00 -1.6800e+03 -4.5714e+02 3.7919e+00 -1.6800e+03 -4.2857e+02 3.7526e+00 -1.6800e+03 -4.0000e+02 3.7151e+00 -1.6800e+03 -3.7143e+02 3.6798e+00 -1.6800e+03 -3.4286e+02 3.6465e+00 -1.6800e+03 -3.1429e+02 3.6155e+00 -1.6800e+03 -2.8571e+02 3.5869e+00 -1.6800e+03 -2.5714e+02 3.5607e+00 -1.6800e+03 -2.2857e+02 3.5370e+00 -1.6800e+03 -2.0000e+02 3.5159e+00 -1.6800e+03 -1.7143e+02 3.4975e+00 -1.6800e+03 -1.4286e+02 3.4818e+00 -1.6800e+03 -1.1429e+02 3.4688e+00 -1.6800e+03 -8.5714e+01 3.4587e+00 -1.6800e+03 -5.7143e+01 3.4515e+00 -1.6800e+03 -2.8571e+01 3.4471e+00 -1.6800e+03 0.0000e+00 3.4457e+00 -1.6800e+03 2.8571e+01 3.4471e+00 -1.6800e+03 5.7143e+01 3.4515e+00 -1.6800e+03 8.5714e+01 3.4587e+00 -1.6800e+03 1.1429e+02 3.4688e+00 -1.6800e+03 1.4286e+02 3.4818e+00 -1.6800e+03 1.7143e+02 3.4975e+00 -1.6800e+03 2.0000e+02 3.5159e+00 -1.6800e+03 2.2857e+02 3.5370e+00 -1.6800e+03 2.5714e+02 3.5607e+00 -1.6800e+03 2.8571e+02 3.5869e+00 -1.6800e+03 3.1429e+02 3.6155e+00 -1.6800e+03 3.4286e+02 3.6465e+00 -1.6800e+03 3.7143e+02 3.6798e+00 -1.6800e+03 4.0000e+02 3.7151e+00 -1.6800e+03 4.2857e+02 3.7526e+00 -1.6800e+03 4.5714e+02 3.7919e+00 -1.6800e+03 4.8571e+02 3.8331e+00 -1.6800e+03 5.1429e+02 3.8760e+00 -1.6800e+03 5.4286e+02 3.9205e+00 -1.6800e+03 5.7143e+02 3.9665e+00 -1.6800e+03 6.0000e+02 4.0138e+00 -1.6800e+03 6.2857e+02 4.0624e+00 -1.6800e+03 6.5714e+02 4.1122e+00 -1.6800e+03 6.8571e+02 4.1630e+00 -1.6800e+03 7.1429e+02 4.2148e+00 -1.6800e+03 7.4286e+02 4.2674e+00 -1.6800e+03 7.7143e+02 4.3207e+00 -1.6800e+03 8.0000e+02 4.3746e+00 -1.6800e+03 8.2857e+02 4.4291e+00 -1.6800e+03 8.5714e+02 4.4840e+00 -1.6800e+03 8.8571e+02 4.5393e+00 -1.6800e+03 9.1429e+02 4.5949e+00 -1.6800e+03 9.4286e+02 4.6507e+00 -1.6800e+03 9.7143e+02 4.7066e+00 -1.6800e+03 1.0000e+03 4.7625e+00 -1.6800e+03 1.0286e+03 4.8185e+00 -1.6800e+03 1.0571e+03 4.8744e+00 -1.6800e+03 1.0857e+03 4.9301e+00 -1.6800e+03 1.1143e+03 4.9857e+00 -1.6800e+03 1.1429e+03 5.0410e+00 -1.6800e+03 1.1714e+03 5.0960e+00 -1.6800e+03 1.2000e+03 5.1508e+00 -1.6800e+03 1.2286e+03 5.2051e+00 -1.6800e+03 1.2571e+03 5.2591e+00 -1.6800e+03 1.2857e+03 5.3126e+00 -1.6800e+03 1.3143e+03 5.3657e+00 -1.6800e+03 1.3429e+03 5.4183e+00 -1.6800e+03 1.3714e+03 5.4704e+00 -1.6800e+03 1.4000e+03 5.5219e+00 -1.6800e+03 1.4286e+03 5.5729e+00 -1.6800e+03 1.4571e+03 5.6233e+00 -1.6800e+03 1.4857e+03 5.6732e+00 -1.6800e+03 1.5143e+03 5.7224e+00 -1.6800e+03 1.5429e+03 5.7710e+00 -1.6800e+03 1.5714e+03 5.8191e+00 -1.6800e+03 1.6000e+03 5.8665e+00 -1.6800e+03 1.6286e+03 5.9132e+00 -1.6800e+03 1.6571e+03 5.9594e+00 -1.6800e+03 1.6857e+03 6.0049e+00 -1.6800e+03 1.7143e+03 6.0497e+00 -1.6800e+03 1.7429e+03 6.0940e+00 -1.6800e+03 1.7714e+03 6.1375e+00 -1.6800e+03 1.8000e+03 6.1805e+00 -1.6800e+03 1.8286e+03 6.2228e+00 -1.6800e+03 1.8571e+03 6.2645e+00 -1.6800e+03 1.8857e+03 6.3055e+00 -1.6800e+03 1.9143e+03 6.3460e+00 -1.6800e+03 1.9429e+03 6.3858e+00 -1.6800e+03 1.9714e+03 6.4250e+00 -1.6800e+03 2.0000e+03 6.4636e+00 -1.7100e+03 -2.0000e+03 6.4972e+00 -1.7100e+03 -1.9714e+03 6.4596e+00 -1.7100e+03 -1.9429e+03 6.4215e+00 -1.7100e+03 -1.9143e+03 6.3828e+00 -1.7100e+03 -1.8857e+03 6.3435e+00 -1.7100e+03 -1.8571e+03 6.3036e+00 -1.7100e+03 -1.8286e+03 6.2631e+00 -1.7100e+03 -1.8000e+03 6.2220e+00 -1.7100e+03 -1.7714e+03 6.1803e+00 -1.7100e+03 -1.7429e+03 6.1381e+00 -1.7100e+03 -1.7143e+03 6.0952e+00 -1.7100e+03 -1.6857e+03 6.0518e+00 -1.7100e+03 -1.6571e+03 6.0078e+00 -1.7100e+03 -1.6286e+03 5.9631e+00 -1.7100e+03 -1.6000e+03 5.9179e+00 -1.7100e+03 -1.5714e+03 5.8722e+00 -1.7100e+03 -1.5429e+03 5.8258e+00 -1.7100e+03 -1.5143e+03 5.7789e+00 -1.7100e+03 -1.4857e+03 5.7314e+00 -1.7100e+03 -1.4571e+03 5.6834e+00 -1.7100e+03 -1.4286e+03 5.6349e+00 -1.7100e+03 -1.4000e+03 5.5858e+00 -1.7100e+03 -1.3714e+03 5.5363e+00 -1.7100e+03 -1.3429e+03 5.4863e+00 -1.7100e+03 -1.3143e+03 5.4358e+00 -1.7100e+03 -1.2857e+03 5.3849e+00 -1.7100e+03 -1.2571e+03 5.3336e+00 -1.7100e+03 -1.2286e+03 5.2819e+00 -1.7100e+03 -1.2000e+03 5.2299e+00 -1.7100e+03 -1.1714e+03 5.1776e+00 -1.7100e+03 -1.1429e+03 5.1250e+00 -1.7100e+03 -1.1143e+03 5.0722e+00 -1.7100e+03 -1.0857e+03 5.0192e+00 -1.7100e+03 -1.0571e+03 4.9661e+00 -1.7100e+03 -1.0286e+03 4.9129e+00 -1.7100e+03 -1.0000e+03 4.8596e+00 -1.7100e+03 -9.7143e+02 4.8065e+00 -1.7100e+03 -9.4286e+02 4.7534e+00 -1.7100e+03 -9.1429e+02 4.7005e+00 -1.7100e+03 -8.8571e+02 4.6478e+00 -1.7100e+03 -8.5714e+02 4.5954e+00 -1.7100e+03 -8.2857e+02 4.5434e+00 -1.7100e+03 -8.0000e+02 4.4919e+00 -1.7100e+03 -7.7143e+02 4.4409e+00 -1.7100e+03 -7.4286e+02 4.3906e+00 -1.7100e+03 -7.1429e+02 4.3410e+00 -1.7100e+03 -6.8571e+02 4.2922e+00 -1.7100e+03 -6.5714e+02 4.2444e+00 -1.7100e+03 -6.2857e+02 4.1976e+00 -1.7100e+03 -6.0000e+02 4.1519e+00 -1.7100e+03 -5.7143e+02 4.1074e+00 -1.7100e+03 -5.4286e+02 4.0642e+00 -1.7100e+03 -5.1429e+02 4.0225e+00 -1.7100e+03 -4.8571e+02 3.9823e+00 -1.7100e+03 -4.5714e+02 3.9437e+00 -1.7100e+03 -4.2857e+02 3.9068e+00 -1.7100e+03 -4.0000e+02 3.8718e+00 -1.7100e+03 -3.7143e+02 3.8388e+00 -1.7100e+03 -3.4286e+02 3.8077e+00 -1.7100e+03 -3.1429e+02 3.7788e+00 -1.7100e+03 -2.8571e+02 3.7520e+00 -1.7100e+03 -2.5714e+02 3.7276e+00 -1.7100e+03 -2.2857e+02 3.7055e+00 -1.7100e+03 -2.0000e+02 3.6858e+00 -1.7100e+03 -1.7143e+02 3.6686e+00 -1.7100e+03 -1.4286e+02 3.6540e+00 -1.7100e+03 -1.1429e+02 3.6419e+00 -1.7100e+03 -8.5714e+01 3.6325e+00 -1.7100e+03 -5.7143e+01 3.6258e+00 -1.7100e+03 -2.8571e+01 3.6217e+00 -1.7100e+03 0.0000e+00 3.6204e+00 -1.7100e+03 2.8571e+01 3.6217e+00 -1.7100e+03 5.7143e+01 3.6258e+00 -1.7100e+03 8.5714e+01 3.6325e+00 -1.7100e+03 1.1429e+02 3.6419e+00 -1.7100e+03 1.4286e+02 3.6540e+00 -1.7100e+03 1.7143e+02 3.6686e+00 -1.7100e+03 2.0000e+02 3.6858e+00 -1.7100e+03 2.2857e+02 3.7055e+00 -1.7100e+03 2.5714e+02 3.7276e+00 -1.7100e+03 2.8571e+02 3.7520e+00 -1.7100e+03 3.1429e+02 3.7788e+00 -1.7100e+03 3.4286e+02 3.8077e+00 -1.7100e+03 3.7143e+02 3.8388e+00 -1.7100e+03 4.0000e+02 3.8718e+00 -1.7100e+03 4.2857e+02 3.9068e+00 -1.7100e+03 4.5714e+02 3.9437e+00 -1.7100e+03 4.8571e+02 3.9823e+00 -1.7100e+03 5.1429e+02 4.0225e+00 -1.7100e+03 5.4286e+02 4.0642e+00 -1.7100e+03 5.7143e+02 4.1074e+00 -1.7100e+03 6.0000e+02 4.1519e+00 -1.7100e+03 6.2857e+02 4.1976e+00 -1.7100e+03 6.5714e+02 4.2444e+00 -1.7100e+03 6.8571e+02 4.2922e+00 -1.7100e+03 7.1429e+02 4.3410e+00 -1.7100e+03 7.4286e+02 4.3906e+00 -1.7100e+03 7.7143e+02 4.4409e+00 -1.7100e+03 8.0000e+02 4.4919e+00 -1.7100e+03 8.2857e+02 4.5434e+00 -1.7100e+03 8.5714e+02 4.5954e+00 -1.7100e+03 8.8571e+02 4.6478e+00 -1.7100e+03 9.1429e+02 4.7005e+00 -1.7100e+03 9.4286e+02 4.7534e+00 -1.7100e+03 9.7143e+02 4.8065e+00 -1.7100e+03 1.0000e+03 4.8596e+00 -1.7100e+03 1.0286e+03 4.9129e+00 -1.7100e+03 1.0571e+03 4.9661e+00 -1.7100e+03 1.0857e+03 5.0192e+00 -1.7100e+03 1.1143e+03 5.0722e+00 -1.7100e+03 1.1429e+03 5.1250e+00 -1.7100e+03 1.1714e+03 5.1776e+00 -1.7100e+03 1.2000e+03 5.2299e+00 -1.7100e+03 1.2286e+03 5.2819e+00 -1.7100e+03 1.2571e+03 5.3336e+00 -1.7100e+03 1.2857e+03 5.3849e+00 -1.7100e+03 1.3143e+03 5.4358e+00 -1.7100e+03 1.3429e+03 5.4863e+00 -1.7100e+03 1.3714e+03 5.5363e+00 -1.7100e+03 1.4000e+03 5.5858e+00 -1.7100e+03 1.4286e+03 5.6349e+00 -1.7100e+03 1.4571e+03 5.6834e+00 -1.7100e+03 1.4857e+03 5.7314e+00 -1.7100e+03 1.5143e+03 5.7789e+00 -1.7100e+03 1.5429e+03 5.8258e+00 -1.7100e+03 1.5714e+03 5.8722e+00 -1.7100e+03 1.6000e+03 5.9179e+00 -1.7100e+03 1.6286e+03 5.9631e+00 -1.7100e+03 1.6571e+03 6.0078e+00 -1.7100e+03 1.6857e+03 6.0518e+00 -1.7100e+03 1.7143e+03 6.0952e+00 -1.7100e+03 1.7429e+03 6.1381e+00 -1.7100e+03 1.7714e+03 6.1803e+00 -1.7100e+03 1.8000e+03 6.2220e+00 -1.7100e+03 1.8286e+03 6.2631e+00 -1.7100e+03 1.8571e+03 6.3036e+00 -1.7100e+03 1.8857e+03 6.3435e+00 -1.7100e+03 1.9143e+03 6.3828e+00 -1.7100e+03 1.9429e+03 6.4215e+00 -1.7100e+03 1.9714e+03 6.4596e+00 -1.7100e+03 2.0000e+03 6.4972e+00 -1.7400e+03 -2.0000e+03 6.5305e+00 -1.7400e+03 -1.9714e+03 6.4940e+00 -1.7400e+03 -1.9429e+03 6.4568e+00 -1.7400e+03 -1.9143e+03 6.4192e+00 -1.7400e+03 -1.8857e+03 6.3810e+00 -1.7400e+03 -1.8571e+03 6.3422e+00 -1.7400e+03 -1.8286e+03 6.3029e+00 -1.7400e+03 -1.8000e+03 6.2630e+00 -1.7400e+03 -1.7714e+03 6.2226e+00 -1.7400e+03 -1.7429e+03 6.1816e+00 -1.7400e+03 -1.7143e+03 6.1401e+00 -1.7400e+03 -1.6857e+03 6.0980e+00 -1.7400e+03 -1.6571e+03 6.0554e+00 -1.7400e+03 -1.6286e+03 6.0123e+00 -1.7400e+03 -1.6000e+03 5.9686e+00 -1.7400e+03 -1.5714e+03 5.9243e+00 -1.7400e+03 -1.5429e+03 5.8796e+00 -1.7400e+03 -1.5143e+03 5.8343e+00 -1.7400e+03 -1.4857e+03 5.7886e+00 -1.7400e+03 -1.4571e+03 5.7423e+00 -1.7400e+03 -1.4286e+03 5.6956e+00 -1.7400e+03 -1.4000e+03 5.6484e+00 -1.7400e+03 -1.3714e+03 5.6008e+00 -1.7400e+03 -1.3429e+03 5.5527e+00 -1.7400e+03 -1.3143e+03 5.5042e+00 -1.7400e+03 -1.2857e+03 5.4554e+00 -1.7400e+03 -1.2571e+03 5.4062e+00 -1.7400e+03 -1.2286e+03 5.3567e+00 -1.7400e+03 -1.2000e+03 5.3069e+00 -1.7400e+03 -1.1714e+03 5.2569e+00 -1.7400e+03 -1.1429e+03 5.2066e+00 -1.7400e+03 -1.1143e+03 5.1562e+00 -1.7400e+03 -1.0857e+03 5.1056e+00 -1.7400e+03 -1.0571e+03 5.0550e+00 -1.7400e+03 -1.0286e+03 5.0043e+00 -1.7400e+03 -1.0000e+03 4.9537e+00 -1.7400e+03 -9.7143e+02 4.9031e+00 -1.7400e+03 -9.4286e+02 4.8526e+00 -1.7400e+03 -9.1429e+02 4.8024e+00 -1.7400e+03 -8.8571e+02 4.7524e+00 -1.7400e+03 -8.5714e+02 4.7028e+00 -1.7400e+03 -8.2857e+02 4.6535e+00 -1.7400e+03 -8.0000e+02 4.6048e+00 -1.7400e+03 -7.7143e+02 4.5566e+00 -1.7400e+03 -7.4286e+02 4.5090e+00 -1.7400e+03 -7.1429e+02 4.4622e+00 -1.7400e+03 -6.8571e+02 4.4162e+00 -1.7400e+03 -6.5714e+02 4.3711e+00 -1.7400e+03 -6.2857e+02 4.3270e+00 -1.7400e+03 -6.0000e+02 4.2840e+00 -1.7400e+03 -5.7143e+02 4.2421e+00 -1.7400e+03 -5.4286e+02 4.2016e+00 -1.7400e+03 -5.1429e+02 4.1624e+00 -1.7400e+03 -4.8571e+02 4.1246e+00 -1.7400e+03 -4.5714e+02 4.0884e+00 -1.7400e+03 -4.2857e+02 4.0539e+00 -1.7400e+03 -4.0000e+02 4.0211e+00 -1.7400e+03 -3.7143e+02 3.9901e+00 -1.7400e+03 -3.4286e+02 3.9611e+00 -1.7400e+03 -3.1429e+02 3.9340e+00 -1.7400e+03 -2.8571e+02 3.9090e+00 -1.7400e+03 -2.5714e+02 3.8861e+00 -1.7400e+03 -2.2857e+02 3.8655e+00 -1.7400e+03 -2.0000e+02 3.8471e+00 -1.7400e+03 -1.7143e+02 3.8311e+00 -1.7400e+03 -1.4286e+02 3.8174e+00 -1.7400e+03 -1.1429e+02 3.8062e+00 -1.7400e+03 -8.5714e+01 3.7974e+00 -1.7400e+03 -5.7143e+01 3.7911e+00 -1.7400e+03 -2.8571e+01 3.7873e+00 -1.7400e+03 0.0000e+00 3.7861e+00 -1.7400e+03 2.8571e+01 3.7873e+00 -1.7400e+03 5.7143e+01 3.7911e+00 -1.7400e+03 8.5714e+01 3.7974e+00 -1.7400e+03 1.1429e+02 3.8062e+00 -1.7400e+03 1.4286e+02 3.8174e+00 -1.7400e+03 1.7143e+02 3.8311e+00 -1.7400e+03 2.0000e+02 3.8471e+00 -1.7400e+03 2.2857e+02 3.8655e+00 -1.7400e+03 2.5714e+02 3.8861e+00 -1.7400e+03 2.8571e+02 3.9090e+00 -1.7400e+03 3.1429e+02 3.9340e+00 -1.7400e+03 3.4286e+02 3.9611e+00 -1.7400e+03 3.7143e+02 3.9901e+00 -1.7400e+03 4.0000e+02 4.0211e+00 -1.7400e+03 4.2857e+02 4.0539e+00 -1.7400e+03 4.5714e+02 4.0884e+00 -1.7400e+03 4.8571e+02 4.1246e+00 -1.7400e+03 5.1429e+02 4.1624e+00 -1.7400e+03 5.4286e+02 4.2016e+00 -1.7400e+03 5.7143e+02 4.2421e+00 -1.7400e+03 6.0000e+02 4.2840e+00 -1.7400e+03 6.2857e+02 4.3270e+00 -1.7400e+03 6.5714e+02 4.3711e+00 -1.7400e+03 6.8571e+02 4.4162e+00 -1.7400e+03 7.1429e+02 4.4622e+00 -1.7400e+03 7.4286e+02 4.5090e+00 -1.7400e+03 7.7143e+02 4.5566e+00 -1.7400e+03 8.0000e+02 4.6048e+00 -1.7400e+03 8.2857e+02 4.6535e+00 -1.7400e+03 8.5714e+02 4.7028e+00 -1.7400e+03 8.8571e+02 4.7524e+00 -1.7400e+03 9.1429e+02 4.8024e+00 -1.7400e+03 9.4286e+02 4.8526e+00 -1.7400e+03 9.7143e+02 4.9031e+00 -1.7400e+03 1.0000e+03 4.9537e+00 -1.7400e+03 1.0286e+03 5.0043e+00 -1.7400e+03 1.0571e+03 5.0550e+00 -1.7400e+03 1.0857e+03 5.1056e+00 -1.7400e+03 1.1143e+03 5.1562e+00 -1.7400e+03 1.1429e+03 5.2066e+00 -1.7400e+03 1.1714e+03 5.2569e+00 -1.7400e+03 1.2000e+03 5.3069e+00 -1.7400e+03 1.2286e+03 5.3567e+00 -1.7400e+03 1.2571e+03 5.4062e+00 -1.7400e+03 1.2857e+03 5.4554e+00 -1.7400e+03 1.3143e+03 5.5042e+00 -1.7400e+03 1.3429e+03 5.5527e+00 -1.7400e+03 1.3714e+03 5.6008e+00 -1.7400e+03 1.4000e+03 5.6484e+00 -1.7400e+03 1.4286e+03 5.6956e+00 -1.7400e+03 1.4571e+03 5.7423e+00 -1.7400e+03 1.4857e+03 5.7886e+00 -1.7400e+03 1.5143e+03 5.8343e+00 -1.7400e+03 1.5429e+03 5.8796e+00 -1.7400e+03 1.5714e+03 5.9243e+00 -1.7400e+03 1.6000e+03 5.9686e+00 -1.7400e+03 1.6286e+03 6.0123e+00 -1.7400e+03 1.6571e+03 6.0554e+00 -1.7400e+03 1.6857e+03 6.0980e+00 -1.7400e+03 1.7143e+03 6.1401e+00 -1.7400e+03 1.7429e+03 6.1816e+00 -1.7400e+03 1.7714e+03 6.2226e+00 -1.7400e+03 1.8000e+03 6.2630e+00 -1.7400e+03 1.8286e+03 6.3029e+00 -1.7400e+03 1.8571e+03 6.3422e+00 -1.7400e+03 1.8857e+03 6.3810e+00 -1.7400e+03 1.9143e+03 6.4192e+00 -1.7400e+03 1.9429e+03 6.4568e+00 -1.7400e+03 1.9714e+03 6.4940e+00 -1.7400e+03 2.0000e+03 6.5305e+00 -1.7700e+03 -2.0000e+03 6.5636e+00 -1.7700e+03 -1.9714e+03 6.5279e+00 -1.7700e+03 -1.9429e+03 6.4918e+00 -1.7700e+03 -1.9143e+03 6.4552e+00 -1.7700e+03 -1.8857e+03 6.4180e+00 -1.7700e+03 -1.8571e+03 6.3804e+00 -1.7700e+03 -1.8286e+03 6.3422e+00 -1.7700e+03 -1.8000e+03 6.3035e+00 -1.7700e+03 -1.7714e+03 6.2643e+00 -1.7700e+03 -1.7429e+03 6.2246e+00 -1.7700e+03 -1.7143e+03 6.1843e+00 -1.7700e+03 -1.6857e+03 6.1436e+00 -1.7700e+03 -1.6571e+03 6.1023e+00 -1.7700e+03 -1.6286e+03 6.0606e+00 -1.7700e+03 -1.6000e+03 6.0183e+00 -1.7700e+03 -1.5714e+03 5.9756e+00 -1.7700e+03 -1.5429e+03 5.9324e+00 -1.7700e+03 -1.5143e+03 5.8887e+00 -1.7700e+03 -1.4857e+03 5.8446e+00 -1.7700e+03 -1.4571e+03 5.8000e+00 -1.7700e+03 -1.4286e+03 5.7550e+00 -1.7700e+03 -1.4000e+03 5.7096e+00 -1.7700e+03 -1.3714e+03 5.6638e+00 -1.7700e+03 -1.3429e+03 5.6176e+00 -1.7700e+03 -1.3143e+03 5.5711e+00 -1.7700e+03 -1.2857e+03 5.5242e+00 -1.7700e+03 -1.2571e+03 5.4770e+00 -1.7700e+03 -1.2286e+03 5.4296e+00 -1.7700e+03 -1.2000e+03 5.3819e+00 -1.7700e+03 -1.1714e+03 5.3340e+00 -1.7700e+03 -1.1429e+03 5.2860e+00 -1.7700e+03 -1.1143e+03 5.2378e+00 -1.7700e+03 -1.0857e+03 5.1895e+00 -1.7700e+03 -1.0571e+03 5.1412e+00 -1.7700e+03 -1.0286e+03 5.0929e+00 -1.7700e+03 -1.0000e+03 5.0447e+00 -1.7700e+03 -9.7143e+02 4.9966e+00 -1.7700e+03 -9.4286e+02 4.9486e+00 -1.7700e+03 -9.1429e+02 4.9008e+00 -1.7700e+03 -8.8571e+02 4.8534e+00 -1.7700e+03 -8.5714e+02 4.8063e+00 -1.7700e+03 -8.2857e+02 4.7596e+00 -1.7700e+03 -8.0000e+02 4.7134e+00 -1.7700e+03 -7.7143e+02 4.6678e+00 -1.7700e+03 -7.4286e+02 4.6229e+00 -1.7700e+03 -7.1429e+02 4.5786e+00 -1.7700e+03 -6.8571e+02 4.5352e+00 -1.7700e+03 -6.5714e+02 4.4926e+00 -1.7700e+03 -6.2857e+02 4.4510e+00 -1.7700e+03 -6.0000e+02 4.4105e+00 -1.7700e+03 -5.7143e+02 4.3711e+00 -1.7700e+03 -5.4286e+02 4.3329e+00 -1.7700e+03 -5.1429e+02 4.2960e+00 -1.7700e+03 -4.8571e+02 4.2606e+00 -1.7700e+03 -4.5714e+02 4.2266e+00 -1.7700e+03 -4.2857e+02 4.1942e+00 -1.7700e+03 -4.0000e+02 4.1634e+00 -1.7700e+03 -3.7143e+02 4.1344e+00 -1.7700e+03 -3.4286e+02 4.1071e+00 -1.7700e+03 -3.1429e+02 4.0818e+00 -1.7700e+03 -2.8571e+02 4.0584e+00 -1.7700e+03 -2.5714e+02 4.0370e+00 -1.7700e+03 -2.2857e+02 4.0177e+00 -1.7700e+03 -2.0000e+02 4.0005e+00 -1.7700e+03 -1.7143e+02 3.9855e+00 -1.7700e+03 -1.4286e+02 3.9727e+00 -1.7700e+03 -1.1429e+02 3.9622e+00 -1.7700e+03 -8.5714e+01 3.9540e+00 -1.7700e+03 -5.7143e+01 3.9481e+00 -1.7700e+03 -2.8571e+01 3.9446e+00 -1.7700e+03 0.0000e+00 3.9434e+00 -1.7700e+03 2.8571e+01 3.9446e+00 -1.7700e+03 5.7143e+01 3.9481e+00 -1.7700e+03 8.5714e+01 3.9540e+00 -1.7700e+03 1.1429e+02 3.9622e+00 -1.7700e+03 1.4286e+02 3.9727e+00 -1.7700e+03 1.7143e+02 3.9855e+00 -1.7700e+03 2.0000e+02 4.0005e+00 -1.7700e+03 2.2857e+02 4.0177e+00 -1.7700e+03 2.5714e+02 4.0370e+00 -1.7700e+03 2.8571e+02 4.0584e+00 -1.7700e+03 3.1429e+02 4.0818e+00 -1.7700e+03 3.4286e+02 4.1071e+00 -1.7700e+03 3.7143e+02 4.1344e+00 -1.7700e+03 4.0000e+02 4.1634e+00 -1.7700e+03 4.2857e+02 4.1942e+00 -1.7700e+03 4.5714e+02 4.2266e+00 -1.7700e+03 4.8571e+02 4.2606e+00 -1.7700e+03 5.1429e+02 4.2960e+00 -1.7700e+03 5.4286e+02 4.3329e+00 -1.7700e+03 5.7143e+02 4.3711e+00 -1.7700e+03 6.0000e+02 4.4105e+00 -1.7700e+03 6.2857e+02 4.4510e+00 -1.7700e+03 6.5714e+02 4.4926e+00 -1.7700e+03 6.8571e+02 4.5352e+00 -1.7700e+03 7.1429e+02 4.5786e+00 -1.7700e+03 7.4286e+02 4.6229e+00 -1.7700e+03 7.7143e+02 4.6678e+00 -1.7700e+03 8.0000e+02 4.7134e+00 -1.7700e+03 8.2857e+02 4.7596e+00 -1.7700e+03 8.5714e+02 4.8063e+00 -1.7700e+03 8.8571e+02 4.8534e+00 -1.7700e+03 9.1429e+02 4.9008e+00 -1.7700e+03 9.4286e+02 4.9486e+00 -1.7700e+03 9.7143e+02 4.9966e+00 -1.7700e+03 1.0000e+03 5.0447e+00 -1.7700e+03 1.0286e+03 5.0929e+00 -1.7700e+03 1.0571e+03 5.1412e+00 -1.7700e+03 1.0857e+03 5.1895e+00 -1.7700e+03 1.1143e+03 5.2378e+00 -1.7700e+03 1.1429e+03 5.2860e+00 -1.7700e+03 1.1714e+03 5.3340e+00 -1.7700e+03 1.2000e+03 5.3819e+00 -1.7700e+03 1.2286e+03 5.4296e+00 -1.7700e+03 1.2571e+03 5.4770e+00 -1.7700e+03 1.2857e+03 5.5242e+00 -1.7700e+03 1.3143e+03 5.5711e+00 -1.7700e+03 1.3429e+03 5.6176e+00 -1.7700e+03 1.3714e+03 5.6638e+00 -1.7700e+03 1.4000e+03 5.7096e+00 -1.7700e+03 1.4286e+03 5.7550e+00 -1.7700e+03 1.4571e+03 5.8000e+00 -1.7700e+03 1.4857e+03 5.8446e+00 -1.7700e+03 1.5143e+03 5.8887e+00 -1.7700e+03 1.5429e+03 5.9324e+00 -1.7700e+03 1.5714e+03 5.9756e+00 -1.7700e+03 1.6000e+03 6.0183e+00 -1.7700e+03 1.6286e+03 6.0606e+00 -1.7700e+03 1.6571e+03 6.1023e+00 -1.7700e+03 1.6857e+03 6.1436e+00 -1.7700e+03 1.7143e+03 6.1843e+00 -1.7700e+03 1.7429e+03 6.2246e+00 -1.7700e+03 1.7714e+03 6.2643e+00 -1.7700e+03 1.8000e+03 6.3035e+00 -1.7700e+03 1.8286e+03 6.3422e+00 -1.7700e+03 1.8571e+03 6.3804e+00 -1.7700e+03 1.8857e+03 6.4180e+00 -1.7700e+03 1.9143e+03 6.4552e+00 -1.7700e+03 1.9429e+03 6.4918e+00 -1.7700e+03 1.9714e+03 6.5279e+00 -1.7700e+03 2.0000e+03 6.5636e+00 -1.8000e+03 -2.0000e+03 6.5963e+00 -1.8000e+03 -1.9714e+03 6.5616e+00 -1.8000e+03 -1.9429e+03 6.5264e+00 -1.8000e+03 -1.9143e+03 6.4908e+00 -1.8000e+03 -1.8857e+03 6.4547e+00 -1.8000e+03 -1.8571e+03 6.4181e+00 -1.8000e+03 -1.8286e+03 6.3810e+00 -1.8000e+03 -1.8000e+03 6.3434e+00 -1.8000e+03 -1.7714e+03 6.3054e+00 -1.8000e+03 -1.7429e+03 6.2669e+00 -1.8000e+03 -1.7143e+03 6.2279e+00 -1.8000e+03 -1.6857e+03 6.1884e+00 -1.8000e+03 -1.6571e+03 6.1485e+00 -1.8000e+03 -1.6286e+03 6.1081e+00 -1.8000e+03 -1.6000e+03 6.0673e+00 -1.8000e+03 -1.5714e+03 6.0260e+00 -1.8000e+03 -1.5429e+03 5.9843e+00 -1.8000e+03 -1.5143e+03 5.9421e+00 -1.8000e+03 -1.4857e+03 5.8995e+00 -1.8000e+03 -1.4571e+03 5.8566e+00 -1.8000e+03 -1.4286e+03 5.8132e+00 -1.8000e+03 -1.4000e+03 5.7695e+00 -1.8000e+03 -1.3714e+03 5.7254e+00 -1.8000e+03 -1.3429e+03 5.6810e+00 -1.8000e+03 -1.3143e+03 5.6363e+00 -1.8000e+03 -1.2857e+03 5.5913e+00 -1.8000e+03 -1.2571e+03 5.5461e+00 -1.8000e+03 -1.2286e+03 5.5006e+00 -1.8000e+03 -1.2000e+03 5.4550e+00 -1.8000e+03 -1.1714e+03 5.4091e+00 -1.8000e+03 -1.1429e+03 5.3632e+00 -1.8000e+03 -1.1143e+03 5.3171e+00 -1.8000e+03 -1.0857e+03 5.2710e+00 -1.8000e+03 -1.0571e+03 5.2249e+00 -1.8000e+03 -1.0286e+03 5.1788e+00 -1.8000e+03 -1.0000e+03 5.1329e+00 -1.8000e+03 -9.7143e+02 5.0870e+00 -1.8000e+03 -9.4286e+02 5.0414e+00 -1.8000e+03 -9.1429e+02 4.9960e+00 -1.8000e+03 -8.8571e+02 4.9509e+00 -1.8000e+03 -8.5714e+02 4.9062e+00 -1.8000e+03 -8.2857e+02 4.8619e+00 -1.8000e+03 -8.0000e+02 4.8181e+00 -1.8000e+03 -7.7143e+02 4.7749e+00 -1.8000e+03 -7.4286e+02 4.7324e+00 -1.8000e+03 -7.1429e+02 4.6905e+00 -1.8000e+03 -6.8571e+02 4.6494e+00 -1.8000e+03 -6.5714e+02 4.6092e+00 -1.8000e+03 -6.2857e+02 4.5700e+00 -1.8000e+03 -6.0000e+02 4.5318e+00 -1.8000e+03 -5.7143e+02 4.4946e+00 -1.8000e+03 -5.4286e+02 4.4587e+00 -1.8000e+03 -5.1429e+02 4.4240e+00 -1.8000e+03 -4.8571e+02 4.3906e+00 -1.8000e+03 -4.5714e+02 4.3586e+00 -1.8000e+03 -4.2857e+02 4.3282e+00 -1.8000e+03 -4.0000e+02 4.2993e+00 -1.8000e+03 -3.7143e+02 4.2720e+00 -1.8000e+03 -3.4286e+02 4.2464e+00 -1.8000e+03 -3.1429e+02 4.2226e+00 -1.8000e+03 -2.8571e+02 4.2007e+00 -1.8000e+03 -2.5714e+02 4.1807e+00 -1.8000e+03 -2.2857e+02 4.1626e+00 -1.8000e+03 -2.0000e+02 4.1465e+00 -1.8000e+03 -1.7143e+02 4.1324e+00 -1.8000e+03 -1.4286e+02 4.1205e+00 -1.8000e+03 -1.1429e+02 4.1106e+00 -1.8000e+03 -8.5714e+01 4.1030e+00 -1.8000e+03 -5.7143e+01 4.0975e+00 -1.8000e+03 -2.8571e+01 4.0942e+00 -1.8000e+03 0.0000e+00 4.0931e+00 -1.8000e+03 2.8571e+01 4.0942e+00 -1.8000e+03 5.7143e+01 4.0975e+00 -1.8000e+03 8.5714e+01 4.1030e+00 -1.8000e+03 1.1429e+02 4.1106e+00 -1.8000e+03 1.4286e+02 4.1205e+00 -1.8000e+03 1.7143e+02 4.1324e+00 -1.8000e+03 2.0000e+02 4.1465e+00 -1.8000e+03 2.2857e+02 4.1626e+00 -1.8000e+03 2.5714e+02 4.1807e+00 -1.8000e+03 2.8571e+02 4.2007e+00 -1.8000e+03 3.1429e+02 4.2226e+00 -1.8000e+03 3.4286e+02 4.2464e+00 -1.8000e+03 3.7143e+02 4.2720e+00 -1.8000e+03 4.0000e+02 4.2993e+00 -1.8000e+03 4.2857e+02 4.3282e+00 -1.8000e+03 4.5714e+02 4.3586e+00 -1.8000e+03 4.8571e+02 4.3906e+00 -1.8000e+03 5.1429e+02 4.4240e+00 -1.8000e+03 5.4286e+02 4.4587e+00 -1.8000e+03 5.7143e+02 4.4946e+00 -1.8000e+03 6.0000e+02 4.5318e+00 -1.8000e+03 6.2857e+02 4.5700e+00 -1.8000e+03 6.5714e+02 4.6092e+00 -1.8000e+03 6.8571e+02 4.6494e+00 -1.8000e+03 7.1429e+02 4.6905e+00 -1.8000e+03 7.4286e+02 4.7324e+00 -1.8000e+03 7.7143e+02 4.7749e+00 -1.8000e+03 8.0000e+02 4.8181e+00 -1.8000e+03 8.2857e+02 4.8619e+00 -1.8000e+03 8.5714e+02 4.9062e+00 -1.8000e+03 8.8571e+02 4.9509e+00 -1.8000e+03 9.1429e+02 4.9960e+00 -1.8000e+03 9.4286e+02 5.0414e+00 -1.8000e+03 9.7143e+02 5.0870e+00 -1.8000e+03 1.0000e+03 5.1329e+00 -1.8000e+03 1.0286e+03 5.1788e+00 -1.8000e+03 1.0571e+03 5.2249e+00 -1.8000e+03 1.0857e+03 5.2710e+00 -1.8000e+03 1.1143e+03 5.3171e+00 -1.8000e+03 1.1429e+03 5.3632e+00 -1.8000e+03 1.1714e+03 5.4091e+00 -1.8000e+03 1.2000e+03 5.4550e+00 -1.8000e+03 1.2286e+03 5.5006e+00 -1.8000e+03 1.2571e+03 5.5461e+00 -1.8000e+03 1.2857e+03 5.5913e+00 -1.8000e+03 1.3143e+03 5.6363e+00 -1.8000e+03 1.3429e+03 5.6810e+00 -1.8000e+03 1.3714e+03 5.7254e+00 -1.8000e+03 1.4000e+03 5.7695e+00 -1.8000e+03 1.4286e+03 5.8132e+00 -1.8000e+03 1.4571e+03 5.8566e+00 -1.8000e+03 1.4857e+03 5.8995e+00 -1.8000e+03 1.5143e+03 5.9421e+00 -1.8000e+03 1.5429e+03 5.9843e+00 -1.8000e+03 1.5714e+03 6.0260e+00 -1.8000e+03 1.6000e+03 6.0673e+00 -1.8000e+03 1.6286e+03 6.1081e+00 -1.8000e+03 1.6571e+03 6.1485e+00 -1.8000e+03 1.6857e+03 6.1884e+00 -1.8000e+03 1.7143e+03 6.2279e+00 -1.8000e+03 1.7429e+03 6.2669e+00 -1.8000e+03 1.7714e+03 6.3054e+00 -1.8000e+03 1.8000e+03 6.3434e+00 -1.8000e+03 1.8286e+03 6.3810e+00 -1.8000e+03 1.8571e+03 6.4181e+00 -1.8000e+03 1.8857e+03 6.4547e+00 -1.8000e+03 1.9143e+03 6.4908e+00 -1.8000e+03 1.9429e+03 6.5264e+00 -1.8000e+03 1.9714e+03 6.5616e+00 -1.8000e+03 2.0000e+03 6.5963e+00 -1.8300e+03 -2.0000e+03 6.6287e+00 -1.8300e+03 -1.9714e+03 6.5949e+00 -1.8300e+03 -1.9429e+03 6.5607e+00 -1.8300e+03 -1.9143e+03 6.5260e+00 -1.8300e+03 -1.8857e+03 6.4909e+00 -1.8300e+03 -1.8571e+03 6.4553e+00 -1.8300e+03 -1.8286e+03 6.4193e+00 -1.8300e+03 -1.8000e+03 6.3829e+00 -1.8300e+03 -1.7714e+03 6.3460e+00 -1.8300e+03 -1.7429e+03 6.3086e+00 -1.8300e+03 -1.7143e+03 6.2708e+00 -1.8300e+03 -1.6857e+03 6.2326e+00 -1.8300e+03 -1.6571e+03 6.1939e+00 -1.8300e+03 -1.6286e+03 6.1549e+00 -1.8300e+03 -1.6000e+03 6.1154e+00 -1.8300e+03 -1.5714e+03 6.0755e+00 -1.8300e+03 -1.5429e+03 6.0352e+00 -1.8300e+03 -1.5143e+03 5.9945e+00 -1.8300e+03 -1.4857e+03 5.9534e+00 -1.8300e+03 -1.4571e+03 5.9120e+00 -1.8300e+03 -1.4286e+03 5.8702e+00 -1.8300e+03 -1.4000e+03 5.8281e+00 -1.8300e+03 -1.3714e+03 5.7857e+00 -1.8300e+03 -1.3429e+03 5.7430e+00 -1.8300e+03 -1.3143e+03 5.7001e+00 -1.8300e+03 -1.2857e+03 5.6569e+00 -1.8300e+03 -1.2571e+03 5.6135e+00 -1.8300e+03 -1.2286e+03 5.5698e+00 -1.8300e+03 -1.2000e+03 5.5261e+00 -1.8300e+03 -1.1714e+03 5.4822e+00 -1.8300e+03 -1.1429e+03 5.4382e+00 -1.8300e+03 -1.1143e+03 5.3942e+00 -1.8300e+03 -1.0857e+03 5.3501e+00 -1.8300e+03 -1.0571e+03 5.3061e+00 -1.8300e+03 -1.0286e+03 5.2621e+00 -1.8300e+03 -1.0000e+03 5.2183e+00 -1.8300e+03 -9.7143e+02 5.1746e+00 -1.8300e+03 -9.4286e+02 5.1312e+00 -1.8300e+03 -9.1429e+02 5.0880e+00 -1.8300e+03 -8.8571e+02 5.0451e+00 -1.8300e+03 -8.5714e+02 5.0026e+00 -1.8300e+03 -8.2857e+02 4.9606e+00 -1.8300e+03 -8.0000e+02 4.9191e+00 -1.8300e+03 -7.7143e+02 4.8781e+00 -1.8300e+03 -7.4286e+02 4.8378e+00 -1.8300e+03 -7.1429e+02 4.7981e+00 -1.8300e+03 -6.8571e+02 4.7593e+00 -1.8300e+03 -6.5714e+02 4.7213e+00 -1.8300e+03 -6.2857e+02 4.6842e+00 -1.8300e+03 -6.0000e+02 4.6481e+00 -1.8300e+03 -5.7143e+02 4.6130e+00 -1.8300e+03 -5.4286e+02 4.5791e+00 -1.8300e+03 -5.1429e+02 4.5464e+00 -1.8300e+03 -4.8571e+02 4.5150e+00 -1.8300e+03 -4.5714e+02 4.4849e+00 -1.8300e+03 -4.2857e+02 4.4562e+00 -1.8300e+03 -4.0000e+02 4.4291e+00 -1.8300e+03 -3.7143e+02 4.4034e+00 -1.8300e+03 -3.4286e+02 4.3794e+00 -1.8300e+03 -3.1429e+02 4.3571e+00 -1.8300e+03 -2.8571e+02 4.3365e+00 -1.8300e+03 -2.5714e+02 4.3176e+00 -1.8300e+03 -2.2857e+02 4.3007e+00 -1.8300e+03 -2.0000e+02 4.2856e+00 -1.8300e+03 -1.7143e+02 4.2724e+00 -1.8300e+03 -1.4286e+02 4.2612e+00 -1.8300e+03 -1.1429e+02 4.2520e+00 -1.8300e+03 -8.5714e+01 4.2448e+00 -1.8300e+03 -5.7143e+01 4.2396e+00 -1.8300e+03 -2.8571e+01 4.2365e+00 -1.8300e+03 0.0000e+00 4.2355e+00 -1.8300e+03 2.8571e+01 4.2365e+00 -1.8300e+03 5.7143e+01 4.2396e+00 -1.8300e+03 8.5714e+01 4.2448e+00 -1.8300e+03 1.1429e+02 4.2520e+00 -1.8300e+03 1.4286e+02 4.2612e+00 -1.8300e+03 1.7143e+02 4.2724e+00 -1.8300e+03 2.0000e+02 4.2856e+00 -1.8300e+03 2.2857e+02 4.3007e+00 -1.8300e+03 2.5714e+02 4.3176e+00 -1.8300e+03 2.8571e+02 4.3365e+00 -1.8300e+03 3.1429e+02 4.3571e+00 -1.8300e+03 3.4286e+02 4.3794e+00 -1.8300e+03 3.7143e+02 4.4034e+00 -1.8300e+03 4.0000e+02 4.4291e+00 -1.8300e+03 4.2857e+02 4.4562e+00 -1.8300e+03 4.5714e+02 4.4849e+00 -1.8300e+03 4.8571e+02 4.5150e+00 -1.8300e+03 5.1429e+02 4.5464e+00 -1.8300e+03 5.4286e+02 4.5791e+00 -1.8300e+03 5.7143e+02 4.6130e+00 -1.8300e+03 6.0000e+02 4.6481e+00 -1.8300e+03 6.2857e+02 4.6842e+00 -1.8300e+03 6.5714e+02 4.7213e+00 -1.8300e+03 6.8571e+02 4.7593e+00 -1.8300e+03 7.1429e+02 4.7981e+00 -1.8300e+03 7.4286e+02 4.8378e+00 -1.8300e+03 7.7143e+02 4.8781e+00 -1.8300e+03 8.0000e+02 4.9191e+00 -1.8300e+03 8.2857e+02 4.9606e+00 -1.8300e+03 8.5714e+02 5.0026e+00 -1.8300e+03 8.8571e+02 5.0451e+00 -1.8300e+03 9.1429e+02 5.0880e+00 -1.8300e+03 9.4286e+02 5.1312e+00 -1.8300e+03 9.7143e+02 5.1746e+00 -1.8300e+03 1.0000e+03 5.2183e+00 -1.8300e+03 1.0286e+03 5.2621e+00 -1.8300e+03 1.0571e+03 5.3061e+00 -1.8300e+03 1.0857e+03 5.3501e+00 -1.8300e+03 1.1143e+03 5.3942e+00 -1.8300e+03 1.1429e+03 5.4382e+00 -1.8300e+03 1.1714e+03 5.4822e+00 -1.8300e+03 1.2000e+03 5.5261e+00 -1.8300e+03 1.2286e+03 5.5698e+00 -1.8300e+03 1.2571e+03 5.6135e+00 -1.8300e+03 1.2857e+03 5.6569e+00 -1.8300e+03 1.3143e+03 5.7001e+00 -1.8300e+03 1.3429e+03 5.7430e+00 -1.8300e+03 1.3714e+03 5.7857e+00 -1.8300e+03 1.4000e+03 5.8281e+00 -1.8300e+03 1.4286e+03 5.8702e+00 -1.8300e+03 1.4571e+03 5.9120e+00 -1.8300e+03 1.4857e+03 5.9534e+00 -1.8300e+03 1.5143e+03 5.9945e+00 -1.8300e+03 1.5429e+03 6.0352e+00 -1.8300e+03 1.5714e+03 6.0755e+00 -1.8300e+03 1.6000e+03 6.1154e+00 -1.8300e+03 1.6286e+03 6.1549e+00 -1.8300e+03 1.6571e+03 6.1939e+00 -1.8300e+03 1.6857e+03 6.2326e+00 -1.8300e+03 1.7143e+03 6.2708e+00 -1.8300e+03 1.7429e+03 6.3086e+00 -1.8300e+03 1.7714e+03 6.3460e+00 -1.8300e+03 1.8000e+03 6.3829e+00 -1.8300e+03 1.8286e+03 6.4193e+00 -1.8300e+03 1.8571e+03 6.4553e+00 -1.8300e+03 1.8857e+03 6.4909e+00 -1.8300e+03 1.9143e+03 6.5260e+00 -1.8300e+03 1.9429e+03 6.5607e+00 -1.8300e+03 1.9714e+03 6.5949e+00 -1.8300e+03 2.0000e+03 6.6287e+00 -1.8600e+03 -2.0000e+03 6.6607e+00 -1.8600e+03 -1.9714e+03 6.6278e+00 -1.8600e+03 -1.9429e+03 6.5945e+00 -1.8600e+03 -1.9143e+03 6.5608e+00 -1.8600e+03 -1.8857e+03 6.5267e+00 -1.8600e+03 -1.8571e+03 6.4921e+00 -1.8600e+03 -1.8286e+03 6.4572e+00 -1.8600e+03 -1.8000e+03 6.4218e+00 -1.8600e+03 -1.7714e+03 6.3860e+00 -1.8600e+03 -1.7429e+03 6.3497e+00 -1.8600e+03 -1.7143e+03 6.3131e+00 -1.8600e+03 -1.6857e+03 6.2761e+00 -1.8600e+03 -1.6571e+03 6.2386e+00 -1.8600e+03 -1.6286e+03 6.2008e+00 -1.8600e+03 -1.6000e+03 6.1626e+00 -1.8600e+03 -1.5714e+03 6.1241e+00 -1.8600e+03 -1.5429e+03 6.0851e+00 -1.8600e+03 -1.5143e+03 6.0459e+00 -1.8600e+03 -1.4857e+03 6.0062e+00 -1.8600e+03 -1.4571e+03 5.9663e+00 -1.8600e+03 -1.4286e+03 5.9260e+00 -1.8600e+03 -1.4000e+03 5.8855e+00 -1.8600e+03 -1.3714e+03 5.8447e+00 -1.8600e+03 -1.3429e+03 5.8036e+00 -1.8600e+03 -1.3143e+03 5.7623e+00 -1.8600e+03 -1.2857e+03 5.7208e+00 -1.8600e+03 -1.2571e+03 5.6791e+00 -1.8600e+03 -1.2286e+03 5.6373e+00 -1.8600e+03 -1.2000e+03 5.5954e+00 -1.8600e+03 -1.1714e+03 5.5533e+00 -1.8600e+03 -1.1429e+03 5.5112e+00 -1.8600e+03 -1.1143e+03 5.4691e+00 -1.8600e+03 -1.0857e+03 5.4270e+00 -1.8600e+03 -1.0571e+03 5.3849e+00 -1.8600e+03 -1.0286e+03 5.3429e+00 -1.8600e+03 -1.0000e+03 5.3011e+00 -1.8600e+03 -9.7143e+02 5.2595e+00 -1.8600e+03 -9.4286e+02 5.2180e+00 -1.8600e+03 -9.1429e+02 5.1769e+00 -1.8600e+03 -8.8571e+02 5.1361e+00 -1.8600e+03 -8.5714e+02 5.0958e+00 -1.8600e+03 -8.2857e+02 5.0558e+00 -1.8600e+03 -8.0000e+02 5.0164e+00 -1.8600e+03 -7.7143e+02 4.9775e+00 -1.8600e+03 -7.4286e+02 4.9393e+00 -1.8600e+03 -7.1429e+02 4.9017e+00 -1.8600e+03 -6.8571e+02 4.8650e+00 -1.8600e+03 -6.5714e+02 4.8290e+00 -1.8600e+03 -6.2857e+02 4.7939e+00 -1.8600e+03 -6.0000e+02 4.7598e+00 -1.8600e+03 -5.7143e+02 4.7267e+00 -1.8600e+03 -5.4286e+02 4.6947e+00 -1.8600e+03 -5.1429e+02 4.6638e+00 -1.8600e+03 -4.8571e+02 4.6342e+00 -1.8600e+03 -4.5714e+02 4.6058e+00 -1.8600e+03 -4.2857e+02 4.5788e+00 -1.8600e+03 -4.0000e+02 4.5532e+00 -1.8600e+03 -3.7143e+02 4.5291e+00 -1.8600e+03 -3.4286e+02 4.5065e+00 -1.8600e+03 -3.1429e+02 4.4855e+00 -1.8600e+03 -2.8571e+02 4.4661e+00 -1.8600e+03 -2.5714e+02 4.4484e+00 -1.8600e+03 -2.2857e+02 4.4325e+00 -1.8600e+03 -2.0000e+02 4.4183e+00 -1.8600e+03 -1.7143e+02 4.4059e+00 -1.8600e+03 -1.4286e+02 4.3954e+00 -1.8600e+03 -1.1429e+02 4.3867e+00 -1.8600e+03 -8.5714e+01 4.3800e+00 -1.8600e+03 -5.7143e+01 4.3752e+00 -1.8600e+03 -2.8571e+01 4.3723e+00 -1.8600e+03 0.0000e+00 4.3713e+00 -1.8600e+03 2.8571e+01 4.3723e+00 -1.8600e+03 5.7143e+01 4.3752e+00 -1.8600e+03 8.5714e+01 4.3800e+00 -1.8600e+03 1.1429e+02 4.3867e+00 -1.8600e+03 1.4286e+02 4.3954e+00 -1.8600e+03 1.7143e+02 4.4059e+00 -1.8600e+03 2.0000e+02 4.4183e+00 -1.8600e+03 2.2857e+02 4.4325e+00 -1.8600e+03 2.5714e+02 4.4484e+00 -1.8600e+03 2.8571e+02 4.4661e+00 -1.8600e+03 3.1429e+02 4.4855e+00 -1.8600e+03 3.4286e+02 4.5065e+00 -1.8600e+03 3.7143e+02 4.5291e+00 -1.8600e+03 4.0000e+02 4.5532e+00 -1.8600e+03 4.2857e+02 4.5788e+00 -1.8600e+03 4.5714e+02 4.6058e+00 -1.8600e+03 4.8571e+02 4.6342e+00 -1.8600e+03 5.1429e+02 4.6638e+00 -1.8600e+03 5.4286e+02 4.6947e+00 -1.8600e+03 5.7143e+02 4.7267e+00 -1.8600e+03 6.0000e+02 4.7598e+00 -1.8600e+03 6.2857e+02 4.7939e+00 -1.8600e+03 6.5714e+02 4.8290e+00 -1.8600e+03 6.8571e+02 4.8650e+00 -1.8600e+03 7.1429e+02 4.9017e+00 -1.8600e+03 7.4286e+02 4.9393e+00 -1.8600e+03 7.7143e+02 4.9775e+00 -1.8600e+03 8.0000e+02 5.0164e+00 -1.8600e+03 8.2857e+02 5.0558e+00 -1.8600e+03 8.5714e+02 5.0958e+00 -1.8600e+03 8.8571e+02 5.1361e+00 -1.8600e+03 9.1429e+02 5.1769e+00 -1.8600e+03 9.4286e+02 5.2180e+00 -1.8600e+03 9.7143e+02 5.2595e+00 -1.8600e+03 1.0000e+03 5.3011e+00 -1.8600e+03 1.0286e+03 5.3429e+00 -1.8600e+03 1.0571e+03 5.3849e+00 -1.8600e+03 1.0857e+03 5.4270e+00 -1.8600e+03 1.1143e+03 5.4691e+00 -1.8600e+03 1.1429e+03 5.5112e+00 -1.8600e+03 1.1714e+03 5.5533e+00 -1.8600e+03 1.2000e+03 5.5954e+00 -1.8600e+03 1.2286e+03 5.6373e+00 -1.8600e+03 1.2571e+03 5.6791e+00 -1.8600e+03 1.2857e+03 5.7208e+00 -1.8600e+03 1.3143e+03 5.7623e+00 -1.8600e+03 1.3429e+03 5.8036e+00 -1.8600e+03 1.3714e+03 5.8447e+00 -1.8600e+03 1.4000e+03 5.8855e+00 -1.8600e+03 1.4286e+03 5.9260e+00 -1.8600e+03 1.4571e+03 5.9663e+00 -1.8600e+03 1.4857e+03 6.0062e+00 -1.8600e+03 1.5143e+03 6.0459e+00 -1.8600e+03 1.5429e+03 6.0851e+00 -1.8600e+03 1.5714e+03 6.1241e+00 -1.8600e+03 1.6000e+03 6.1626e+00 -1.8600e+03 1.6286e+03 6.2008e+00 -1.8600e+03 1.6571e+03 6.2386e+00 -1.8600e+03 1.6857e+03 6.2761e+00 -1.8600e+03 1.7143e+03 6.3131e+00 -1.8600e+03 1.7429e+03 6.3497e+00 -1.8600e+03 1.7714e+03 6.3860e+00 -1.8600e+03 1.8000e+03 6.4218e+00 -1.8600e+03 1.8286e+03 6.4572e+00 -1.8600e+03 1.8571e+03 6.4921e+00 -1.8600e+03 1.8857e+03 6.5267e+00 -1.8600e+03 1.9143e+03 6.5608e+00 -1.8600e+03 1.9429e+03 6.5945e+00 -1.8600e+03 1.9714e+03 6.6278e+00 -1.8600e+03 2.0000e+03 6.6607e+00 -1.8900e+03 -2.0000e+03 6.6924e+00 -1.8900e+03 -1.9714e+03 6.6604e+00 -1.8900e+03 -1.9429e+03 6.6280e+00 -1.8900e+03 -1.9143e+03 6.5952e+00 -1.8900e+03 -1.8857e+03 6.5620e+00 -1.8900e+03 -1.8571e+03 6.5285e+00 -1.8900e+03 -1.8286e+03 6.4945e+00 -1.8900e+03 -1.8000e+03 6.4601e+00 -1.8900e+03 -1.7714e+03 6.4254e+00 -1.8900e+03 -1.7429e+03 6.3903e+00 -1.8900e+03 -1.7143e+03 6.3547e+00 -1.8900e+03 -1.6857e+03 6.3189e+00 -1.8900e+03 -1.6571e+03 6.2826e+00 -1.8900e+03 -1.6286e+03 6.2460e+00 -1.8900e+03 -1.6000e+03 6.2091e+00 -1.8900e+03 -1.5714e+03 6.1718e+00 -1.8900e+03 -1.5429e+03 6.1342e+00 -1.8900e+03 -1.5143e+03 6.0962e+00 -1.8900e+03 -1.4857e+03 6.0580e+00 -1.8900e+03 -1.4571e+03 6.0195e+00 -1.8900e+03 -1.4286e+03 5.9807e+00 -1.8900e+03 -1.4000e+03 5.9416e+00 -1.8900e+03 -1.3714e+03 5.9023e+00 -1.8900e+03 -1.3429e+03 5.8628e+00 -1.8900e+03 -1.3143e+03 5.8231e+00 -1.8900e+03 -1.2857e+03 5.7833e+00 -1.8900e+03 -1.2571e+03 5.7432e+00 -1.8900e+03 -1.2286e+03 5.7031e+00 -1.8900e+03 -1.2000e+03 5.6628e+00 -1.8900e+03 -1.1714e+03 5.6225e+00 -1.8900e+03 -1.1429e+03 5.5822e+00 -1.8900e+03 -1.1143e+03 5.5419e+00 -1.8900e+03 -1.0857e+03 5.5016e+00 -1.8900e+03 -1.0571e+03 5.4614e+00 -1.8900e+03 -1.0286e+03 5.4213e+00 -1.8900e+03 -1.0000e+03 5.3814e+00 -1.8900e+03 -9.7143e+02 5.3416e+00 -1.8900e+03 -9.4286e+02 5.3022e+00 -1.8900e+03 -9.1429e+02 5.2630e+00 -1.8900e+03 -8.8571e+02 5.2242e+00 -1.8900e+03 -8.5714e+02 5.1857e+00 -1.8900e+03 -8.2857e+02 5.1478e+00 -1.8900e+03 -8.0000e+02 5.1103e+00 -1.8900e+03 -7.7143e+02 5.0734e+00 -1.8900e+03 -7.4286e+02 5.0371e+00 -1.8900e+03 -7.1429e+02 5.0015e+00 -1.8900e+03 -6.8571e+02 4.9666e+00 -1.8900e+03 -6.5714e+02 4.9326e+00 -1.8900e+03 -6.2857e+02 4.8994e+00 -1.8900e+03 -6.0000e+02 4.8671e+00 -1.8900e+03 -5.7143e+02 4.8358e+00 -1.8900e+03 -5.4286e+02 4.8055e+00 -1.8900e+03 -5.1429e+02 4.7764e+00 -1.8900e+03 -4.8571e+02 4.7484e+00 -1.8900e+03 -4.5714e+02 4.7216e+00 -1.8900e+03 -4.2857e+02 4.6962e+00 -1.8900e+03 -4.0000e+02 4.6720e+00 -1.8900e+03 -3.7143e+02 4.6493e+00 -1.8900e+03 -3.4286e+02 4.6280e+00 -1.8900e+03 -3.1429e+02 4.6082e+00 -1.8900e+03 -2.8571e+02 4.5900e+00 -1.8900e+03 -2.5714e+02 4.5734e+00 -1.8900e+03 -2.2857e+02 4.5583e+00 -1.8900e+03 -2.0000e+02 4.5450e+00 -1.8900e+03 -1.7143e+02 4.5334e+00 -1.8900e+03 -1.4286e+02 4.5235e+00 -1.8900e+03 -1.1429e+02 4.5154e+00 -1.8900e+03 -8.5714e+01 4.5090e+00 -1.8900e+03 -5.7143e+01 4.5045e+00 -1.8900e+03 -2.8571e+01 4.5018e+00 -1.8900e+03 0.0000e+00 4.5008e+00 -1.8900e+03 2.8571e+01 4.5018e+00 -1.8900e+03 5.7143e+01 4.5045e+00 -1.8900e+03 8.5714e+01 4.5090e+00 -1.8900e+03 1.1429e+02 4.5154e+00 -1.8900e+03 1.4286e+02 4.5235e+00 -1.8900e+03 1.7143e+02 4.5334e+00 -1.8900e+03 2.0000e+02 4.5450e+00 -1.8900e+03 2.2857e+02 4.5583e+00 -1.8900e+03 2.5714e+02 4.5734e+00 -1.8900e+03 2.8571e+02 4.5900e+00 -1.8900e+03 3.1429e+02 4.6082e+00 -1.8900e+03 3.4286e+02 4.6280e+00 -1.8900e+03 3.7143e+02 4.6493e+00 -1.8900e+03 4.0000e+02 4.6720e+00 -1.8900e+03 4.2857e+02 4.6962e+00 -1.8900e+03 4.5714e+02 4.7216e+00 -1.8900e+03 4.8571e+02 4.7484e+00 -1.8900e+03 5.1429e+02 4.7764e+00 -1.8900e+03 5.4286e+02 4.8055e+00 -1.8900e+03 5.7143e+02 4.8358e+00 -1.8900e+03 6.0000e+02 4.8671e+00 -1.8900e+03 6.2857e+02 4.8994e+00 -1.8900e+03 6.5714e+02 4.9326e+00 -1.8900e+03 6.8571e+02 4.9666e+00 -1.8900e+03 7.1429e+02 5.0015e+00 -1.8900e+03 7.4286e+02 5.0371e+00 -1.8900e+03 7.7143e+02 5.0734e+00 -1.8900e+03 8.0000e+02 5.1103e+00 -1.8900e+03 8.2857e+02 5.1478e+00 -1.8900e+03 8.5714e+02 5.1857e+00 -1.8900e+03 8.8571e+02 5.2242e+00 -1.8900e+03 9.1429e+02 5.2630e+00 -1.8900e+03 9.4286e+02 5.3022e+00 -1.8900e+03 9.7143e+02 5.3416e+00 -1.8900e+03 1.0000e+03 5.3814e+00 -1.8900e+03 1.0286e+03 5.4213e+00 -1.8900e+03 1.0571e+03 5.4614e+00 -1.8900e+03 1.0857e+03 5.5016e+00 -1.8900e+03 1.1143e+03 5.5419e+00 -1.8900e+03 1.1429e+03 5.5822e+00 -1.8900e+03 1.1714e+03 5.6225e+00 -1.8900e+03 1.2000e+03 5.6628e+00 -1.8900e+03 1.2286e+03 5.7031e+00 -1.8900e+03 1.2571e+03 5.7432e+00 -1.8900e+03 1.2857e+03 5.7833e+00 -1.8900e+03 1.3143e+03 5.8231e+00 -1.8900e+03 1.3429e+03 5.8628e+00 -1.8900e+03 1.3714e+03 5.9023e+00 -1.8900e+03 1.4000e+03 5.9416e+00 -1.8900e+03 1.4286e+03 5.9807e+00 -1.8900e+03 1.4571e+03 6.0195e+00 -1.8900e+03 1.4857e+03 6.0580e+00 -1.8900e+03 1.5143e+03 6.0962e+00 -1.8900e+03 1.5429e+03 6.1342e+00 -1.8900e+03 1.5714e+03 6.1718e+00 -1.8900e+03 1.6000e+03 6.2091e+00 -1.8900e+03 1.6286e+03 6.2460e+00 -1.8900e+03 1.6571e+03 6.2826e+00 -1.8900e+03 1.6857e+03 6.3189e+00 -1.8900e+03 1.7143e+03 6.3547e+00 -1.8900e+03 1.7429e+03 6.3903e+00 -1.8900e+03 1.7714e+03 6.4254e+00 -1.8900e+03 1.8000e+03 6.4601e+00 -1.8900e+03 1.8286e+03 6.4945e+00 -1.8900e+03 1.8571e+03 6.5285e+00 -1.8900e+03 1.8857e+03 6.5620e+00 -1.8900e+03 1.9143e+03 6.5952e+00 -1.8900e+03 1.9429e+03 6.6280e+00 -1.8900e+03 1.9714e+03 6.6604e+00 -1.8900e+03 2.0000e+03 6.6924e+00 -1.9200e+03 -2.0000e+03 6.7238e+00 -1.9200e+03 -1.9714e+03 6.6927e+00 -1.9200e+03 -1.9429e+03 6.6611e+00 -1.9200e+03 -1.9143e+03 6.6292e+00 -1.9200e+03 -1.8857e+03 6.5970e+00 -1.9200e+03 -1.8571e+03 6.5643e+00 -1.9200e+03 -1.8286e+03 6.5313e+00 -1.9200e+03 -1.8000e+03 6.4980e+00 -1.9200e+03 -1.7714e+03 6.4642e+00 -1.9200e+03 -1.7429e+03 6.4302e+00 -1.9200e+03 -1.7143e+03 6.3957e+00 -1.9200e+03 -1.6857e+03 6.3610e+00 -1.9200e+03 -1.6571e+03 6.3259e+00 -1.9200e+03 -1.6286e+03 6.2905e+00 -1.9200e+03 -1.6000e+03 6.2547e+00 -1.9200e+03 -1.5714e+03 6.2187e+00 -1.9200e+03 -1.5429e+03 6.1823e+00 -1.9200e+03 -1.5143e+03 6.1457e+00 -1.9200e+03 -1.4857e+03 6.1088e+00 -1.9200e+03 -1.4571e+03 6.0716e+00 -1.9200e+03 -1.4286e+03 6.0342e+00 -1.9200e+03 -1.4000e+03 5.9966e+00 -1.9200e+03 -1.3714e+03 5.9587e+00 -1.9200e+03 -1.3429e+03 5.9207e+00 -1.9200e+03 -1.3143e+03 5.8825e+00 -1.9200e+03 -1.2857e+03 5.8442e+00 -1.9200e+03 -1.2571e+03 5.8057e+00 -1.9200e+03 -1.2286e+03 5.7672e+00 -1.9200e+03 -1.2000e+03 5.7286e+00 -1.9200e+03 -1.1714e+03 5.6899e+00 -1.9200e+03 -1.1429e+03 5.6513e+00 -1.9200e+03 -1.1143e+03 5.6127e+00 -1.9200e+03 -1.0857e+03 5.5741e+00 -1.9200e+03 -1.0571e+03 5.5357e+00 -1.9200e+03 -1.0286e+03 5.4974e+00 -1.9200e+03 -1.0000e+03 5.4592e+00 -1.9200e+03 -9.7143e+02 5.4213e+00 -1.9200e+03 -9.4286e+02 5.3837e+00 -1.9200e+03 -9.1429e+02 5.3463e+00 -1.9200e+03 -8.8571e+02 5.3093e+00 -1.9200e+03 -8.5714e+02 5.2727e+00 -1.9200e+03 -8.2857e+02 5.2366e+00 -1.9200e+03 -8.0000e+02 5.2010e+00 -1.9200e+03 -7.7143e+02 5.1659e+00 -1.9200e+03 -7.4286e+02 5.1314e+00 -1.9200e+03 -7.1429e+02 5.0976e+00 -1.9200e+03 -6.8571e+02 5.0646e+00 -1.9200e+03 -6.5714e+02 5.0323e+00 -1.9200e+03 -6.2857e+02 5.0008e+00 -1.9200e+03 -6.0000e+02 4.9702e+00 -1.9200e+03 -5.7143e+02 4.9406e+00 -1.9200e+03 -5.4286e+02 4.9120e+00 -1.9200e+03 -5.1429e+02 4.8844e+00 -1.9200e+03 -4.8571e+02 4.8580e+00 -1.9200e+03 -4.5714e+02 4.8327e+00 -1.9200e+03 -4.2857e+02 4.8087e+00 -1.9200e+03 -4.0000e+02 4.7859e+00 -1.9200e+03 -3.7143e+02 4.7644e+00 -1.9200e+03 -3.4286e+02 4.7444e+00 -1.9200e+03 -3.1429e+02 4.7257e+00 -1.9200e+03 -2.8571e+02 4.7085e+00 -1.9200e+03 -2.5714e+02 4.6929e+00 -1.9200e+03 -2.2857e+02 4.6787e+00 -1.9200e+03 -2.0000e+02 4.6662e+00 -1.9200e+03 -1.7143e+02 4.6552e+00 -1.9200e+03 -1.4286e+02 4.6459e+00 -1.9200e+03 -1.1429e+02 4.6383e+00 -1.9200e+03 -8.5714e+01 4.6323e+00 -1.9200e+03 -5.7143e+01 4.6280e+00 -1.9200e+03 -2.8571e+01 4.6255e+00 -1.9200e+03 0.0000e+00 4.6246e+00 -1.9200e+03 2.8571e+01 4.6255e+00 -1.9200e+03 5.7143e+01 4.6280e+00 -1.9200e+03 8.5714e+01 4.6323e+00 -1.9200e+03 1.1429e+02 4.6383e+00 -1.9200e+03 1.4286e+02 4.6459e+00 -1.9200e+03 1.7143e+02 4.6552e+00 -1.9200e+03 2.0000e+02 4.6662e+00 -1.9200e+03 2.2857e+02 4.6787e+00 -1.9200e+03 2.5714e+02 4.6929e+00 -1.9200e+03 2.8571e+02 4.7085e+00 -1.9200e+03 3.1429e+02 4.7257e+00 -1.9200e+03 3.4286e+02 4.7444e+00 -1.9200e+03 3.7143e+02 4.7644e+00 -1.9200e+03 4.0000e+02 4.7859e+00 -1.9200e+03 4.2857e+02 4.8087e+00 -1.9200e+03 4.5714e+02 4.8327e+00 -1.9200e+03 4.8571e+02 4.8580e+00 -1.9200e+03 5.1429e+02 4.8844e+00 -1.9200e+03 5.4286e+02 4.9120e+00 -1.9200e+03 5.7143e+02 4.9406e+00 -1.9200e+03 6.0000e+02 4.9702e+00 -1.9200e+03 6.2857e+02 5.0008e+00 -1.9200e+03 6.5714e+02 5.0323e+00 -1.9200e+03 6.8571e+02 5.0646e+00 -1.9200e+03 7.1429e+02 5.0976e+00 -1.9200e+03 7.4286e+02 5.1314e+00 -1.9200e+03 7.7143e+02 5.1659e+00 -1.9200e+03 8.0000e+02 5.2010e+00 -1.9200e+03 8.2857e+02 5.2366e+00 -1.9200e+03 8.5714e+02 5.2727e+00 -1.9200e+03 8.8571e+02 5.3093e+00 -1.9200e+03 9.1429e+02 5.3463e+00 -1.9200e+03 9.4286e+02 5.3837e+00 -1.9200e+03 9.7143e+02 5.4213e+00 -1.9200e+03 1.0000e+03 5.4592e+00 -1.9200e+03 1.0286e+03 5.4974e+00 -1.9200e+03 1.0571e+03 5.5357e+00 -1.9200e+03 1.0857e+03 5.5741e+00 -1.9200e+03 1.1143e+03 5.6127e+00 -1.9200e+03 1.1429e+03 5.6513e+00 -1.9200e+03 1.1714e+03 5.6899e+00 -1.9200e+03 1.2000e+03 5.7286e+00 -1.9200e+03 1.2286e+03 5.7672e+00 -1.9200e+03 1.2571e+03 5.8057e+00 -1.9200e+03 1.2857e+03 5.8442e+00 -1.9200e+03 1.3143e+03 5.8825e+00 -1.9200e+03 1.3429e+03 5.9207e+00 -1.9200e+03 1.3714e+03 5.9587e+00 -1.9200e+03 1.4000e+03 5.9966e+00 -1.9200e+03 1.4286e+03 6.0342e+00 -1.9200e+03 1.4571e+03 6.0716e+00 -1.9200e+03 1.4857e+03 6.1088e+00 -1.9200e+03 1.5143e+03 6.1457e+00 -1.9200e+03 1.5429e+03 6.1823e+00 -1.9200e+03 1.5714e+03 6.2187e+00 -1.9200e+03 1.6000e+03 6.2547e+00 -1.9200e+03 1.6286e+03 6.2905e+00 -1.9200e+03 1.6571e+03 6.3259e+00 -1.9200e+03 1.6857e+03 6.3610e+00 -1.9200e+03 1.7143e+03 6.3957e+00 -1.9200e+03 1.7429e+03 6.4302e+00 -1.9200e+03 1.7714e+03 6.4642e+00 -1.9200e+03 1.8000e+03 6.4980e+00 -1.9200e+03 1.8286e+03 6.5313e+00 -1.9200e+03 1.8571e+03 6.5643e+00 -1.9200e+03 1.8857e+03 6.5970e+00 -1.9200e+03 1.9143e+03 6.6292e+00 -1.9200e+03 1.9429e+03 6.6611e+00 -1.9200e+03 1.9714e+03 6.6927e+00 -1.9200e+03 2.0000e+03 6.7238e+00 -1.9500e+03 -2.0000e+03 6.7549e+00 -1.9500e+03 -1.9714e+03 6.7245e+00 -1.9500e+03 -1.9429e+03 6.6938e+00 -1.9500e+03 -1.9143e+03 6.6628e+00 -1.9500e+03 -1.8857e+03 6.6314e+00 -1.9500e+03 -1.8571e+03 6.5997e+00 -1.9500e+03 -1.8286e+03 6.5677e+00 -1.9500e+03 -1.8000e+03 6.5353e+00 -1.9500e+03 -1.7714e+03 6.5025e+00 -1.9500e+03 -1.7429e+03 6.4695e+00 -1.9500e+03 -1.7143e+03 6.4361e+00 -1.9500e+03 -1.6857e+03 6.4024e+00 -1.9500e+03 -1.6571e+03 6.3684e+00 -1.9500e+03 -1.6286e+03 6.3341e+00 -1.9500e+03 -1.6000e+03 6.2995e+00 -1.9500e+03 -1.5714e+03 6.2647e+00 -1.9500e+03 -1.5429e+03 6.2296e+00 -1.9500e+03 -1.5143e+03 6.1942e+00 -1.9500e+03 -1.4857e+03 6.1585e+00 -1.9500e+03 -1.4571e+03 6.1227e+00 -1.9500e+03 -1.4286e+03 6.0866e+00 -1.9500e+03 -1.4000e+03 6.0503e+00 -1.9500e+03 -1.3714e+03 6.0139e+00 -1.9500e+03 -1.3429e+03 5.9773e+00 -1.9500e+03 -1.3143e+03 5.9405e+00 -1.9500e+03 -1.2857e+03 5.9037e+00 -1.9500e+03 -1.2571e+03 5.8667e+00 -1.9500e+03 -1.2286e+03 5.8297e+00 -1.9500e+03 -1.2000e+03 5.7927e+00 -1.9500e+03 -1.1714e+03 5.7556e+00 -1.9500e+03 -1.1429e+03 5.7185e+00 -1.9500e+03 -1.1143e+03 5.6815e+00 -1.9500e+03 -1.0857e+03 5.6446e+00 -1.9500e+03 -1.0571e+03 5.6078e+00 -1.9500e+03 -1.0286e+03 5.5712e+00 -1.9500e+03 -1.0000e+03 5.5348e+00 -1.9500e+03 -9.7143e+02 5.4985e+00 -1.9500e+03 -9.4286e+02 5.4626e+00 -1.9500e+03 -9.1429e+02 5.4270e+00 -1.9500e+03 -8.8571e+02 5.3917e+00 -1.9500e+03 -8.5714e+02 5.3569e+00 -1.9500e+03 -8.2857e+02 5.3225e+00 -1.9500e+03 -8.0000e+02 5.2886e+00 -1.9500e+03 -7.7143e+02 5.2552e+00 -1.9500e+03 -7.4286e+02 5.2225e+00 -1.9500e+03 -7.1429e+02 5.1903e+00 -1.9500e+03 -6.8571e+02 5.1590e+00 -1.9500e+03 -6.5714e+02 5.1283e+00 -1.9500e+03 -6.2857e+02 5.0985e+00 -1.9500e+03 -6.0000e+02 5.0695e+00 -1.9500e+03 -5.7143e+02 5.0414e+00 -1.9500e+03 -5.4286e+02 5.0143e+00 -1.9500e+03 -5.1429e+02 4.9882e+00 -1.9500e+03 -4.8571e+02 4.9632e+00 -1.9500e+03 -4.5714e+02 4.9393e+00 -1.9500e+03 -4.2857e+02 4.9166e+00 -1.9500e+03 -4.0000e+02 4.8951e+00 -1.9500e+03 -3.7143e+02 4.8748e+00 -1.9500e+03 -3.4286e+02 4.8559e+00 -1.9500e+03 -3.1429e+02 4.8383e+00 -1.9500e+03 -2.8571e+02 4.8221e+00 -1.9500e+03 -2.5714e+02 4.8073e+00 -1.9500e+03 -2.2857e+02 4.7939e+00 -1.9500e+03 -2.0000e+02 4.7821e+00 -1.9500e+03 -1.7143e+02 4.7718e+00 -1.9500e+03 -1.4286e+02 4.7630e+00 -1.9500e+03 -1.1429e+02 4.7558e+00 -1.9500e+03 -8.5714e+01 4.7502e+00 -1.9500e+03 -5.7143e+01 4.7462e+00 -1.9500e+03 -2.8571e+01 4.7437e+00 -1.9500e+03 0.0000e+00 4.7429e+00 -1.9500e+03 2.8571e+01 4.7437e+00 -1.9500e+03 5.7143e+01 4.7462e+00 -1.9500e+03 8.5714e+01 4.7502e+00 -1.9500e+03 1.1429e+02 4.7558e+00 -1.9500e+03 1.4286e+02 4.7630e+00 -1.9500e+03 1.7143e+02 4.7718e+00 -1.9500e+03 2.0000e+02 4.7821e+00 -1.9500e+03 2.2857e+02 4.7939e+00 -1.9500e+03 2.5714e+02 4.8073e+00 -1.9500e+03 2.8571e+02 4.8221e+00 -1.9500e+03 3.1429e+02 4.8383e+00 -1.9500e+03 3.4286e+02 4.8559e+00 -1.9500e+03 3.7143e+02 4.8748e+00 -1.9500e+03 4.0000e+02 4.8951e+00 -1.9500e+03 4.2857e+02 4.9166e+00 -1.9500e+03 4.5714e+02 4.9393e+00 -1.9500e+03 4.8571e+02 4.9632e+00 -1.9500e+03 5.1429e+02 4.9882e+00 -1.9500e+03 5.4286e+02 5.0143e+00 -1.9500e+03 5.7143e+02 5.0414e+00 -1.9500e+03 6.0000e+02 5.0695e+00 -1.9500e+03 6.2857e+02 5.0985e+00 -1.9500e+03 6.5714e+02 5.1283e+00 -1.9500e+03 6.8571e+02 5.1590e+00 -1.9500e+03 7.1429e+02 5.1903e+00 -1.9500e+03 7.4286e+02 5.2225e+00 -1.9500e+03 7.7143e+02 5.2552e+00 -1.9500e+03 8.0000e+02 5.2886e+00 -1.9500e+03 8.2857e+02 5.3225e+00 -1.9500e+03 8.5714e+02 5.3569e+00 -1.9500e+03 8.8571e+02 5.3917e+00 -1.9500e+03 9.1429e+02 5.4270e+00 -1.9500e+03 9.4286e+02 5.4626e+00 -1.9500e+03 9.7143e+02 5.4985e+00 -1.9500e+03 1.0000e+03 5.5348e+00 -1.9500e+03 1.0286e+03 5.5712e+00 -1.9500e+03 1.0571e+03 5.6078e+00 -1.9500e+03 1.0857e+03 5.6446e+00 -1.9500e+03 1.1143e+03 5.6815e+00 -1.9500e+03 1.1429e+03 5.7185e+00 -1.9500e+03 1.1714e+03 5.7556e+00 -1.9500e+03 1.2000e+03 5.7927e+00 -1.9500e+03 1.2286e+03 5.8297e+00 -1.9500e+03 1.2571e+03 5.8667e+00 -1.9500e+03 1.2857e+03 5.9037e+00 -1.9500e+03 1.3143e+03 5.9405e+00 -1.9500e+03 1.3429e+03 5.9773e+00 -1.9500e+03 1.3714e+03 6.0139e+00 -1.9500e+03 1.4000e+03 6.0503e+00 -1.9500e+03 1.4286e+03 6.0866e+00 -1.9500e+03 1.4571e+03 6.1227e+00 -1.9500e+03 1.4857e+03 6.1585e+00 -1.9500e+03 1.5143e+03 6.1942e+00 -1.9500e+03 1.5429e+03 6.2296e+00 -1.9500e+03 1.5714e+03 6.2647e+00 -1.9500e+03 1.6000e+03 6.2995e+00 -1.9500e+03 1.6286e+03 6.3341e+00 -1.9500e+03 1.6571e+03 6.3684e+00 -1.9500e+03 1.6857e+03 6.4024e+00 -1.9500e+03 1.7143e+03 6.4361e+00 -1.9500e+03 1.7429e+03 6.4695e+00 -1.9500e+03 1.7714e+03 6.5025e+00 -1.9500e+03 1.8000e+03 6.5353e+00 -1.9500e+03 1.8286e+03 6.5677e+00 -1.9500e+03 1.8571e+03 6.5997e+00 -1.9500e+03 1.8857e+03 6.6314e+00 -1.9500e+03 1.9143e+03 6.6628e+00 -1.9500e+03 1.9429e+03 6.6938e+00 -1.9500e+03 1.9714e+03 6.7245e+00 -1.9500e+03 2.0000e+03 6.7549e+00 -1.9800e+03 -2.0000e+03 6.7856e+00 -1.9800e+03 -1.9714e+03 6.7560e+00 -1.9800e+03 -1.9429e+03 6.7262e+00 -1.9800e+03 -1.9143e+03 6.6960e+00 -1.9800e+03 -1.8857e+03 6.6655e+00 -1.9800e+03 -1.8571e+03 6.6346e+00 -1.9800e+03 -1.8286e+03 6.6035e+00 -1.9800e+03 -1.8000e+03 6.5720e+00 -1.9800e+03 -1.7714e+03 6.5403e+00 -1.9800e+03 -1.7429e+03 6.5082e+00 -1.9800e+03 -1.7143e+03 6.4758e+00 -1.9800e+03 -1.6857e+03 6.4432e+00 -1.9800e+03 -1.6571e+03 6.4103e+00 -1.9800e+03 -1.6286e+03 6.3771e+00 -1.9800e+03 -1.6000e+03 6.3436e+00 -1.9800e+03 -1.5714e+03 6.3099e+00 -1.9800e+03 -1.5429e+03 6.2759e+00 -1.9800e+03 -1.5143e+03 6.2417e+00 -1.9800e+03 -1.4857e+03 6.2073e+00 -1.9800e+03 -1.4571e+03 6.1727e+00 -1.9800e+03 -1.4286e+03 6.1379e+00 -1.9800e+03 -1.4000e+03 6.1029e+00 -1.9800e+03 -1.3714e+03 6.0678e+00 -1.9800e+03 -1.3429e+03 6.0326e+00 -1.9800e+03 -1.3143e+03 5.9972e+00 -1.9800e+03 -1.2857e+03 5.9618e+00 -1.9800e+03 -1.2571e+03 5.9262e+00 -1.9800e+03 -1.2286e+03 5.8907e+00 -1.9800e+03 -1.2000e+03 5.8551e+00 -1.9800e+03 -1.1714e+03 5.8195e+00 -1.9800e+03 -1.1429e+03 5.7840e+00 -1.9800e+03 -1.1143e+03 5.7485e+00 -1.9800e+03 -1.0857e+03 5.7132e+00 -1.9800e+03 -1.0571e+03 5.6780e+00 -1.9800e+03 -1.0286e+03 5.6429e+00 -1.9800e+03 -1.0000e+03 5.6081e+00 -1.9800e+03 -9.7143e+02 5.5734e+00 -1.9800e+03 -9.4286e+02 5.5391e+00 -1.9800e+03 -9.1429e+02 5.5051e+00 -1.9800e+03 -8.8571e+02 5.4715e+00 -1.9800e+03 -8.5714e+02 5.4383e+00 -1.9800e+03 -8.2857e+02 5.4055e+00 -1.9800e+03 -8.0000e+02 5.3732e+00 -1.9800e+03 -7.7143e+02 5.3415e+00 -1.9800e+03 -7.4286e+02 5.3103e+00 -1.9800e+03 -7.1429e+02 5.2798e+00 -1.9800e+03 -6.8571e+02 5.2499e+00 -1.9800e+03 -6.5714e+02 5.2208e+00 -1.9800e+03 -6.2857e+02 5.1925e+00 -1.9800e+03 -6.0000e+02 5.1650e+00 -1.9800e+03 -5.7143e+02 5.1384e+00 -1.9800e+03 -5.4286e+02 5.1127e+00 -1.9800e+03 -5.1429e+02 5.0880e+00 -1.9800e+03 -4.8571e+02 5.0643e+00 -1.9800e+03 -4.5714e+02 5.0417e+00 -1.9800e+03 -4.2857e+02 5.0202e+00 -1.9800e+03 -4.0000e+02 4.9999e+00 -1.9800e+03 -3.7143e+02 4.9807e+00 -1.9800e+03 -3.4286e+02 4.9628e+00 -1.9800e+03 -3.1429e+02 4.9462e+00 -1.9800e+03 -2.8571e+02 4.9309e+00 -1.9800e+03 -2.5714e+02 4.9169e+00 -1.9800e+03 -2.2857e+02 4.9043e+00 -1.9800e+03 -2.0000e+02 4.8932e+00 -1.9800e+03 -1.7143e+02 4.8834e+00 -1.9800e+03 -1.4286e+02 4.8751e+00 -1.9800e+03 -1.1429e+02 4.8683e+00 -1.9800e+03 -8.5714e+01 4.8630e+00 -1.9800e+03 -5.7143e+01 4.8592e+00 -1.9800e+03 -2.8571e+01 4.8570e+00 -1.9800e+03 0.0000e+00 4.8562e+00 -1.9800e+03 2.8571e+01 4.8570e+00 -1.9800e+03 5.7143e+01 4.8592e+00 -1.9800e+03 8.5714e+01 4.8630e+00 -1.9800e+03 1.1429e+02 4.8683e+00 -1.9800e+03 1.4286e+02 4.8751e+00 -1.9800e+03 1.7143e+02 4.8834e+00 -1.9800e+03 2.0000e+02 4.8932e+00 -1.9800e+03 2.2857e+02 4.9043e+00 -1.9800e+03 2.5714e+02 4.9169e+00 -1.9800e+03 2.8571e+02 4.9309e+00 -1.9800e+03 3.1429e+02 4.9462e+00 -1.9800e+03 3.4286e+02 4.9628e+00 -1.9800e+03 3.7143e+02 4.9807e+00 -1.9800e+03 4.0000e+02 4.9999e+00 -1.9800e+03 4.2857e+02 5.0202e+00 -1.9800e+03 4.5714e+02 5.0417e+00 -1.9800e+03 4.8571e+02 5.0643e+00 -1.9800e+03 5.1429e+02 5.0880e+00 -1.9800e+03 5.4286e+02 5.1127e+00 -1.9800e+03 5.7143e+02 5.1384e+00 -1.9800e+03 6.0000e+02 5.1650e+00 -1.9800e+03 6.2857e+02 5.1925e+00 -1.9800e+03 6.5714e+02 5.2208e+00 -1.9800e+03 6.8571e+02 5.2499e+00 -1.9800e+03 7.1429e+02 5.2798e+00 -1.9800e+03 7.4286e+02 5.3103e+00 -1.9800e+03 7.7143e+02 5.3415e+00 -1.9800e+03 8.0000e+02 5.3732e+00 -1.9800e+03 8.2857e+02 5.4055e+00 -1.9800e+03 8.5714e+02 5.4383e+00 -1.9800e+03 8.8571e+02 5.4715e+00 -1.9800e+03 9.1429e+02 5.5051e+00 -1.9800e+03 9.4286e+02 5.5391e+00 -1.9800e+03 9.7143e+02 5.5734e+00 -1.9800e+03 1.0000e+03 5.6081e+00 -1.9800e+03 1.0286e+03 5.6429e+00 -1.9800e+03 1.0571e+03 5.6780e+00 -1.9800e+03 1.0857e+03 5.7132e+00 -1.9800e+03 1.1143e+03 5.7485e+00 -1.9800e+03 1.1429e+03 5.7840e+00 -1.9800e+03 1.1714e+03 5.8195e+00 -1.9800e+03 1.2000e+03 5.8551e+00 -1.9800e+03 1.2286e+03 5.8907e+00 -1.9800e+03 1.2571e+03 5.9262e+00 -1.9800e+03 1.2857e+03 5.9618e+00 -1.9800e+03 1.3143e+03 5.9972e+00 -1.9800e+03 1.3429e+03 6.0326e+00 -1.9800e+03 1.3714e+03 6.0678e+00 -1.9800e+03 1.4000e+03 6.1029e+00 -1.9800e+03 1.4286e+03 6.1379e+00 -1.9800e+03 1.4571e+03 6.1727e+00 -1.9800e+03 1.4857e+03 6.2073e+00 -1.9800e+03 1.5143e+03 6.2417e+00 -1.9800e+03 1.5429e+03 6.2759e+00 -1.9800e+03 1.5714e+03 6.3099e+00 -1.9800e+03 1.6000e+03 6.3436e+00 -1.9800e+03 1.6286e+03 6.3771e+00 -1.9800e+03 1.6571e+03 6.4103e+00 -1.9800e+03 1.6857e+03 6.4432e+00 -1.9800e+03 1.7143e+03 6.4758e+00 -1.9800e+03 1.7429e+03 6.5082e+00 -1.9800e+03 1.7714e+03 6.5403e+00 -1.9800e+03 1.8000e+03 6.5720e+00 -1.9800e+03 1.8286e+03 6.6035e+00 -1.9800e+03 1.8571e+03 6.6346e+00 -1.9800e+03 1.8857e+03 6.6655e+00 -1.9800e+03 1.9143e+03 6.6960e+00 -1.9800e+03 1.9429e+03 6.7262e+00 -1.9800e+03 1.9714e+03 6.7560e+00 -1.9800e+03 2.0000e+03 6.7856e+00 -2.0100e+03 -2.0000e+03 6.8159e+00 -2.0100e+03 -1.9714e+03 6.7872e+00 -2.0100e+03 -1.9429e+03 6.7581e+00 -2.0100e+03 -1.9143e+03 6.7287e+00 -2.0100e+03 -1.8857e+03 6.6991e+00 -2.0100e+03 -1.8571e+03 6.6691e+00 -2.0100e+03 -1.8286e+03 6.6388e+00 -2.0100e+03 -1.8000e+03 6.6083e+00 -2.0100e+03 -1.7714e+03 6.5775e+00 -2.0100e+03 -1.7429e+03 6.5463e+00 -2.0100e+03 -1.7143e+03 6.5150e+00 -2.0100e+03 -1.6857e+03 6.4833e+00 -2.0100e+03 -1.6571e+03 6.4514e+00 -2.0100e+03 -1.6286e+03 6.4193e+00 -2.0100e+03 -1.6000e+03 6.3869e+00 -2.0100e+03 -1.5714e+03 6.3542e+00 -2.0100e+03 -1.5429e+03 6.3214e+00 -2.0100e+03 -1.5143e+03 6.2884e+00 -2.0100e+03 -1.4857e+03 6.2551e+00 -2.0100e+03 -1.4571e+03 6.2217e+00 -2.0100e+03 -1.4286e+03 6.1881e+00 -2.0100e+03 -1.4000e+03 6.1544e+00 -2.0100e+03 -1.3714e+03 6.1206e+00 -2.0100e+03 -1.3429e+03 6.0866e+00 -2.0100e+03 -1.3143e+03 6.0526e+00 -2.0100e+03 -1.2857e+03 6.0185e+00 -2.0100e+03 -1.2571e+03 5.9843e+00 -2.0100e+03 -1.2286e+03 5.9501e+00 -2.0100e+03 -1.2000e+03 5.9160e+00 -2.0100e+03 -1.1714e+03 5.8818e+00 -2.0100e+03 -1.1429e+03 5.8477e+00 -2.0100e+03 -1.1143e+03 5.8137e+00 -2.0100e+03 -1.0857e+03 5.7798e+00 -2.0100e+03 -1.0571e+03 5.7461e+00 -2.0100e+03 -1.0286e+03 5.7125e+00 -2.0100e+03 -1.0000e+03 5.6792e+00 -2.0100e+03 -9.7143e+02 5.6461e+00 -2.0100e+03 -9.4286e+02 5.6133e+00 -2.0100e+03 -9.1429e+02 5.5808e+00 -2.0100e+03 -8.8571e+02 5.5487e+00 -2.0100e+03 -8.5714e+02 5.5170e+00 -2.0100e+03 -8.2857e+02 5.4858e+00 -2.0100e+03 -8.0000e+02 5.4550e+00 -2.0100e+03 -7.7143e+02 5.4248e+00 -2.0100e+03 -7.4286e+02 5.3951e+00 -2.0100e+03 -7.1429e+02 5.3661e+00 -2.0100e+03 -6.8571e+02 5.3377e+00 -2.0100e+03 -6.5714e+02 5.3101e+00 -2.0100e+03 -6.2857e+02 5.2832e+00 -2.0100e+03 -6.0000e+02 5.2571e+00 -2.0100e+03 -5.7143e+02 5.2318e+00 -2.0100e+03 -5.4286e+02 5.2075e+00 -2.0100e+03 -5.1429e+02 5.1840e+00 -2.0100e+03 -4.8571e+02 5.1616e+00 -2.0100e+03 -4.5714e+02 5.1401e+00 -2.0100e+03 -4.2857e+02 5.1198e+00 -2.0100e+03 -4.0000e+02 5.1005e+00 -2.0100e+03 -3.7143e+02 5.0824e+00 -2.0100e+03 -3.4286e+02 5.0654e+00 -2.0100e+03 -3.1429e+02 5.0497e+00 -2.0100e+03 -2.8571e+02 5.0352e+00 -2.0100e+03 -2.5714e+02 5.0220e+00 -2.0100e+03 -2.2857e+02 5.0102e+00 -2.0100e+03 -2.0000e+02 4.9996e+00 -2.0100e+03 -1.7143e+02 4.9904e+00 -2.0100e+03 -1.4286e+02 4.9826e+00 -2.0100e+03 -1.1429e+02 4.9762e+00 -2.0100e+03 -8.5714e+01 4.9712e+00 -2.0100e+03 -5.7143e+01 4.9676e+00 -2.0100e+03 -2.8571e+01 4.9654e+00 -2.0100e+03 0.0000e+00 4.9647e+00 -2.0100e+03 2.8571e+01 4.9654e+00 -2.0100e+03 5.7143e+01 4.9676e+00 -2.0100e+03 8.5714e+01 4.9712e+00 -2.0100e+03 1.1429e+02 4.9762e+00 -2.0100e+03 1.4286e+02 4.9826e+00 -2.0100e+03 1.7143e+02 4.9904e+00 -2.0100e+03 2.0000e+02 4.9996e+00 -2.0100e+03 2.2857e+02 5.0102e+00 -2.0100e+03 2.5714e+02 5.0220e+00 -2.0100e+03 2.8571e+02 5.0352e+00 -2.0100e+03 3.1429e+02 5.0497e+00 -2.0100e+03 3.4286e+02 5.0654e+00 -2.0100e+03 3.7143e+02 5.0824e+00 -2.0100e+03 4.0000e+02 5.1005e+00 -2.0100e+03 4.2857e+02 5.1198e+00 -2.0100e+03 4.5714e+02 5.1401e+00 -2.0100e+03 4.8571e+02 5.1616e+00 -2.0100e+03 5.1429e+02 5.1840e+00 -2.0100e+03 5.4286e+02 5.2075e+00 -2.0100e+03 5.7143e+02 5.2318e+00 -2.0100e+03 6.0000e+02 5.2571e+00 -2.0100e+03 6.2857e+02 5.2832e+00 -2.0100e+03 6.5714e+02 5.3101e+00 -2.0100e+03 6.8571e+02 5.3377e+00 -2.0100e+03 7.1429e+02 5.3661e+00 -2.0100e+03 7.4286e+02 5.3951e+00 -2.0100e+03 7.7143e+02 5.4248e+00 -2.0100e+03 8.0000e+02 5.4550e+00 -2.0100e+03 8.2857e+02 5.4858e+00 -2.0100e+03 8.5714e+02 5.5170e+00 -2.0100e+03 8.8571e+02 5.5487e+00 -2.0100e+03 9.1429e+02 5.5808e+00 -2.0100e+03 9.4286e+02 5.6133e+00 -2.0100e+03 9.7143e+02 5.6461e+00 -2.0100e+03 1.0000e+03 5.6792e+00 -2.0100e+03 1.0286e+03 5.7125e+00 -2.0100e+03 1.0571e+03 5.7461e+00 -2.0100e+03 1.0857e+03 5.7798e+00 -2.0100e+03 1.1143e+03 5.8137e+00 -2.0100e+03 1.1429e+03 5.8477e+00 -2.0100e+03 1.1714e+03 5.8818e+00 -2.0100e+03 1.2000e+03 5.9160e+00 -2.0100e+03 1.2286e+03 5.9501e+00 -2.0100e+03 1.2571e+03 5.9843e+00 -2.0100e+03 1.2857e+03 6.0185e+00 -2.0100e+03 1.3143e+03 6.0526e+00 -2.0100e+03 1.3429e+03 6.0866e+00 -2.0100e+03 1.3714e+03 6.1206e+00 -2.0100e+03 1.4000e+03 6.1544e+00 -2.0100e+03 1.4286e+03 6.1881e+00 -2.0100e+03 1.4571e+03 6.2217e+00 -2.0100e+03 1.4857e+03 6.2551e+00 -2.0100e+03 1.5143e+03 6.2884e+00 -2.0100e+03 1.5429e+03 6.3214e+00 -2.0100e+03 1.5714e+03 6.3542e+00 -2.0100e+03 1.6000e+03 6.3869e+00 -2.0100e+03 1.6286e+03 6.4193e+00 -2.0100e+03 1.6571e+03 6.4514e+00 -2.0100e+03 1.6857e+03 6.4833e+00 -2.0100e+03 1.7143e+03 6.5150e+00 -2.0100e+03 1.7429e+03 6.5463e+00 -2.0100e+03 1.7714e+03 6.5775e+00 -2.0100e+03 1.8000e+03 6.6083e+00 -2.0100e+03 1.8286e+03 6.6388e+00 -2.0100e+03 1.8571e+03 6.6691e+00 -2.0100e+03 1.8857e+03 6.6991e+00 -2.0100e+03 1.9143e+03 6.7287e+00 -2.0100e+03 1.9429e+03 6.7581e+00 -2.0100e+03 1.9714e+03 6.7872e+00 -2.0100e+03 2.0000e+03 6.8159e+00 -2.0400e+03 -2.0000e+03 6.8459e+00 -2.0400e+03 -1.9714e+03 6.8179e+00 -2.0400e+03 -1.9429e+03 6.7897e+00 -2.0400e+03 -1.9143e+03 6.7611e+00 -2.0400e+03 -1.8857e+03 6.7322e+00 -2.0400e+03 -1.8571e+03 6.7031e+00 -2.0400e+03 -1.8286e+03 6.6737e+00 -2.0400e+03 -1.8000e+03 6.6440e+00 -2.0400e+03 -1.7714e+03 6.6141e+00 -2.0400e+03 -1.7429e+03 6.5839e+00 -2.0400e+03 -1.7143e+03 6.5535e+00 -2.0400e+03 -1.6857e+03 6.5228e+00 -2.0400e+03 -1.6571e+03 6.4919e+00 -2.0400e+03 -1.6286e+03 6.4607e+00 -2.0400e+03 -1.6000e+03 6.4294e+00 -2.0400e+03 -1.5714e+03 6.3978e+00 -2.0400e+03 -1.5429e+03 6.3660e+00 -2.0400e+03 -1.5143e+03 6.3341e+00 -2.0400e+03 -1.4857e+03 6.3020e+00 -2.0400e+03 -1.4571e+03 6.2697e+00 -2.0400e+03 -1.4286e+03 6.2373e+00 -2.0400e+03 -1.4000e+03 6.2048e+00 -2.0400e+03 -1.3714e+03 6.1722e+00 -2.0400e+03 -1.3429e+03 6.1395e+00 -2.0400e+03 -1.3143e+03 6.1067e+00 -2.0400e+03 -1.2857e+03 6.0738e+00 -2.0400e+03 -1.2571e+03 6.0410e+00 -2.0400e+03 -1.2286e+03 6.0081e+00 -2.0400e+03 -1.2000e+03 5.9753e+00 -2.0400e+03 -1.1714e+03 5.9425e+00 -2.0400e+03 -1.1429e+03 5.9098e+00 -2.0400e+03 -1.1143e+03 5.8772e+00 -2.0400e+03 -1.0857e+03 5.8447e+00 -2.0400e+03 -1.0571e+03 5.8123e+00 -2.0400e+03 -1.0286e+03 5.7802e+00 -2.0400e+03 -1.0000e+03 5.7483e+00 -2.0400e+03 -9.7143e+02 5.7166e+00 -2.0400e+03 -9.4286e+02 5.6853e+00 -2.0400e+03 -9.1429e+02 5.6543e+00 -2.0400e+03 -8.8571e+02 5.6236e+00 -2.0400e+03 -8.5714e+02 5.5933e+00 -2.0400e+03 -8.2857e+02 5.5635e+00 -2.0400e+03 -8.0000e+02 5.5342e+00 -2.0400e+03 -7.7143e+02 5.5054e+00 -2.0400e+03 -7.4286e+02 5.4771e+00 -2.0400e+03 -7.1429e+02 5.4495e+00 -2.0400e+03 -6.8571e+02 5.4225e+00 -2.0400e+03 -6.5714e+02 5.3962e+00 -2.0400e+03 -6.2857e+02 5.3706e+00 -2.0400e+03 -6.0000e+02 5.3458e+00 -2.0400e+03 -5.7143e+02 5.3218e+00 -2.0400e+03 -5.4286e+02 5.2987e+00 -2.0400e+03 -5.1429e+02 5.2764e+00 -2.0400e+03 -4.8571e+02 5.2551e+00 -2.0400e+03 -4.5714e+02 5.2348e+00 -2.0400e+03 -4.2857e+02 5.2155e+00 -2.0400e+03 -4.0000e+02 5.1973e+00 -2.0400e+03 -3.7143e+02 5.1801e+00 -2.0400e+03 -3.4286e+02 5.1640e+00 -2.0400e+03 -3.1429e+02 5.1492e+00 -2.0400e+03 -2.8571e+02 5.1355e+00 -2.0400e+03 -2.5714e+02 5.1230e+00 -2.0400e+03 -2.2857e+02 5.1117e+00 -2.0400e+03 -2.0000e+02 5.1017e+00 -2.0400e+03 -1.7143e+02 5.0930e+00 -2.0400e+03 -1.4286e+02 5.0857e+00 -2.0400e+03 -1.1429e+02 5.0796e+00 -2.0400e+03 -8.5714e+01 5.0748e+00 -2.0400e+03 -5.7143e+01 5.0715e+00 -2.0400e+03 -2.8571e+01 5.0694e+00 -2.0400e+03 0.0000e+00 5.0687e+00 -2.0400e+03 2.8571e+01 5.0694e+00 -2.0400e+03 5.7143e+01 5.0715e+00 -2.0400e+03 8.5714e+01 5.0748e+00 -2.0400e+03 1.1429e+02 5.0796e+00 -2.0400e+03 1.4286e+02 5.0857e+00 -2.0400e+03 1.7143e+02 5.0930e+00 -2.0400e+03 2.0000e+02 5.1017e+00 -2.0400e+03 2.2857e+02 5.1117e+00 -2.0400e+03 2.5714e+02 5.1230e+00 -2.0400e+03 2.8571e+02 5.1355e+00 -2.0400e+03 3.1429e+02 5.1492e+00 -2.0400e+03 3.4286e+02 5.1640e+00 -2.0400e+03 3.7143e+02 5.1801e+00 -2.0400e+03 4.0000e+02 5.1973e+00 -2.0400e+03 4.2857e+02 5.2155e+00 -2.0400e+03 4.5714e+02 5.2348e+00 -2.0400e+03 4.8571e+02 5.2551e+00 -2.0400e+03 5.1429e+02 5.2764e+00 -2.0400e+03 5.4286e+02 5.2987e+00 -2.0400e+03 5.7143e+02 5.3218e+00 -2.0400e+03 6.0000e+02 5.3458e+00 -2.0400e+03 6.2857e+02 5.3706e+00 -2.0400e+03 6.5714e+02 5.3962e+00 -2.0400e+03 6.8571e+02 5.4225e+00 -2.0400e+03 7.1429e+02 5.4495e+00 -2.0400e+03 7.4286e+02 5.4771e+00 -2.0400e+03 7.7143e+02 5.5054e+00 -2.0400e+03 8.0000e+02 5.5342e+00 -2.0400e+03 8.2857e+02 5.5635e+00 -2.0400e+03 8.5714e+02 5.5933e+00 -2.0400e+03 8.8571e+02 5.6236e+00 -2.0400e+03 9.1429e+02 5.6543e+00 -2.0400e+03 9.4286e+02 5.6853e+00 -2.0400e+03 9.7143e+02 5.7166e+00 -2.0400e+03 1.0000e+03 5.7483e+00 -2.0400e+03 1.0286e+03 5.7802e+00 -2.0400e+03 1.0571e+03 5.8123e+00 -2.0400e+03 1.0857e+03 5.8447e+00 -2.0400e+03 1.1143e+03 5.8772e+00 -2.0400e+03 1.1429e+03 5.9098e+00 -2.0400e+03 1.1714e+03 5.9425e+00 -2.0400e+03 1.2000e+03 5.9753e+00 -2.0400e+03 1.2286e+03 6.0081e+00 -2.0400e+03 1.2571e+03 6.0410e+00 -2.0400e+03 1.2857e+03 6.0738e+00 -2.0400e+03 1.3143e+03 6.1067e+00 -2.0400e+03 1.3429e+03 6.1395e+00 -2.0400e+03 1.3714e+03 6.1722e+00 -2.0400e+03 1.4000e+03 6.2048e+00 -2.0400e+03 1.4286e+03 6.2373e+00 -2.0400e+03 1.4571e+03 6.2697e+00 -2.0400e+03 1.4857e+03 6.3020e+00 -2.0400e+03 1.5143e+03 6.3341e+00 -2.0400e+03 1.5429e+03 6.3660e+00 -2.0400e+03 1.5714e+03 6.3978e+00 -2.0400e+03 1.6000e+03 6.4294e+00 -2.0400e+03 1.6286e+03 6.4607e+00 -2.0400e+03 1.6571e+03 6.4919e+00 -2.0400e+03 1.6857e+03 6.5228e+00 -2.0400e+03 1.7143e+03 6.5535e+00 -2.0400e+03 1.7429e+03 6.5839e+00 -2.0400e+03 1.7714e+03 6.6141e+00 -2.0400e+03 1.8000e+03 6.6440e+00 -2.0400e+03 1.8286e+03 6.6737e+00 -2.0400e+03 1.8571e+03 6.7031e+00 -2.0400e+03 1.8857e+03 6.7322e+00 -2.0400e+03 1.9143e+03 6.7611e+00 -2.0400e+03 1.9429e+03 6.7897e+00 -2.0400e+03 1.9714e+03 6.8179e+00 -2.0400e+03 2.0000e+03 6.8459e+00 -2.0700e+03 -2.0000e+03 6.8756e+00 -2.0700e+03 -1.9714e+03 6.8483e+00 -2.0700e+03 -1.9429e+03 6.8208e+00 -2.0700e+03 -1.9143e+03 6.7930e+00 -2.0700e+03 -1.8857e+03 6.7649e+00 -2.0700e+03 -1.8571e+03 6.7366e+00 -2.0700e+03 -1.8286e+03 6.7080e+00 -2.0700e+03 -1.8000e+03 6.6792e+00 -2.0700e+03 -1.7714e+03 6.6502e+00 -2.0700e+03 -1.7429e+03 6.6209e+00 -2.0700e+03 -1.7143e+03 6.5913e+00 -2.0700e+03 -1.6857e+03 6.5616e+00 -2.0700e+03 -1.6571e+03 6.5316e+00 -2.0700e+03 -1.6286e+03 6.5015e+00 -2.0700e+03 -1.6000e+03 6.4711e+00 -2.0700e+03 -1.5714e+03 6.4406e+00 -2.0700e+03 -1.5429e+03 6.4098e+00 -2.0700e+03 -1.5143e+03 6.3790e+00 -2.0700e+03 -1.4857e+03 6.3479e+00 -2.0700e+03 -1.4571e+03 6.3168e+00 -2.0700e+03 -1.4286e+03 6.2855e+00 -2.0700e+03 -1.4000e+03 6.2541e+00 -2.0700e+03 -1.3714e+03 6.2227e+00 -2.0700e+03 -1.3429e+03 6.1911e+00 -2.0700e+03 -1.3143e+03 6.1595e+00 -2.0700e+03 -1.2857e+03 6.1279e+00 -2.0700e+03 -1.2571e+03 6.0963e+00 -2.0700e+03 -1.2286e+03 6.0647e+00 -2.0700e+03 -1.2000e+03 6.0331e+00 -2.0700e+03 -1.1714e+03 6.0016e+00 -2.0700e+03 -1.1429e+03 5.9702e+00 -2.0700e+03 -1.1143e+03 5.9389e+00 -2.0700e+03 -1.0857e+03 5.9077e+00 -2.0700e+03 -1.0571e+03 5.8768e+00 -2.0700e+03 -1.0286e+03 5.8460e+00 -2.0700e+03 -1.0000e+03 5.8154e+00 -2.0700e+03 -9.7143e+02 5.7851e+00 -2.0700e+03 -9.4286e+02 5.7551e+00 -2.0700e+03 -9.1429e+02 5.7254e+00 -2.0700e+03 -8.8571e+02 5.6961e+00 -2.0700e+03 -8.5714e+02 5.6672e+00 -2.0700e+03 -8.2857e+02 5.6388e+00 -2.0700e+03 -8.0000e+02 5.6108e+00 -2.0700e+03 -7.7143e+02 5.5833e+00 -2.0700e+03 -7.4286e+02 5.5564e+00 -2.0700e+03 -7.1429e+02 5.5300e+00 -2.0700e+03 -6.8571e+02 5.5043e+00 -2.0700e+03 -6.5714e+02 5.4793e+00 -2.0700e+03 -6.2857e+02 5.4550e+00 -2.0700e+03 -6.0000e+02 5.4314e+00 -2.0700e+03 -5.7143e+02 5.4086e+00 -2.0700e+03 -5.4286e+02 5.3866e+00 -2.0700e+03 -5.1429e+02 5.3655e+00 -2.0700e+03 -4.8571e+02 5.3452e+00 -2.0700e+03 -4.5714e+02 5.3260e+00 -2.0700e+03 -4.2857e+02 5.3076e+00 -2.0700e+03 -4.0000e+02 5.2903e+00 -2.0700e+03 -3.7143e+02 5.2740e+00 -2.0700e+03 -3.4286e+02 5.2588e+00 -2.0700e+03 -3.1429e+02 5.2447e+00 -2.0700e+03 -2.8571e+02 5.2317e+00 -2.0700e+03 -2.5714e+02 5.2199e+00 -2.0700e+03 -2.2857e+02 5.2093e+00 -2.0700e+03 -2.0000e+02 5.1998e+00 -2.0700e+03 -1.7143e+02 5.1916e+00 -2.0700e+03 -1.4286e+02 5.1846e+00 -2.0700e+03 -1.1429e+02 5.1788e+00 -2.0700e+03 -8.5714e+01 5.1744e+00 -2.0700e+03 -5.7143e+01 5.1712e+00 -2.0700e+03 -2.8571e+01 5.1692e+00 -2.0700e+03 0.0000e+00 5.1686e+00 -2.0700e+03 2.8571e+01 5.1692e+00 -2.0700e+03 5.7143e+01 5.1712e+00 -2.0700e+03 8.5714e+01 5.1744e+00 -2.0700e+03 1.1429e+02 5.1788e+00 -2.0700e+03 1.4286e+02 5.1846e+00 -2.0700e+03 1.7143e+02 5.1916e+00 -2.0700e+03 2.0000e+02 5.1998e+00 -2.0700e+03 2.2857e+02 5.2093e+00 -2.0700e+03 2.5714e+02 5.2199e+00 -2.0700e+03 2.8571e+02 5.2317e+00 -2.0700e+03 3.1429e+02 5.2447e+00 -2.0700e+03 3.4286e+02 5.2588e+00 -2.0700e+03 3.7143e+02 5.2740e+00 -2.0700e+03 4.0000e+02 5.2903e+00 -2.0700e+03 4.2857e+02 5.3076e+00 -2.0700e+03 4.5714e+02 5.3260e+00 -2.0700e+03 4.8571e+02 5.3452e+00 -2.0700e+03 5.1429e+02 5.3655e+00 -2.0700e+03 5.4286e+02 5.3866e+00 -2.0700e+03 5.7143e+02 5.4086e+00 -2.0700e+03 6.0000e+02 5.4314e+00 -2.0700e+03 6.2857e+02 5.4550e+00 -2.0700e+03 6.5714e+02 5.4793e+00 -2.0700e+03 6.8571e+02 5.5043e+00 -2.0700e+03 7.1429e+02 5.5300e+00 -2.0700e+03 7.4286e+02 5.5564e+00 -2.0700e+03 7.7143e+02 5.5833e+00 -2.0700e+03 8.0000e+02 5.6108e+00 -2.0700e+03 8.2857e+02 5.6388e+00 -2.0700e+03 8.5714e+02 5.6672e+00 -2.0700e+03 8.8571e+02 5.6961e+00 -2.0700e+03 9.1429e+02 5.7254e+00 -2.0700e+03 9.4286e+02 5.7551e+00 -2.0700e+03 9.7143e+02 5.7851e+00 -2.0700e+03 1.0000e+03 5.8154e+00 -2.0700e+03 1.0286e+03 5.8460e+00 -2.0700e+03 1.0571e+03 5.8768e+00 -2.0700e+03 1.0857e+03 5.9077e+00 -2.0700e+03 1.1143e+03 5.9389e+00 -2.0700e+03 1.1429e+03 5.9702e+00 -2.0700e+03 1.1714e+03 6.0016e+00 -2.0700e+03 1.2000e+03 6.0331e+00 -2.0700e+03 1.2286e+03 6.0647e+00 -2.0700e+03 1.2571e+03 6.0963e+00 -2.0700e+03 1.2857e+03 6.1279e+00 -2.0700e+03 1.3143e+03 6.1595e+00 -2.0700e+03 1.3429e+03 6.1911e+00 -2.0700e+03 1.3714e+03 6.2227e+00 -2.0700e+03 1.4000e+03 6.2541e+00 -2.0700e+03 1.4286e+03 6.2855e+00 -2.0700e+03 1.4571e+03 6.3168e+00 -2.0700e+03 1.4857e+03 6.3479e+00 -2.0700e+03 1.5143e+03 6.3790e+00 -2.0700e+03 1.5429e+03 6.4098e+00 -2.0700e+03 1.5714e+03 6.4406e+00 -2.0700e+03 1.6000e+03 6.4711e+00 -2.0700e+03 1.6286e+03 6.5015e+00 -2.0700e+03 1.6571e+03 6.5316e+00 -2.0700e+03 1.6857e+03 6.5616e+00 -2.0700e+03 1.7143e+03 6.5913e+00 -2.0700e+03 1.7429e+03 6.6209e+00 -2.0700e+03 1.7714e+03 6.6502e+00 -2.0700e+03 1.8000e+03 6.6792e+00 -2.0700e+03 1.8286e+03 6.7080e+00 -2.0700e+03 1.8571e+03 6.7366e+00 -2.0700e+03 1.8857e+03 6.7649e+00 -2.0700e+03 1.9143e+03 6.7930e+00 -2.0700e+03 1.9429e+03 6.8208e+00 -2.0700e+03 1.9714e+03 6.8483e+00 -2.0700e+03 2.0000e+03 6.8756e+00 -2.1000e+03 -2.0000e+03 6.9049e+00 -2.1000e+03 -1.9714e+03 6.8784e+00 -2.1000e+03 -1.9429e+03 6.8516e+00 -2.1000e+03 -1.9143e+03 6.8245e+00 -2.1000e+03 -1.8857e+03 6.7972e+00 -2.1000e+03 -1.8571e+03 6.7697e+00 -2.1000e+03 -1.8286e+03 6.7419e+00 -2.1000e+03 -1.8000e+03 6.7139e+00 -2.1000e+03 -1.7714e+03 6.6857e+00 -2.1000e+03 -1.7429e+03 6.6573e+00 -2.1000e+03 -1.7143e+03 6.6286e+00 -2.1000e+03 -1.6857e+03 6.5998e+00 -2.1000e+03 -1.6571e+03 6.5707e+00 -2.1000e+03 -1.6286e+03 6.5415e+00 -2.1000e+03 -1.6000e+03 6.5121e+00 -2.1000e+03 -1.5714e+03 6.4825e+00 -2.1000e+03 -1.5429e+03 6.4528e+00 -2.1000e+03 -1.5143e+03 6.4230e+00 -2.1000e+03 -1.4857e+03 6.3930e+00 -2.1000e+03 -1.4571e+03 6.3629e+00 -2.1000e+03 -1.4286e+03 6.3327e+00 -2.1000e+03 -1.4000e+03 6.3024e+00 -2.1000e+03 -1.3714e+03 6.2720e+00 -2.1000e+03 -1.3429e+03 6.2416e+00 -2.1000e+03 -1.3143e+03 6.2112e+00 -2.1000e+03 -1.2857e+03 6.1808e+00 -2.1000e+03 -1.2571e+03 6.1503e+00 -2.1000e+03 -1.2286e+03 6.1199e+00 -2.1000e+03 -1.2000e+03 6.0896e+00 -2.1000e+03 -1.1714e+03 6.0593e+00 -2.1000e+03 -1.1429e+03 6.0291e+00 -2.1000e+03 -1.1143e+03 5.9990e+00 -2.1000e+03 -1.0857e+03 5.9691e+00 -2.1000e+03 -1.0571e+03 5.9394e+00 -2.1000e+03 -1.0286e+03 5.9099e+00 -2.1000e+03 -1.0000e+03 5.8806e+00 -2.1000e+03 -9.7143e+02 5.8516e+00 -2.1000e+03 -9.4286e+02 5.8229e+00 -2.1000e+03 -9.1429e+02 5.7945e+00 -2.1000e+03 -8.8571e+02 5.7665e+00 -2.1000e+03 -8.5714e+02 5.7389e+00 -2.1000e+03 -8.2857e+02 5.7117e+00 -2.1000e+03 -8.0000e+02 5.6849e+00 -2.1000e+03 -7.7143e+02 5.6587e+00 -2.1000e+03 -7.4286e+02 5.6330e+00 -2.1000e+03 -7.1429e+02 5.6079e+00 -2.1000e+03 -6.8571e+02 5.5834e+00 -2.1000e+03 -6.5714e+02 5.5596e+00 -2.1000e+03 -6.2857e+02 5.5364e+00 -2.1000e+03 -6.0000e+02 5.5140e+00 -2.1000e+03 -5.7143e+02 5.4923e+00 -2.1000e+03 -5.4286e+02 5.4714e+00 -2.1000e+03 -5.1429e+02 5.4513e+00 -2.1000e+03 -4.8571e+02 5.4321e+00 -2.1000e+03 -4.5714e+02 5.4137e+00 -2.1000e+03 -4.2857e+02 5.3963e+00 -2.1000e+03 -4.0000e+02 5.3799e+00 -2.1000e+03 -3.7143e+02 5.3645e+00 -2.1000e+03 -3.4286e+02 5.3500e+00 -2.1000e+03 -3.1429e+02 5.3366e+00 -2.1000e+03 -2.8571e+02 5.3243e+00 -2.1000e+03 -2.5714e+02 5.3131e+00 -2.1000e+03 -2.2857e+02 5.3030e+00 -2.1000e+03 -2.0000e+02 5.2941e+00 -2.1000e+03 -1.7143e+02 5.2863e+00 -2.1000e+03 -1.4286e+02 5.2796e+00 -2.1000e+03 -1.1429e+02 5.2742e+00 -2.1000e+03 -8.5714e+01 5.2700e+00 -2.1000e+03 -5.7143e+01 5.2669e+00 -2.1000e+03 -2.8571e+01 5.2651e+00 -2.1000e+03 0.0000e+00 5.2645e+00 -2.1000e+03 2.8571e+01 5.2651e+00 -2.1000e+03 5.7143e+01 5.2669e+00 -2.1000e+03 8.5714e+01 5.2700e+00 -2.1000e+03 1.1429e+02 5.2742e+00 -2.1000e+03 1.4286e+02 5.2796e+00 -2.1000e+03 1.7143e+02 5.2863e+00 -2.1000e+03 2.0000e+02 5.2941e+00 -2.1000e+03 2.2857e+02 5.3030e+00 -2.1000e+03 2.5714e+02 5.3131e+00 -2.1000e+03 2.8571e+02 5.3243e+00 -2.1000e+03 3.1429e+02 5.3366e+00 -2.1000e+03 3.4286e+02 5.3500e+00 -2.1000e+03 3.7143e+02 5.3645e+00 -2.1000e+03 4.0000e+02 5.3799e+00 -2.1000e+03 4.2857e+02 5.3963e+00 -2.1000e+03 4.5714e+02 5.4137e+00 -2.1000e+03 4.8571e+02 5.4321e+00 -2.1000e+03 5.1429e+02 5.4513e+00 -2.1000e+03 5.4286e+02 5.4714e+00 -2.1000e+03 5.7143e+02 5.4923e+00 -2.1000e+03 6.0000e+02 5.5140e+00 -2.1000e+03 6.2857e+02 5.5364e+00 -2.1000e+03 6.5714e+02 5.5596e+00 -2.1000e+03 6.8571e+02 5.5834e+00 -2.1000e+03 7.1429e+02 5.6079e+00 -2.1000e+03 7.4286e+02 5.6330e+00 -2.1000e+03 7.7143e+02 5.6587e+00 -2.1000e+03 8.0000e+02 5.6849e+00 -2.1000e+03 8.2857e+02 5.7117e+00 -2.1000e+03 8.5714e+02 5.7389e+00 -2.1000e+03 8.8571e+02 5.7665e+00 -2.1000e+03 9.1429e+02 5.7945e+00 -2.1000e+03 9.4286e+02 5.8229e+00 -2.1000e+03 9.7143e+02 5.8516e+00 -2.1000e+03 1.0000e+03 5.8806e+00 -2.1000e+03 1.0286e+03 5.9099e+00 -2.1000e+03 1.0571e+03 5.9394e+00 -2.1000e+03 1.0857e+03 5.9691e+00 -2.1000e+03 1.1143e+03 5.9990e+00 -2.1000e+03 1.1429e+03 6.0291e+00 -2.1000e+03 1.1714e+03 6.0593e+00 -2.1000e+03 1.2000e+03 6.0896e+00 -2.1000e+03 1.2286e+03 6.1199e+00 -2.1000e+03 1.2571e+03 6.1503e+00 -2.1000e+03 1.2857e+03 6.1808e+00 -2.1000e+03 1.3143e+03 6.2112e+00 -2.1000e+03 1.3429e+03 6.2416e+00 -2.1000e+03 1.3714e+03 6.2720e+00 -2.1000e+03 1.4000e+03 6.3024e+00 -2.1000e+03 1.4286e+03 6.3327e+00 -2.1000e+03 1.4571e+03 6.3629e+00 -2.1000e+03 1.4857e+03 6.3930e+00 -2.1000e+03 1.5143e+03 6.4230e+00 -2.1000e+03 1.5429e+03 6.4528e+00 -2.1000e+03 1.5714e+03 6.4825e+00 -2.1000e+03 1.6000e+03 6.5121e+00 -2.1000e+03 1.6286e+03 6.5415e+00 -2.1000e+03 1.6571e+03 6.5707e+00 -2.1000e+03 1.6857e+03 6.5998e+00 -2.1000e+03 1.7143e+03 6.6286e+00 -2.1000e+03 1.7429e+03 6.6573e+00 -2.1000e+03 1.7714e+03 6.6857e+00 -2.1000e+03 1.8000e+03 6.7139e+00 -2.1000e+03 1.8286e+03 6.7419e+00 -2.1000e+03 1.8571e+03 6.7697e+00 -2.1000e+03 1.8857e+03 6.7972e+00 -2.1000e+03 1.9143e+03 6.8245e+00 -2.1000e+03 1.9429e+03 6.8516e+00 -2.1000e+03 1.9714e+03 6.8784e+00 -2.1000e+03 2.0000e+03 6.9049e+00 diff --git a/examples/04-dcip/plot_dc_analytic.py b/examples/04-dcip/plot_dc_analytic.py index b47ba4ed2a..b926c247a3 100644 --- a/examples/04-dcip/plot_dc_analytic.py +++ b/examples/04-dcip/plot_dc_analytic.py @@ -12,11 +12,6 @@ import matplotlib.pyplot as plt from simpeg.electromagnetics.static import resistivity as DC -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - cs = 25.0 hx = [(cs, 7, -1.3), (cs, 21), (cs, 7, 1.3)] @@ -35,9 +30,7 @@ rx = DC.Rx.Dipole(xyz_rxP, xyz_rxN) src = DC.Src.Dipole([rx], np.r_[-200, 0, -12.5], np.r_[+200, 0, -12.5]) survey = DC.Survey([src]) -sim = DC.Simulation3DCellCentered( - mesh, survey=survey, solver=Solver, sigma=sigma, bc_type="Neumann" -) +sim = DC.Simulation3DCellCentered(mesh, survey=survey, sigma=sigma, bc_type="Neumann") data = sim.dpred() diff --git a/examples/04-dcip/plot_inv_dcip_dipoledipole_3Dinversion_twospheres.py b/examples/04-dcip/plot_inv_dcip_dipoledipole_3Dinversion_twospheres.py index 7f1ba7dfd2..b198c330d8 100644 --- a/examples/04-dcip/plot_inv_dcip_dipoledipole_3Dinversion_twospheres.py +++ b/examples/04-dcip/plot_inv_dcip_dipoledipole_3Dinversion_twospheres.py @@ -31,11 +31,6 @@ import numpy as np import matplotlib.pyplot as plt -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - np.random.seed(12345) # 3D Mesh @@ -153,10 +148,10 @@ def getCylinderPoints(xc, zc, r): # Setup Problem with exponential mapping and Active cells only in the core mesh expmap = maps.ExpMap(mesh) -mapactive = maps.InjectActiveCells(mesh=mesh, indActive=actind, valInactive=-5.0) +mapactive = maps.InjectActiveCells(mesh=mesh, active_cells=actind, value_inactive=-5.0) mapping = expmap * mapactive problem = DC.Simulation3DCellCentered( - mesh, survey=survey, sigmaMap=mapping, solver=Solver, bc_type="Neumann" + mesh, survey=survey, sigmaMap=mapping, bc_type="Neumann" ) data = problem.make_synthetic_data(mtrue[actind], relative_error=0.05, add_noise=True) diff --git a/examples/04-dcip/plot_inv_dcip_dipoledipole_parametric_inversion.py b/examples/04-dcip/plot_inv_dcip_dipoledipole_parametric_inversion.py index 8304fce3d6..fec53a57d6 100644 --- a/examples/04-dcip/plot_inv_dcip_dipoledipole_parametric_inversion.py +++ b/examples/04-dcip/plot_inv_dcip_dipoledipole_parametric_inversion.py @@ -34,11 +34,6 @@ import numpy as np from pylab import hist -try: - from pymatsolver import PardisoSolver as Solver -except ImportError: - from simpeg import SolverLU as Solver - def run( plotIt=True, @@ -149,7 +144,10 @@ def run( # Generate 2.5D DC problem # "N" means potential is defined at nodes prb = DC.Simulation2DNodal( - mesh, survey=survey, rhoMap=mapping, storeJ=True, solver=Solver + mesh, + survey=survey, + rhoMap=mapping, + storeJ=True, ) # Make synthetic DC data with 5% Gaussian noise diff --git a/examples/05-fdem/plot_inv_fdem_loop_loop_2Dinversion.py b/examples/05-fdem/plot_inv_fdem_loop_loop_2Dinversion.py index 43699d6743..c3a2771b03 100644 --- a/examples/05-fdem/plot_inv_fdem_loop_loop_2Dinversion.py +++ b/examples/05-fdem/plot_inv_fdem_loop_loop_2Dinversion.py @@ -16,10 +16,6 @@ import matplotlib.pyplot as plt import time -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver import discretize from simpeg import ( @@ -208,9 +204,7 @@ def interface(x): # create the survey and problem objects for running the forward simulation survey = FDEM.Survey(source_list) -prob = FDEM.Simulation3DMagneticFluxDensity( - mesh, survey=survey, sigmaMap=mapping, solver=Solver -) +prob = FDEM.Simulation3DMagneticFluxDensity(mesh, survey=survey, sigmaMap=mapping) ############################################################################### # Set up data for inversion @@ -288,7 +282,7 @@ def plot_data(data, ax=None, color="C0", label=""): opt = optimization.InexactGaussNewton(maxIterCG=10, remember="xc") invProb = inverse_problem.BaseInvProblem(dmisfit, reg, opt) -betaest = directives.BetaEstimate_ByEig(beta0_ratio=0.05, n_pw_iter=1, seed=1) +betaest = directives.BetaEstimate_ByEig(beta0_ratio=0.05, n_pw_iter=1, random_seed=1) target = directives.TargetMisfit() directiveList = [betaest, target] diff --git a/examples/06-tdem/plot_fwd_tdem_3d_model.py b/examples/06-tdem/plot_fwd_tdem_3d_model.py index def2b65a74..dbe0d774e4 100644 --- a/examples/06-tdem/plot_fwd_tdem_3d_model.py +++ b/examples/06-tdem/plot_fwd_tdem_3d_model.py @@ -6,10 +6,6 @@ import empymod import discretize -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver import numpy as np from simpeg import maps @@ -316,7 +312,6 @@ mesh, survey=survey, rhoMap=maps.IdentityMap(mesh), - solver=Solver, time_steps=time_steps, ) diff --git a/examples/06-tdem/plot_fwd_tdem_inductive_src_permeable_target.py b/examples/06-tdem/plot_fwd_tdem_inductive_src_permeable_target.py index 68f0b668b0..5c18bf377f 100644 --- a/examples/06-tdem/plot_fwd_tdem_inductive_src_permeable_target.py +++ b/examples/06-tdem/plot_fwd_tdem_inductive_src_permeable_target.py @@ -17,10 +17,6 @@ from matplotlib.colors import LogNorm from scipy.constants import mu_0 -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver import time from simpeg.electromagnetics import time_domain as TDEM @@ -192,14 +188,12 @@ survey=survey_magnetostatic, sigmaMap=maps.IdentityMap(mesh), time_steps=ramp, - solver=Solver, ) prob_ramp_on = TDEM.Simulation3DMagneticFluxDensity( mesh=mesh, survey=survey_ramp_on, sigmaMap=maps.IdentityMap(mesh), time_steps=ramp, - solver=Solver, ) ############################################################################### diff --git a/examples/06-tdem/plot_inv_tdem_1D.py b/examples/06-tdem/plot_inv_tdem_1D.py index 992dbb13fb..8a581ba273 100644 --- a/examples/06-tdem/plot_inv_tdem_1D.py +++ b/examples/06-tdem/plot_inv_tdem_1D.py @@ -56,7 +56,7 @@ def run(plotIt=True): data = simulation.make_synthetic_data(mtrue, relative_error=rel_err) dmisfit = data_misfit.L2DataMisfit(simulation=simulation, data=data) - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares(regMesh, alpha_s=1e-2, alpha_x=1.0) opt = optimization.InexactGaussNewton(maxIter=5, LSshorten=0.5) invProb = inverse_problem.BaseInvProblem(dmisfit, reg, opt) diff --git a/examples/06-tdem/plot_inv_tdem_1D_raw_waveform.py b/examples/06-tdem/plot_inv_tdem_1D_raw_waveform.py index 06b793bb51..2ad881b0fc 100644 --- a/examples/06-tdem/plot_inv_tdem_1D_raw_waveform.py +++ b/examples/06-tdem/plot_inv_tdem_1D_raw_waveform.py @@ -23,11 +23,6 @@ import matplotlib.pyplot as plt from scipy.interpolate import interp1d -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - def run(plotIt=True): cs, ncx, ncz, npad = 5.0, 25, 24, 15 @@ -50,7 +45,7 @@ def run(plotIt=True): x = np.r_[30, 50, 70, 90] rxloc = np.c_[x, x * 0.0, np.zeros_like(x)] - prb = TDEM.Simulation3DMagneticFluxDensity(mesh, sigmaMap=mapping, solver=Solver) + prb = TDEM.Simulation3DMagneticFluxDensity(mesh, sigmaMap=mapping) prb.time_steps = [ (1e-3, 5), (1e-4, 5), @@ -80,7 +75,7 @@ def run(plotIt=True): data = prb.make_synthetic_data(mtrue, relative_error=0.02, noise_floor=1e-11) dmisfit = data_misfit.L2DataMisfit(simulation=prb, data=data) - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares(regMesh) opt = optimization.InexactGaussNewton(maxIter=5, LSshorten=0.5) invProb = inverse_problem.BaseInvProblem(dmisfit, reg, opt) diff --git a/examples/07-nsem/plot_fwd_nsem_MTTipper3D.py b/examples/07-nsem/plot_fwd_nsem_MTTipper3D.py index c5627008e7..e0f2725378 100644 --- a/examples/07-nsem/plot_fwd_nsem_MTTipper3D.py +++ b/examples/07-nsem/plot_fwd_nsem_MTTipper3D.py @@ -14,11 +14,6 @@ import numpy as np import matplotlib.pyplot as plt -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import Solver - def run(plotIt=True): """ @@ -79,7 +74,6 @@ def run(plotIt=True): problem = NSEM.Simulation3DPrimarySecondary( M, survey=survey, - solver=Solver, sigma=sig, sigmaPrimary=sigBG, forward_only=True, diff --git a/examples/08-vrm/plot_fwd_vrm.py b/examples/08-vrm/plot_fwd_vrm.py index fba26e608f..9b87566329 100644 --- a/examples/08-vrm/plot_fwd_vrm.py +++ b/examples/08-vrm/plot_fwd_vrm.py @@ -110,7 +110,7 @@ problem_vrm = VRM.Simulation3DLinear( mesh, survey=survey_vrm, - indActive=topoCells, + active_cells=topoCells, refinement_factor=3, refinement_distance=[1.25, 2.5, 3.75], ) diff --git a/examples/08-vrm/plot_inv_vrm_eq.py b/examples/08-vrm/plot_inv_vrm_eq.py index a8558023c8..873a7b7188 100644 --- a/examples/08-vrm/plot_inv_vrm_eq.py +++ b/examples/08-vrm/plot_inv_vrm_eq.py @@ -124,7 +124,7 @@ problem_vrm = VRM.Simulation3DLinear( mesh, survey=survey_vrm, - indActive=topoCells, + active_cells=topoCells, refinement_factor=3, refinement_distance=[1.25, 2.5, 3.75], ) @@ -176,7 +176,7 @@ problem_inv = VRM.Simulation3DLinear( mesh, survey=survey_vrm, - indActive=actCells, + active_cells=actCells, refinement_factor=3, refinement_distance=[1.25, 2.5, 3.75], ) diff --git a/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py b/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py index 693139ab38..84b7fecfbc 100644 --- a/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py +++ b/examples/10-pgi/plot_inv_1_PGI_Linear_1D_joint_WithRelationships.py @@ -11,6 +11,7 @@ import discretize as Mesh import matplotlib.pyplot as plt +import matplotlib.lines as mlines import numpy as np from simpeg import ( data_misfit, @@ -324,10 +325,16 @@ def g(k): alpha=0.25, cmap="viridis", ) -axes[3].scatter(wires.m1 * mcluster_map, wires.m2 * mcluster_map, marker="v") +cs_proxy = mlines.Line2D([], [], label="True Petrophysical Distribution") + +ps = axes[3].scatter( + wires.m1 * mcluster_map, + wires.m2 * mcluster_map, + marker="v", + label="Recovered model crossplot", +) axes[3].set_title("Petrophysical Distribution") -CS.collections[0].set_label("") -axes[3].legend(["True Petrophysical Distribution", "Recovered model crossplot"]) +axes[3].legend(handles=[cs_proxy, ps]) axes[3].set_xlabel("Property 1") axes[3].set_ylabel("Property 2") @@ -372,7 +379,6 @@ def g(k): 500, cmap="viridis", linestyles="--", - label="Modeled Petro. Distribution", ) axes[7].scatter( wires.m1 * mcluster_no_map, @@ -380,8 +386,12 @@ def g(k): marker="v", label="Recovered model crossplot", ) +cs_modeled_proxy = mlines.Line2D( + [], [], linestyle="--", label="Modeled Petro. Distribution" +) + axes[7].set_title("Petrophysical Distribution") -axes[7].legend() +axes[7].legend(handles=[cs_proxy, cs_modeled_proxy, ps]) axes[7].set_xlabel("Property 1") axes[7].set_ylabel("Property 2") @@ -423,8 +433,7 @@ def g(k): ) axes[11].scatter(wires.m1 * mtik, wires.m2 * mtik, marker="v") axes[11].set_title("Petro Distribution") -CS.collections[0].set_label("") -axes[11].legend(["True Petro Distribution", "Recovered model crossplot"]) +axes[11].legend(handles=[cs_proxy, ps]) axes[11].set_xlabel("Property 1") axes[11].set_ylabel("Property 2") plt.subplots_adjust(wspace=0.3, hspace=0.3, top=0.85) diff --git a/examples/20-published/plot_booky_1D_time_freq_inv.py b/examples/20-published/plot_booky_1D_time_freq_inv.py index dd42c3938d..bbc0fb480d 100644 --- a/examples/20-published/plot_booky_1D_time_freq_inv.py +++ b/examples/20-published/plot_booky_1D_time_freq_inv.py @@ -33,7 +33,6 @@ import matplotlib import matplotlib.pyplot as plt from scipy.constants import mu_0 -from pymatsolver import Pardiso as Solver import discretize from simpeg import ( @@ -214,7 +213,7 @@ def run(plotIt=True, saveFig=False, cleanup=True): # Set FDEM survey (In-phase and Quadrature) survey = FDEM.Survey(source_list) - prb = FDEM.Simulation3DMagneticFluxDensity(mesh, sigmaMap=mapping, solver=Solver) + prb = FDEM.Simulation3DMagneticFluxDensity(mesh, sigmaMap=mapping) prb.survey = survey # ------------------ RESOLVE Inversion ------------------ # @@ -244,7 +243,7 @@ def run(plotIt=True, saveFig=False, cleanup=True): dmisfit = data_misfit.L2DataMisfit(simulation=prb, data=data_resolve) # Regularization - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares( regMesh, mapping=maps.IdentityMap(regMesh) ) @@ -317,9 +316,7 @@ def run(plotIt=True, saveFig=False, cleanup=True): (1e-4, 10), (5e-4, 15), ] - prob = TDEM.Simulation3DElectricField( - mesh, time_steps=timeSteps, sigmaMap=mapping, solver=Solver - ) + prob = TDEM.Simulation3DElectricField(mesh, time_steps=timeSteps, sigmaMap=mapping) survey = TDEM.Survey(source_list) prob.survey = survey @@ -360,7 +357,7 @@ def run(plotIt=True, saveFig=False, cleanup=True): dmisfit = data_misfit.L2DataMisfit(simulation=prob, data=data_sky) # Regularization - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares( regMesh, mapping=maps.IdentityMap(regMesh) ) diff --git a/examples/20-published/plot_booky_1Dstitched_resolve_inv.py b/examples/20-published/plot_booky_1Dstitched_resolve_inv.py index ec900f6da8..a9d093c96e 100644 --- a/examples/20-published/plot_booky_1Dstitched_resolve_inv.py +++ b/examples/20-published/plot_booky_1Dstitched_resolve_inv.py @@ -27,7 +27,6 @@ import numpy as np import matplotlib.pyplot as plt -from pymatsolver import PardisoSolver from scipy.constants import mu_0 from scipy.spatial import cKDTree @@ -113,9 +112,7 @@ def resolve_1Dinversions( # construct a forward simulation survey = FDEM.Survey(source_list) - prb = FDEM.Simulation3DMagneticFluxDensity( - mesh, sigmaMap=mapping, Solver=PardisoSolver - ) + prb = FDEM.Simulation3DMagneticFluxDensity(mesh, sigmaMap=mapping) prb.survey = survey # ------------------- Inversion ------------------- # @@ -125,7 +122,7 @@ def resolve_1Dinversions( dmisfit = data_misfit.L2DataMisfit(simulation=prb, data=dat) # regularization - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares(regMesh) reg.reference_model = mref diff --git a/examples/20-published/plot_heagyetal2017_casing.py b/examples/20-published/plot_heagyetal2017_casing.py index e9f817c04d..4caa786f89 100644 --- a/examples/20-published/plot_heagyetal2017_casing.py +++ b/examples/20-published/plot_heagyetal2017_casing.py @@ -36,15 +36,6 @@ from simpeg.electromagnetics import frequency_domain as FDEM, mu_0 from simpeg.utils.io_utils import download -# try: -# from pymatsolver import MumpsSolver as Solver -# print('using MumpsSolver') -# except ImportError: -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - import numpy as np import scipy.sparse as sp import time @@ -244,13 +235,13 @@ def primaryMapping(self): # inject casing parameters so they are included in the construction # of the layered background + casing injectCasingParams = maps.InjectActiveCells( - None, indActive=np.r_[0, 1, 4, 5], valInactive=valInactive, nC=10 + None, active_cells=np.r_[0, 1, 4, 5], value_inactive=valInactive, nC=10 ) # maps a list of casing parameters to the cyl mesh (below the # subsurface) paramMapPrimary = maps.ParametricCasingAndLayer( - self.meshp, indActive=self.indActivePrimary, slopeFact=1e4 + self.meshp, active_cells=self.indActivePrimary, slopeFact=1e4 ) # inject air cells @@ -349,7 +340,6 @@ def primaryProblem(self): ) primaryProblem.mu = self.muModel - primaryProblem.solver = Solver self._primaryProblem = primaryProblem print("... done building primary problem") @@ -538,7 +528,9 @@ def mapping(self): # model on our mesh if getattr(self, "_mapping", None) is None: print("building secondary mapping") - paramMap = maps.ParametricBlockInLayer(self.meshs, indActive=self.indActive) + paramMap = maps.ParametricBlockInLayer( + self.meshs, active_cells=self.indActive + ) self._mapping = ( self.expMap * self.injActMap # log sigma --> sigma @@ -555,7 +547,7 @@ def primaryMap2meshs(self): # block) print("Building primaryMap2meshs") paramMapPrimaryMeshs = maps.ParametricLayer( - self.meshs, indActive=self.indActive + self.meshs, active_cells=self.indActive ) self._primaryMap2mesh = ( @@ -573,7 +565,6 @@ def setupSecondaryProblem(self, mapping=None): if mapping is None: mapping = [("sigma", maps.IdentityMap(self.meshs))] sec_problem = FDEM.Simulation3DElectricField(self.meshs, sigmaMap=mapping) - sec_problem.solver = Solver print("... done setting up secondary problem") return sec_problem @@ -673,8 +664,6 @@ def plotPrimaryFields(self, primaryFields, saveFig=False): def plotSecondarySource(self, primaryFields, saveFig=False): # get source term secondaryProblem = self.setupSecondaryProblem(mapping=self.mapping) - secondaryProblem.solver = Solver - self.primaryProblem.solver = Solver secondaryProblem.model = self.mtrue secondarySurvey = self.setupSecondarySurvey( self.primaryProblem, self.primarySurvey, self.primaryMap2meshs @@ -935,8 +924,8 @@ def plotJ( from matplotlib.colors import LogNorm f = ax.contourf( - rx_x, - rx_y, + self.rx_x, + self.rx_y, np.absolute(Jv), num, cmap=plt.get_cmap("viridis"), @@ -950,7 +939,7 @@ def plotJ( if plotGrid: self.meshs.plot_slice( - np.nan * np.ones(mesh.nC), normal="Z", grid=True, ax=ax + np.nan * np.ones(self.meshs.nC), normal="Z", grid=True, ax=ax ) if xlim is not None: diff --git a/examples/20-published/plot_heagyetal2017_cyl_inversions.py b/examples/20-published/plot_heagyetal2017_cyl_inversions.py index 53f328aeaf..435a3b3f0c 100644 --- a/examples/20-published/plot_heagyetal2017_cyl_inversions.py +++ b/examples/20-published/plot_heagyetal2017_cyl_inversions.py @@ -35,11 +35,6 @@ import matplotlib.pyplot as plt import matplotlib -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - def run(plotIt=True, saveFig=False): # Set up cylindrically symmeric mesh @@ -93,7 +88,7 @@ def run(plotIt=True, saveFig=False): surveyFD = FDEM.Survey(source_list) prbFD = FDEM.Simulation3DMagneticFluxDensity( - mesh, survey=surveyFD, sigmaMap=mapping, solver=Solver + mesh, survey=surveyFD, sigmaMap=mapping ) rel_err = 0.03 dataFD = prbFD.make_synthetic_data(mtrue, relative_error=rel_err, add_noise=True) @@ -102,14 +97,14 @@ def run(plotIt=True, saveFig=False): # FDEM inversion np.random.seed(1) dmisfit = data_misfit.L2DataMisfit(simulation=prbFD, data=dataFD) - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares(regMesh) opt = optimization.InexactGaussNewton(maxIterCG=10) invProb = inverse_problem.BaseInvProblem(dmisfit, reg, opt) # Inversion Directives beta = directives.BetaSchedule(coolingFactor=4, coolingRate=3) - betaest = directives.BetaEstimate_ByEig(beta0_ratio=1.0, seed=518936) + betaest = directives.BetaEstimate_ByEig(beta0_ratio=1.0, random_seed=518936) target = directives.TargetMisfit() directiveList = [beta, betaest, target] @@ -138,7 +133,7 @@ def run(plotIt=True, saveFig=False): surveyTD = TDEM.Survey([src]) prbTD = TDEM.Simulation3DMagneticFluxDensity( - mesh, survey=surveyTD, sigmaMap=mapping, solver=Solver + mesh, survey=surveyTD, sigmaMap=mapping ) prbTD.time_steps = [(5e-5, 10), (1e-4, 10), (5e-4, 10)] @@ -148,14 +143,14 @@ def run(plotIt=True, saveFig=False): # TDEM inversion dmisfit = data_misfit.L2DataMisfit(simulation=prbTD, data=dataTD) - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares(regMesh) opt = optimization.InexactGaussNewton(maxIterCG=10) invProb = inverse_problem.BaseInvProblem(dmisfit, reg, opt) # directives beta = directives.BetaSchedule(coolingFactor=4, coolingRate=3) - betaest = directives.BetaEstimate_ByEig(beta0_ratio=1.0, seed=518936) + betaest = directives.BetaEstimate_ByEig(beta0_ratio=1.0, random_seed=518936) target = directives.TargetMisfit() directiveList = [beta, betaest, target] diff --git a/examples/20-published/plot_laguna_del_maule_inversion.py b/examples/20-published/plot_laguna_del_maule_inversion.py index d4dd2ffca5..b7f212e1c1 100644 --- a/examples/20-published/plot_laguna_del_maule_inversion.py +++ b/examples/20-published/plot_laguna_del_maule_inversion.py @@ -92,7 +92,7 @@ def run(plotIt=True, cleanAfterRun=True): # Now that we have a model and a survey we can build the linear system ... # Create the forward model operator simulation = gravity.simulation.Simulation3DIntegral( - survey=survey, mesh=mesh, rhoMap=staticCells, ind_active=active + survey=survey, mesh=mesh, rhoMap=staticCells, active_cells=active ) # %% Create inversion objects @@ -121,13 +121,16 @@ def run(plotIt=True, cleanAfterRun=True): invProb = inverse_problem.BaseInvProblem(dmis, reg, opt) # Specify how the initial beta is found - betaest = directives.BetaEstimate_ByEig(beta0_ratio=0.5, seed=518936) + betaest = directives.BetaEstimate_ByEig(beta0_ratio=0.5, random_seed=518936) # IRLS sets up the Lp inversion problem # Set the eps parameter parameter in Line 11 of the # input file based on the distribution of model (DEFAULT = 95th %ile) - IRLS = directives.Update_IRLS( - f_min_change=1e-4, max_irls_iterations=40, coolEpsFact=1.5, beta_tol=5e-1 + IRLS = directives.UpdateIRLS( + f_min_change=1e-4, + max_irls_iterations=40, + irls_cooling_factor=1.5, + misfit_tolerance=5e-1, ) # Preconditioning refreshing for each IRLS iteration diff --git a/examples/20-published/plot_schenkel_morrison_casing.py b/examples/20-published/plot_schenkel_morrison_casing.py index 6654e0ad08..5348f0fd99 100644 --- a/examples/20-published/plot_schenkel_morrison_casing.py +++ b/examples/20-published/plot_schenkel_morrison_casing.py @@ -52,11 +52,6 @@ from simpeg.electromagnetics import frequency_domain as FDEM import time -try: - from pymatsolver import Pardiso as Solver -except Exception: - from simpeg import SolverLU as Solver - def run(plotIt=True): # ------------------ MODEL ------------------ @@ -229,7 +224,9 @@ def run(plotIt=True): # ------------ Problem and Survey --------------- survey = FDEM.Survey(sg_p + dg_p) problem = FDEM.Simulation3DMagneticField( - mesh, survey=survey, sigmaMap=maps.IdentityMap(mesh), solver=Solver + mesh, + survey=survey, + sigmaMap=maps.IdentityMap(mesh), ) # ------------- Solve --------------------------- diff --git a/examples/_archived/plot_inv_dcip_2_5Dinversion.py b/examples/_archived/plot_inv_dcip_2_5Dinversion.py index 717cf0cb5c..5d28430207 100644 --- a/examples/_archived/plot_inv_dcip_2_5Dinversion.py +++ b/examples/_archived/plot_inv_dcip_2_5Dinversion.py @@ -27,11 +27,6 @@ import numpy as np from pylab import hist -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - def run(plotIt=True, survey_type="dipole-dipole"): np.random.seed(1) @@ -130,9 +125,7 @@ def run(plotIt=True, survey_type="dipole-dipole"): # Generate 2.5D DC problem # "N" means potential is defined at nodes - prb = DC.Simulation2DNodal( - mesh, survey=survey_dc, rhoMap=mapping, storeJ=True, solver=Solver - ) + prb = DC.Simulation2DNodal(mesh, survey=survey_dc, rhoMap=mapping, storeJ=True) # Make synthetic DC data with 5% Gaussian noise data_dc = prb.make_synthetic_data(mtrue_dc, relative_error=0.05, add_noise=True) @@ -144,7 +137,7 @@ def run(plotIt=True, survey_type="dipole-dipole"): # "N" means potential is defined at nodes survey_ip = IP.from_dc_to_ip_survey(survey_dc, dim="2.5D") prb_ip = IP.Simulation2DNodal( - mesh, survey=survey_ip, etaMap=actmap, storeJ=True, rho=rho, solver=Solver + mesh, survey=survey_ip, etaMap=actmap, storeJ=True, rho=rho ) data_ip = prb_ip.make_synthetic_data(mtrue_ip, relative_error=0.05, add_noise=True) diff --git a/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion.py b/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion.py index dafcfee6a9..26c60fd3c6 100644 --- a/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion.py +++ b/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion.py @@ -30,11 +30,6 @@ import numpy as np from pylab import hist -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - def run(plotIt=True, survey_type="dipole-dipole"): np.random.seed(1) @@ -112,7 +107,7 @@ def run(plotIt=True, survey_type="dipole-dipole"): # Generate 2.5D DC problem # "N" means potential is defined at nodes prb = DC.Simulation2DNodal( - mesh, survey=survey, rhoMap=mapping, storeJ=True, Solver=Solver, verbose=True + mesh, survey=survey, rhoMap=mapping, storeJ=True, verbose=True ) # Make synthetic DC data with 5% Gaussian noise diff --git a/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion_irls.py b/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion_irls.py index a2c67c696a..356fe58804 100644 --- a/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion_irls.py +++ b/examples/_archived/plot_inv_dcip_dipoledipole_2_5Dinversion_irls.py @@ -38,11 +38,6 @@ import numpy as np from pylab import hist -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - def run(plotIt=True, survey_type="dipole-dipole", p=0.0, qx=2.0, qz=2.0): np.random.seed(1) @@ -111,7 +106,9 @@ def run(plotIt=True, survey_type="dipole-dipole", p=0.0, qx=2.0, qz=2.0): plt.show() # Use Exponential Map: m = log(rho) - actmap = maps.InjectActiveCells(mesh, indActive=actind, valInactive=np.log(1e8)) + actmap = maps.InjectActiveCells( + mesh, active_cells=actind, value_inactive=np.log(1e8) + ) mapping = maps.ExpMap(mesh) * actmap # Generate mtrue @@ -120,7 +117,7 @@ def run(plotIt=True, survey_type="dipole-dipole", p=0.0, qx=2.0, qz=2.0): # Generate 2.5D DC problem # "N" means potential is defined at nodes prb = DC.Simulation2DNodal( - mesh, survey=survey, rhoMap=mapping, storeJ=True, Solver=Solver, verbose=True + mesh, survey=survey, rhoMap=mapping, storeJ=True, verbose=True ) # Make synthetic DC data with 5% Gaussian noise @@ -158,14 +155,13 @@ def run(plotIt=True, survey_type="dipole-dipole", p=0.0, qx=2.0, qz=2.0): mesh, active_cells=actind, mapping=regmap, gradient_type="components" ) reg.norms = [p, qx, qz, 0.0] - IRLS = directives.Update_IRLS( - max_irls_iterations=20, minGNiter=1, beta_search=False, fix_Jmatrix=True + irls = directives.UpdateIRLS( + max_irls_iterations=20, ) - opt = optimization.InexactGaussNewton(maxIter=40) invProb = inverse_problem.BaseInvProblem(dmisfit, reg, opt) betaest = directives.BetaEstimate_ByEig(beta0_ratio=1e0) - inv = inversion.BaseInversion(invProb, directiveList=[betaest, IRLS]) + inv = inversion.BaseInversion(invProb, directiveList=[betaest, irls]) prb.counter = opt.counter = utils.Counter() opt.LSshorten = 0.5 opt.remember("xc") diff --git a/examples/_archived/plot_inv_grav_linear.py b/examples/_archived/plot_inv_grav_linear.py index 7d6e07ab05..c860677158 100644 --- a/examples/_archived/plot_inv_grav_linear.py +++ b/examples/_archived/plot_inv_grav_linear.py @@ -84,7 +84,7 @@ def run(plotIt=True): # Create the forward simulation simulation = gravity.simulation.Simulation3DIntegral( - survey=survey, mesh=mesh, rhoMap=idenMap, ind_active=actv + survey=survey, mesh=mesh, rhoMap=idenMap, active_cells=actv ) # Compute linear forward operator and compute some data @@ -120,11 +120,11 @@ def run(plotIt=True): # Here is where the norms are applied # Use pick a threshold parameter empirically based on the distribution of # model parameters - update_IRLS = directives.Update_IRLS( + update_IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=30, - coolEpsFact=1.5, - beta_tol=1e-2, + irls_cooling_factor=1.5, + misfit_tolerance=1e-2, ) saveDict = directives.SaveOutputEveryIteration(save_txt=False) update_Jacobi = directives.UpdatePreconditioner() @@ -261,7 +261,9 @@ def run(plotIt=True): axs = plt.subplot() axs.plot(saveDict.phi_d, "k", lw=2) axs.plot( - np.r_[update_IRLS.iterStart, update_IRLS.iterStart], + np.r_[ + update_IRLS.metrics.start_irls_iter, update_IRLS.metrics.start_irls_iter + ], np.r_[0, np.max(saveDict.phi_d)], "k:", ) @@ -269,7 +271,7 @@ def run(plotIt=True): twin = axs.twinx() twin.plot(saveDict.phi_m, "k--", lw=2) axs.text( - update_IRLS.iterStart, + update_IRLS.metrics.start_irls_iter, np.max(saveDict.phi_d) / 2.0, "IRLS Steps", va="bottom", diff --git a/examples/_archived/plot_inv_mag_linear.py b/examples/_archived/plot_inv_mag_linear.py index 8656f1dce1..f5383bcc1b 100644 --- a/examples/_archived/plot_inv_mag_linear.py +++ b/examples/_archived/plot_inv_mag_linear.py @@ -91,7 +91,7 @@ def run(plotIt=True): survey=survey, mesh=mesh, chiMap=idenMap, - ind_active=actv, + active_cells=actv, ) # Compute linear forward operator and compute some data @@ -128,7 +128,7 @@ def run(plotIt=True): # Here is where the norms are applied # Use pick a threshold parameter empirically based on the distribution of # model parameters - IRLS = directives.Update_IRLS(f_min_change=1e-3, max_irls_iterations=40) + IRLS = directives.UpdateIRLS(f_min_change=1e-3, max_irls_iterations=40) saveDict = directives.SaveOutputEveryIteration(save_txt=False) update_Jacobi = directives.UpdatePreconditioner() # Add sensitivity weights @@ -291,7 +291,7 @@ def run(plotIt=True): axs = plt.subplot() axs.plot(saveDict.phi_d, "k", lw=2) axs.plot( - np.r_[IRLS.iterStart, IRLS.iterStart], + np.r_[IRLS.metrics.start_irls_iter, IRLS.metrics.start_irls_iter], np.r_[0, np.max(saveDict.phi_d)], "k:", ) @@ -299,7 +299,7 @@ def run(plotIt=True): twin = axs.twinx() twin.plot(saveDict.phi_m, "k--", lw=2) axs.text( - IRLS.iterStart, + IRLS.metrics.start_irls_iter, 0, "IRLS Steps", va="bottom", diff --git a/pyproject.toml b/pyproject.toml index ffa81e3062..2f4fb535b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,18 +15,18 @@ authors = [ ] keywords = ["geophysics", "inverse problem"] - dependencies = [ + "numpy>=1.22", + "scipy>=1.8", + "pymatsolver>=0.3", "discretize>=0.11.0", "empymod>=2.0.0", "geoana>=0.5.0", "geoh5py>=0.11.0a1, <0.12.dev", "matplotlib", - "numpy>=1.20", - "pandas", - "pymatsolver>=0.3, <0.4.dev", - "scikit-learn>=1.2", - "scipy>=1.8.0", + "discretize>=0.11", + "geoana>=0.7", + "libdlf", ] classifiers = [ @@ -51,23 +51,20 @@ dynamic = ["version"] file = 'LICENSE' [project.urls] -Homepage = "http://simpeg.xyz/" -Documentation = "https://docs.simpeg.xyz/" +Homepage = 'https://simpeg.xyz' +Documentation = 'https://docs.simpeg.xyz' Repository = "https://github.com/MiraGeoscience/simpeg" [project.optional-dependencies] -dask = [ - "dask[distributed]", - "distributed", - "fsspec>=0.3.3", - "zarr", -] - -choclo = ["choclo"] +dask = ["dask", "zarr", "fsspec>=0.3.3"] +choclo = ["choclo>=0.3.0"] reporting = ["scooby"] plotting = ["plotly"] +sklearn = ["scikit-learn>=1.2"] +pandas = ["pandas"] all = [ - "simpeg[dask,choclo,plotting,reporting]" + "simpeg[dask,choclo,plotting,reporting,sklearn,pandas]" + ] # all optional *runtime* dependencies (not related to development) style = [ "black==24.3.0", @@ -85,6 +82,7 @@ docs = [ "sphinxcontrib-apidoc", "pydata-sphinx-theme", "nbsphinx", + "empymod>=2.0.0", "numpydoc", "pillow", "sympy", @@ -131,7 +129,8 @@ exclude_also = [ # Don't complain if non-runnable code isn't run: "if 0:", "if __name__ == .__main__.:", - + # Don't complain about default solver choices: + 'if AvailableSolvers["Pardiso"]:', # Don't complain about abstract methods, they aren't run: "@(abc\\.)?abstractmethod", ] @@ -259,3 +258,9 @@ rst-roles = [ 'meth', 'ref', ] +# pyproject.toml +[tool.pytest.ini_options] +filterwarnings = [ + "ignore::simpeg.utils.solver_utils.DefaultSolverWarning", +] + diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index d6e1198b1a..0000000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ --e . diff --git a/requirements_dask.txt b/requirements_dask.txt deleted file mode 100644 index 557aece885..0000000000 --- a/requirements_dask.txt +++ /dev/null @@ -1,3 +0,0 @@ -dask -zarr -fsspec>=0.3.3 diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index 5bab4a0c4b..0000000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,27 +0,0 @@ -sphinx -sphinx_rtd_theme -sphinx-gallery>=0.1.13 -sphinx-toolbox -sphinxcontrib-apidoc -pydata-sphinx-theme -nbsphinx -numpydoc -pillow -pylint -numpy>=1.20 -scipy>=1.8 -scikit-learn>=1.2 -sympy -wheel -pytest -pytest-cov -jupyter -toolz -empymod>=2.0.0 -scooby -black==24.3.0 -pre-commit -twine -memory_profiler -plotly -setuptools_scm diff --git a/requirements_style.txt b/requirements_style.txt deleted file mode 100644 index a4fd699571..0000000000 --- a/requirements_style.txt +++ /dev/null @@ -1,7 +0,0 @@ -black==24.3.0 -flake8==7.0.0 -flake8-bugbear==23.12.2 -flake8-builtins==2.2.0 -flake8-mutable==1.2.0 -flake8-rst-docstrings==0.3.0 -flake8-docstrings==1.7.0 diff --git a/simpeg/__init__.py b/simpeg/__init__.py index 0dc76dab2d..c6cbe5e65d 100644 --- a/simpeg/__init__.py +++ b/simpeg/__init__.py @@ -155,7 +155,6 @@ from .utils import mkvc from .utils import Report from .utils.solver_utils import ( - _checkAccuracy, SolverWrapD, SolverWrapI, Solver, diff --git a/simpeg/base/pde_simulation.py b/simpeg/base/pde_simulation.py index f8739dcef3..eddc7d88f1 100644 --- a/simpeg/base/pde_simulation.py +++ b/simpeg/base/pde_simulation.py @@ -1,10 +1,16 @@ +import inspect import numpy as np +import pymatsolver import scipy.sparse as sp from discretize.utils import Zero, TensorType +import discretize.base from ..simulation import BaseSimulation from .. import props from scipy.constants import mu_0 +from ..utils import validate_type +from ..utils.solver_utils import get_default_solver + def __inner_mat_mul_op(M, u, v=None, adjoint=False): u = np.squeeze(u) @@ -415,6 +421,109 @@ def _clear_on_prop_update(self): class BasePDESimulation(BaseSimulation): + """Base simulation for PDE solutions. + + Parameters + ---------- + mesh : discretize.base.BaseMesh + Mesh on which the forward problem is discretized. + solver : type[pymatsolver.base.Base], optional + Numerical solver used to solve the forward problem. If ``None``, + an appropriate solver specific to the simulation class is set by default. + solver_opts : dict, optional + Solver-specific parameters. If ``None``, default parameters are used for + the solver set by ``solver``. Otherwise, the ``dict`` must contain appropriate + pairs of keyword arguments and parameter values for the solver. Please visit + `pymatsolver `__ to learn more + about solvers and their parameters. + + """ + + def __init__(self, mesh, solver=None, solver_opts=None, **kwargs): + self.mesh = mesh + super().__init__(**kwargs) + self.solver = solver + if solver_opts is None: + solver_opts = {} + self.solver_opts = solver_opts + + @property + def mesh(self): + """Mesh for the simulation. + + For more on meshes, visit :py:class:`discretize.base.BaseMesh`. + + Returns + ------- + discretize.base.BaseMesh + Mesh on which the forward problem is discretized. + """ + return self._mesh + + @mesh.setter + def mesh(self, value): + self._mesh = validate_type("mesh", value, discretize.base.BaseMesh, cast=False) + + @property + def solver(self): + r"""Numerical solver used in the forward simulation. + + Many forward simulations in SimPEG require solutions to discrete linear + systems of the form: + + .. math:: + \mathbf{A}(\mathbf{m}) \, \mathbf{u} = \mathbf{q} + + where :math:`\mathbf{A}` is an invertible matrix that depends on the + model :math:`\mathbf{m}`. The numerical solver can be set using the + ``solver`` property. In SimPEG, the + `pymatsolver `__ package + is used to create solver objects. Parameters specific to each solver + can be set manually using the ``solver_opts`` property. + + Returns + ------- + type[pymatsolver.solvers.Base] + Numerical solver used to solve the forward problem. + """ + if self._solver is None: + # do not cache this, in case the user wants to + # change it after the first time it is requested. + return get_default_solver(warn=True) + return self._solver + + @solver.setter + def solver(self, cls): + if cls is not None: + if not inspect.isclass(cls): + raise TypeError(f"{type(self).__qualname__}.solver must be a class") + if not issubclass(cls, pymatsolver.solvers.Base): + raise TypeError( + f"{cls.__qualname__} is not a subclass of pymatsolver.base.BaseSolver" + ) + self._solver = cls + + @property + def solver_opts(self): + """Solver-specific parameters. + + The parameters specific to the solver set with the ``solver`` property are set + upon instantiation. The ``solver_opts`` property is used to set solver-specific properties. + This is done by providing a ``dict`` that contains appropriate pairs of keyword arguments + and parameter values. Please visit `pymatsolver `__ + to learn more about solvers and their parameters. + + Returns + ------- + dict + keyword arguments and parameters passed to the solver. + """ + return self._solver_opts + + @solver_opts.setter + def solver_opts(self, value): + self._solver_opts = validate_type("solver_opts", value, dict, cast=False) + @property def Vol(self): return self.Mcc @@ -508,11 +617,11 @@ def __init__( self.rhoMap = rhoMap @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): """ matrices to be deleted if the model for conductivity/resistivity is updated """ - toDelete = super().deleteTheseOnModelUpdate + toDelete = super()._delete_on_model_update if self.sigmaMap is not None or self.rhoMap is not None: toDelete = ( toDelete + self._clear_on_sigma_update + self._clear_on_rho_update @@ -551,11 +660,11 @@ def __setattr__(self, name, value): delattr(self, mat) @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): """ items to be deleted if the model for Magnetic Permeability is updated """ - toDelete = super().deleteTheseOnModelUpdate + toDelete = super()._delete_on_model_update if self.muMap is not None or self.muiMap is not None: toDelete = toDelete + self._clear_on_mu_update + self._clear_on_mui_update return toDelete diff --git a/simpeg/dask/potential_fields/base.py b/simpeg/dask/potential_fields/base.py index 87c6cd4219..1a9f2592bc 100644 --- a/simpeg/dask/potential_fields/base.py +++ b/simpeg/dask/potential_fields/base.py @@ -166,7 +166,7 @@ def Jmatrix(self, value): self._Jmatrix = value -Sim.clean_on_model_update = [] +Sim._delete_on_model_update = [] Sim._chunk_format = _chunk_format Sim.chunk_format = chunk_format Sim.dpred = dpred diff --git a/simpeg/dask/potential_fields/gravity/simulation.py b/simpeg/dask/potential_fields/gravity/simulation.py index 4c8d39271c..0c2d3129dd 100644 --- a/simpeg/dask/potential_fields/gravity/simulation.py +++ b/simpeg/dask/potential_fields/gravity/simulation.py @@ -13,6 +13,6 @@ def G(self): return self._G -Sim.clean_on_model_update = [] +Sim._delete_on_model_update = [] Sim.getJtJdiag = getJtJdiag Sim.G = G diff --git a/simpeg/dask/potential_fields/magnetics/simulation.py b/simpeg/dask/potential_fields/magnetics/simulation.py index cf3303215b..be7cf83eea 100644 --- a/simpeg/dask/potential_fields/magnetics/simulation.py +++ b/simpeg/dask/potential_fields/magnetics/simulation.py @@ -13,6 +13,6 @@ def G(self): return self._G -Sim.clean_on_model_update = [] +Sim._delete_on_model_update = [] Sim.getJtJdiag = getJtJdiag Sim.G = G diff --git a/simpeg/dask/simulation.py b/simpeg/dask/simulation.py index d04cfb0a32..85ccae00f4 100644 --- a/simpeg/dask/simulation.py +++ b/simpeg/dask/simulation.py @@ -4,7 +4,7 @@ import numpy as np from multiprocessing import cpu_count -Sim.clean_on_model_update = ["_Jmatrix", "_jtjdiag", "_stashed_fields"] +Sim._delete_on_model_update = ["_Jmatrix", "_jtjdiag", "_stashed_fields"] Sim.sensitivity_path = "./sensitivity/" Sim._max_ram = 16 Sim._max_chunk_size = 128 @@ -63,6 +63,30 @@ def getJtJdiag(self, m, W=None, f=None): Sim.getJtJdiag = getJtJdiag +def __init__( + self, + survey=None, + sensitivity_path="./sensitivity/", + counter=None, + verbose=False, + chunk_format="row", + max_ram=16, + max_chunk_size=128, + **kwargs, +): + _old_init( + self, + survey=survey, + sensitivity_path=sensitivity_path, + counter=counter, + verbose=verbose, + **kwargs, + ) + self.chunk_format = chunk_format + self.max_ram = max_ram + self.max_chunk_size = max_chunk_size + + def Jvec(self, m, v, **_): """ Compute sensitivity matrix (J) and vector (v) product. diff --git a/simpeg/directives/__init__.py b/simpeg/directives/__init__.py index cbc9a6ab6e..a22ef6566b 100644 --- a/simpeg/directives/__init__.py +++ b/simpeg/directives/__init__.py @@ -55,6 +55,8 @@ .. autosummary:: :toctree: generated/ + UpdateIRLS + SphericalUnitsWeights Update_IRLS @@ -109,7 +111,6 @@ SaveModelEveryIteration, SaveOutputEveryIteration, SaveOutputDictEveryIteration, - Update_IRLS, UpdatePreconditioner, Update_Wj, AlphasSmoothEstimate_ByEig, @@ -123,6 +124,7 @@ SaveModelGeoH5, SavePropertyGroup, SaveSensitivityGeoH5, + Update_IRLS, ProjectSphericalBounds, ScaleMisfitMultipliers, ) @@ -133,6 +135,8 @@ PGI_AddMrefInSmooth, ) +from ._regularization import UpdateIRLS, SphericalUnitsWeights + from .sim_directives import ( SimilarityMeasureInversionDirective, SimilarityMeasureSaveOutputEveryIteration, diff --git a/simpeg/directives/_regularization.py b/simpeg/directives/_regularization.py new file mode 100644 index 0000000000..fe4f44c9d3 --- /dev/null +++ b/simpeg/directives/_regularization.py @@ -0,0 +1,494 @@ +from __future__ import annotations + +import warnings + +import numpy as np +from dataclasses import dataclass + +from ..maps import Projection +from .directives import InversionDirective, UpdatePreconditioner, BetaSchedule +from ..regularization import ( + Sparse, + BaseSparse, + SmoothnessFirstOrder, + WeightedLeastSquares, +) +from ..utils import validate_integer, validate_float + + +@dataclass +class IRLSMetrics: + """ + Data class to store metrics used by the IRLS algorithm. + + Parameters + ---------- + input_norms : list of floats or None + List of norms temporarily stored during the initialization. + irls_iteration_count : int + Number of IRLS iterations. + start_irls_iter : int or None + Iteration number when the IRLS process started. + f_old : float + Previous value of the regularization function. + """ + + input_norms: list[float] | None = None + irls_iteration_count: int = 0 + start_irls_iter: int | None = None + f_old: float = 0.0 + + +class UpdateIRLS(InversionDirective): + """ + Directive to control the IRLS iterations for :class:`~simpeg.regularization.Sparse`. + + Parameters + ---------- + cooling_rate: int + Number of iterations to cool beta. + cooling_factor: float + Factor to cool beta. + chifact_start: float + Starting chi factor for the IRLS iterations. + chifact_target: float + Target chi factor for the IRLS iterations. + irls_cooling_factor: float + Factor to cool the IRLS threshold epsilon. + f_min_change: float + Minimum change in the regularization function to continue the IRLS iterations. + max_irls_iterations: int + Maximum number of IRLS iterations. + misfit_tolerance: float + Tolerance for the target misfit. + percentile: float + Percentile of the function values used to determine the initial IRLS threshold. + verbose: bool + Print information to the screen. + """ + + def __init__( + self, + cooling_rate: int = 1, + cooling_factor: float = 2.0, + chifact_start: float = 1.0, + chifact_target: float = 1.0, + irls_cooling_factor: float = 1.2, + f_min_change: float = 1e-2, + max_irls_iterations: int = 20, + misfit_tolerance: float = 1e-1, + percentile: float = 100.0, + verbose: bool = True, + **kwargs, + ): + self._metrics: IRLSMetrics | None = None + self.cooling_rate = cooling_rate + self.cooling_factor = cooling_factor + self.chifact_start: float = chifact_start + self.chifact_target: float = chifact_target + self.irls_cooling_factor: float = irls_cooling_factor + self.f_min_change: float = f_min_change + self.max_irls_iterations: int = max_irls_iterations + self.misfit_tolerance: float = misfit_tolerance + self.percentile: float = percentile + + super().__init__( + verbose=verbose, + **kwargs, + ) + + @property + def metrics(self) -> IRLSMetrics: + """Various metrics used by the IRLS algorithm.""" + if self._metrics is None: + self._metrics = IRLSMetrics() + return self._metrics + + @property + def max_irls_iterations(self) -> int: + """Maximum irls iterations.""" + return self._max_irls_iterations + + @max_irls_iterations.setter + def max_irls_iterations(self, value): + self._max_irls_iterations = validate_integer( + "max_irls_iterations", value, min_val=0 + ) + + @property + def misfit_tolerance(self) -> float: + """Tolerance on deviation from the target chi factor, as a fractional percent.""" + return self._misfit_tolerance + + @misfit_tolerance.setter + def misfit_tolerance(self, value): + self._misfit_tolerance = validate_float("misfit_tolerance", value, min_val=0) + + @property + def percentile(self) -> float: + """Tolerance on deviation from the target chi factor, as a fractional percent.""" + return self._percentile + + @percentile.setter + def percentile(self, value): + self._percentile = validate_float( + "percentile", value, min_val=0.0, max_val=100.0 + ) + + @property + def chifact_start(self) -> float: + """Target chi factor to start the IRLS process.""" + return self._chifact_start + + @chifact_start.setter + def chifact_start(self, value): + self._chifact_start = validate_float( + "chifact_start", value, min_val=0, inclusive_min=False + ) + + @property + def chifact_target(self) -> float: + """Targer chi factor to maintain during the IRLS process.""" + return self._chifact_target + + @chifact_target.setter + def chifact_target(self, value): + self._chifact_target = validate_float( + "chifact_target", value, min_val=0, inclusive_min=False + ) + + @property + def cooling_factor(self): + """Beta is divided by this value every :attr:`cooling_rate` iterations. + + Returns + ------- + float + """ + return self._cooling_factor + + @cooling_factor.setter + def cooling_factor(self, value): + self._cooling_factor = validate_float( + "cooling_factor", value, min_val=0.0, inclusive_min=False + ) + + @property + def cooling_rate(self): + """Cool beta after this number of iterations. + + Returns + ------- + int + """ + return self._cooling_rate + + @cooling_rate.setter + def cooling_rate(self, value): + self._cooling_rate = validate_integer("cooling_rate", value, min_val=1) + + @property + def irls_cooling_factor(self) -> float: + """IRLS threshold parameter (epsilon) is divided by this value every iteration.""" + return self._irls_cooling_factor + + @irls_cooling_factor.setter + def irls_cooling_factor(self, value): + self._irls_cooling_factor = validate_float( + "irls_cooling_factor", value, min_val=0.0, inclusive_min=False + ) + + @property + def f_min_change(self) -> float: + """Target chi factor to start the IRLS process.""" + return self._f_min_change + + @f_min_change.setter + def f_min_change(self, value): + self._f_min_change = validate_float( + "f_min_change", value, min_val=0, inclusive_min=False + ) + + def misfit_from_chi_factor(self, chi_factor: float) -> float: + """ + Compute the target misfit from the chi factor. + + Parameters + ---------- + chi_factor : float + Chi factor to compute the target misfit from. + """ + value = 0 + + for survey in self.survey: + value += survey.nD * chi_factor + + return value + + def adjust_cooling_schedule(self): + """ + Adjust the cooling schedule based on the misfit. + """ + ratio = self.invProb.phi_d / self.misfit_from_chi_factor(self.chifact_target) + + if ( + np.abs(1.0 - ratio) > self.misfit_tolerance + and self.metrics.start_irls_iter is not None + ): + + if ratio > 1: + ratio = np.mean([2.0, ratio]) + else: + ratio = np.mean([0.75, ratio]) + + self.cooling_factor = ratio + + def initialize(self): + """ + Initialize the IRLS iterations with l2-norm regularization (mode:1). + """ + + input_norms = [] + for reg in self.reg.objfcts: + if not isinstance(reg, Sparse): + input_norms += [None] + else: + input_norms += [reg.norms] + reg.norms = [2.0 for _ in reg.objfcts] + + self._metrics = IRLSMetrics(input_norms=input_norms) + + def endIter(self): + """ + Check on progress of the inversion and start/update the IRLS process. + """ + # Update the cooling factor (only after IRLS has started) + self.adjust_cooling_schedule() + + # After reaching target misfit with l2-norm, switch to IRLS (mode:2) + if ( + self.metrics.start_irls_iter is None + and self.invProb.phi_d < self.misfit_from_chi_factor(self.chifact_start) + ): + self.start_irls() + + # Perform IRLS (only after `self.cooling_rate` iterations) + if ( + self.metrics.start_irls_iter is not None + and (self.opt.iter - self.metrics.start_irls_iter) % self.cooling_rate == 0 + ): + if self.stopping_criteria(): + self.opt.stopNextIteration = True + return + else: + self.opt.stopNextIteration = False + + # Cool irls thresholds + for reg in self.reg.objfcts: + if not isinstance(reg, Sparse): + continue + + for obj in reg.objfcts: + obj.irls_threshold /= self.irls_cooling_factor + + self.metrics.irls_iteration_count += 1 + + # Reset the regularization matrices so that it is + # recalculated for current model. Do it to all levels of comboObj + for reg in self.reg.objfcts: + if not isinstance(reg, Sparse): + continue + + reg.update_weights(reg.model) + + self.invProb.phi_m_last = self.reg(self.invProb.model) + + # Apply beta cooling schedule mechanism + if self.opt.iter > 0 and self.opt.iter % self.cooling_rate == 0: + self.invProb.beta /= self.cooling_factor + + def start_irls(self): + """ + Start the IRLS iterations by computing the initial threshold values. + """ + if self.verbose: + print( + "Reached starting chifact with l2-norm regularization:" + + " Start IRLS steps..." + ) + + self.metrics.start_irls_iter = getattr(self.opt, "iter", 0) + self.invProb.phi_m_last = self.reg(self.invProb.model) + + # Either use the supplied irls_threshold, or fix base on distribution of + # model values + for reg, norms in zip(self.reg.objfcts, self.metrics.input_norms): + if not isinstance(reg, Sparse): + continue + + for obj in reg.objfcts: + threshold = np.percentile( + np.abs(obj.mapping * obj._delta_m(self.invProb.model)), + self.percentile, + ) + if isinstance(obj, SmoothnessFirstOrder): + threshold /= reg.regularization_mesh.base_length + + obj.irls_threshold = threshold + + reg.norms = norms + + if self.verbose: + print("irls_threshold " + str(reg.objfcts[0].irls_threshold)) + + # Save l2-model + self.invProb.l2model = self.invProb.model.copy() + + self.cooling_factor = 1.0 + + def validate(self, directiveList=None): + directive_list = directiveList.dList + self_ind = directive_list.index(self) + lin_precond_ind = [isinstance(d, UpdatePreconditioner) for d in directive_list] + + if any(lin_precond_ind): + if lin_precond_ind.index(True) < self_ind: + raise AssertionError( + "The directive 'UpdatePreconditioner' must be after UpdateIRLS " + "in the directiveList" + ) + else: + warnings.warn( + "Without a Linear preconditioner, convergence may be slow. " + "Consider adding `directives.UpdatePreconditioner` to your " + "directives list", + stacklevel=2, + ) + + beta_schedule = [ + d for d in directive_list if isinstance(d, BetaSchedule) and d is not self + ] + + if beta_schedule: + raise AssertionError( + "Beta scheduling is handled by the `UpdateIRLS` directive." + "Remove the redundant `BetaSchedule` from your list of directives.", + ) + + spherical_scale = [isinstance(d, SphericalUnitsWeights) for d in directive_list] + if any(spherical_scale): + assert spherical_scale.index(True) < self_ind, ( + "The directive 'SphericalUnitsWeights' must be before UpdateIRLS " + "in the directiveList" + ) + + return True + + def stopping_criteria(self): + """ + Check for stopping criteria of max_irls_iteration or minimum change. + """ + phim_new = 0 + for reg in self.reg.objfcts: + if isinstance(reg, (Sparse, BaseSparse)): + reg.model = self.invProb.model + phim_new += reg(reg.model) + + # Check for maximum number of IRLS cycles + if self.metrics.irls_iteration_count == self.max_irls_iterations: + if self.verbose: + print( + "Reach maximum number of IRLS cycles:" + + f" {self.max_irls_iterations:d}" + ) + return True + + # Check if the function has changed enough + f_change = np.abs(self.metrics.f_old - phim_new) / (self.metrics.f_old + 1e-12) + + if ( + f_change < self.f_min_change + and self.metrics.irls_iteration_count > 1 + and np.abs( + 1.0 + - self.invProb.phi_d / self.misfit_from_chi_factor(self.chifact_target) + ) + < self.misfit_tolerance + ): + if self.verbose: + print("Minimum decrease in regularization. End of IRLS") + return True + + self.metrics.f_old = phim_new + + return False + + +class SphericalUnitsWeights(InversionDirective): + """ + Directive to update the regularization weights to account for spherical + parameters in radian and SI. + + The scaling applied to the regularization weights is based on the ratio + between the maximum value of the model and the maximum value of angles (pi). + + Parameters + ---------- + amplitude: Projection + Map to the model parameters for the amplitude of the vector + angles: list[WeightedLeastSquares] + List of WeightedLeastSquares for the angles. + verbose: bool + Print information to the screen. + """ + + def __init__( + self, + amplitude: Projection, + angles: list[WeightedLeastSquares], + verbose: bool = True, + **kwargs, + ): + + if not isinstance(amplitude, Projection): + raise TypeError( + "Attribute 'amplitude' must be of type " "'wires.Projection'" + ) + + self._amplitude = amplitude + + if not isinstance(angles, (list, tuple)) or not all( + [isinstance(fun, WeightedLeastSquares) for fun in angles] + ): + raise TypeError( + "Attribute 'angles' must be a list of " + "'regularization.WeightedLeastSquares'." + ) + + self._angles = angles + + super().__init__( + verbose=verbose, + **kwargs, + ) + + def initialize(self): + self.update_scaling() + + def endIter(self): + self.update_scaling() + + def update_scaling(self): + """ + Add an 'angle_scale' to the list of weights on the angle regularization for the + different block of models to account for units of radian and SI. + """ + amplitude = self._amplitude * self.invProb.model + max_p = max(amplitude) + + for reg in self._angles: + for obj in reg.objfcts: + if obj.units != "radian": + continue + + obj.set_weights(angle_scale=np.ones_like(amplitude) * max_p / np.pi) diff --git a/simpeg/directives/directives.py b/simpeg/directives/directives.py index 1873eaea88..86380fe038 100644 --- a/simpeg/directives/directives.py +++ b/simpeg/directives/directives.py @@ -1,7 +1,11 @@ from __future__ import annotations # needed to use type operands in Python 3.8 + from abc import ABC, abstractmethod -from pathlib import Path + from datetime import datetime +from pathlib import Path +from typing import TYPE_CHECKING + import numpy as np import matplotlib.pyplot as plt @@ -14,6 +18,7 @@ from ..data_misfit import BaseDataMisfit from ..objective_function import ComboObjectiveFunction from ..maps import IdentityMap, SphericalSystem, Wires + from ..regularization import ( WeightedLeastSquares, BaseRegularization, @@ -42,6 +47,7 @@ from simpeg.utils.mat_utils import cartesian2amplitude_dip_azimuth from ..utils.code_utils import ( + deprecate_class, deprecate_property, validate_type, validate_integer, @@ -69,6 +75,11 @@ def compute_JtJdiags(data_misfit, m): return np.asarray(jtj_diag) +if TYPE_CHECKING: + from ..simulation import BaseSimulation + from ..survey import BaseSurvey + + class InversionDirective: """Base inversion directive class. @@ -169,7 +180,7 @@ def opt(self): return self.invProb.opt @property - def reg(self): + def reg(self) -> BaseObjectiveFunction: """Regularization associated with the directive. Returns @@ -193,7 +204,7 @@ def reg(self, value): self._reg = value @property - def dmisfit(self): + def dmisfit(self) -> BaseObjectiveFunction: """Data misfit associated with the directive. Returns @@ -217,7 +228,7 @@ def dmisfit(self, value): self._dmisfit = value @property - def survey(self): + def survey(self) -> list["BaseSurvey"]: """Return survey for all data misfits Assuming that ``dmisfit`` is always a ``ComboObjectiveFunction``, @@ -232,7 +243,7 @@ def survey(self): return [objfcts.simulation.survey for objfcts in self.dmisfit.objfcts] @property - def simulation(self): + def simulation(self) -> list["BaseSimulation"]: """Return simulation for all data misfits. Assuming that ``dmisfit`` is always a ``ComboObjectiveFunction``, @@ -378,22 +389,45 @@ class BaseBetaEstimator(InversionDirective): ---------- beta0_ratio : float Desired ratio between data misfit and model objective function at initial beta iteration. - seed : None or :class:`~simpeg.typing.RandomSeed`, optional + random_seed : None or :class:`~simpeg.typing.RandomSeed`, optional Random seed used for random sampling. It can either be an int, a predefined Numpy random number generator, or any valid input to ``numpy.random.default_rng``. + seed : None or :class:`~simpeg.typing.RandomSeed`, optional + + .. deprecated:: 0.23.0 + + Argument ``seed`` is deprecated in favor of ``random_seed`` and will + be removed in SimPEG v0.24.0. """ def __init__( self, beta0_ratio=1.0, + random_seed: RandomSeed | None = None, seed: RandomSeed | None = None, **kwargs, ): super().__init__(**kwargs) self.beta0_ratio = beta0_ratio - self.seed = seed + + # Deprecate seed argument + if seed is not None: + if random_seed is not None: + raise TypeError( + "Cannot pass both 'random_seed' and 'seed'." + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + ) + warnings.warn( + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + FutureWarning, + stacklevel=2, + ) + random_seed = seed + self.random_seed = random_seed @property def beta0_ratio(self): @@ -412,17 +446,17 @@ def beta0_ratio(self, value): ) @property - def seed(self): + def random_seed(self): """Random seed to initialize with. Returns ------- int, numpy.random.Generator or None """ - return self._seed + return self._random_seed - @seed.setter - def seed(self, value): + @random_seed.setter + def random_seed(self, value): try: np.random.default_rng(value) except TypeError as err: @@ -432,7 +466,7 @@ def seed(self, value): ) raise TypeError(msg) from err - self._seed = value + self._random_seed = value def validate(self, directive_list): ind = [isinstance(d, BaseBetaEstimator) for d in directive_list.dList] @@ -443,6 +477,15 @@ def validate(self, directive_list): return True + seed = deprecate_property( + random_seed, + "seed", + "random_seed", + removal_version="0.24.0", + future_warn=True, + error=False, + ) + class BetaEstimateMaxDerivative(BaseBetaEstimator): r"""Estimate initial trade-off parameter (beta) using largest derivatives. @@ -458,10 +501,16 @@ class BetaEstimateMaxDerivative(BaseBetaEstimator): ---------- beta0_ratio: float Desired ratio between data misfit and model objective function at initial beta iteration. - seed : None or :class:`~simpeg.typing.RandomSeed`, optional + random_seed : None or :class:`~simpeg.typing.RandomSeed`, optional Random seed used for random sampling. It can either be an int, a predefined Numpy random number generator, or any valid input to ``numpy.random.default_rng``. + seed : None or :class:`~simpeg.typing.RandomSeed`, optional + + .. deprecated:: 0.23.0 + + Argument ``seed`` is deprecated in favor of ``random_seed`` and will + be removed in SimPEG v0.24.0. Notes ----- @@ -491,11 +540,13 @@ class BetaEstimateMaxDerivative(BaseBetaEstimator): """ - def __init__(self, beta0_ratio=1.0, seed: RandomSeed | None = None, **kwargs): - super().__init__(beta0_ratio=beta0_ratio, seed=seed, **kwargs) + def __init__( + self, beta0_ratio=1.0, random_seed: RandomSeed | None = None, **kwargs + ): + super().__init__(beta0_ratio=beta0_ratio, random_seed=random_seed, **kwargs) def initialize(self): - rng = np.random.default_rng(seed=self.seed) + rng = np.random.default_rng(seed=self.random_seed) if self.verbose: print("Calculating the beta0 parameter.") @@ -598,10 +649,16 @@ class BetaEstimate_ByEig(BaseBetaEstimator): Desired ratio between data misfit and model objective function at initial beta iteration. n_pw_iter : int Number of power iterations used to estimate largest eigenvalues. - seed : None or :class:`~simpeg.typing.RandomSeed`, optional + random_seed : None or :class:`~simpeg.typing.RandomSeed`, optional Random seed used for random sampling. It can either be an int, a predefined Numpy random number generator, or any valid input to ``numpy.random.default_rng``. + seed : None or :class:`~simpeg.typing.RandomSeed`, optional + + .. deprecated:: 0.23.0 + + Argument ``seed`` is deprecated in favor of ``random_seed`` and will + be removed in SimPEG v0.24.0. Notes ----- @@ -634,10 +691,13 @@ def __init__( self, beta0_ratio=1.0, n_pw_iter=4, + random_seed: RandomSeed | None = None, seed: RandomSeed | None = None, **kwargs, ): - super().__init__(beta0_ratio=beta0_ratio, seed=seed, **kwargs) + super().__init__( + beta0_ratio=beta0_ratio, random_seed=random_seed, seed=seed, **kwargs + ) self.n_pw_iter = n_pw_iter @@ -657,7 +717,7 @@ def n_pw_iter(self, value): self._n_pw_iter = validate_integer("n_pw_iter", value, min_val=1) def initialize(self): - rng = np.random.default_rng(seed=self.seed) + rng = np.random.default_rng(seed=self.random_seed) if self.verbose: print("Calculating the beta0 parameter.") @@ -668,13 +728,13 @@ def initialize(self): self.dmisfit, m, n_pw_iter=self.n_pw_iter, - seed=rng, + random_seed=rng, ) reg_eigenvalue = eigenvalue_by_power_iteration( self.reg, m, n_pw_iter=self.n_pw_iter, - seed=rng, + random_seed=rng, ) self.ratio = np.asarray(dm_eigenvalue / reg_eigenvalue) @@ -762,13 +822,30 @@ def __init__( self, alpha0_ratio=1.0, n_pw_iter=4, + random_seed: RandomSeed | None = None, seed: RandomSeed | None = None, **kwargs, ): super().__init__(**kwargs) self.alpha0_ratio = alpha0_ratio self.n_pw_iter = n_pw_iter - self.seed = seed + + # Deprecate seed argument + if seed is not None: + if random_seed is not None: + raise TypeError( + "Cannot pass both 'random_seed' and 'seed'." + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + ) + warnings.warn( + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + FutureWarning, + stacklevel=2, + ) + random_seed = seed + self.random_seed = random_seed @property def alpha0_ratio(self): @@ -801,17 +878,17 @@ def n_pw_iter(self, value): self._n_pw_iter = validate_integer("n_pw_iter", value, min_val=1) @property - def seed(self): + def random_seed(self): """Random seed to initialize with. Returns ------- int, numpy.random.Generator or None """ - return self._seed + return self._random_seed - @seed.setter - def seed(self, value): + @random_seed.setter + def random_seed(self, value): try: np.random.default_rng(value) except TypeError as err: @@ -820,11 +897,20 @@ def seed(self, value): f"a {type(value).__name__}" ) raise TypeError(msg) from err - self._seed = value + self._random_seed = value + + seed = deprecate_property( + random_seed, + "seed", + "random_seed", + removal_version="0.24.0", + future_warn=True, + error=False, + ) def initialize(self): """""" - rng = np.random.default_rng(seed=self.seed) + rng = np.random.default_rng(seed=self.random_seed) smoothness = [] smallness = [] @@ -859,7 +945,7 @@ def initialize(self): smallness[0], self.invProb.model, n_pw_iter=self.n_pw_iter, - seed=rng, + random_seed=rng, ) self.alpha0_ratio = self.alpha0_ratio * np.ones(len(smoothness)) @@ -875,7 +961,7 @@ def initialize(self): obj, self.invProb.model, n_pw_iter=self.n_pw_iter, - seed=rng, + random_seed=rng, ) ratio = smallness_eigenvalue / smooth_i_eigenvalue @@ -901,13 +987,30 @@ def __init__( self, chi0_ratio=None, n_pw_iter=4, + random_seed: RandomSeed | None = None, seed: RandomSeed | None = None, **kwargs, ): super().__init__(**kwargs) self.chi0_ratio = chi0_ratio self.n_pw_iter = n_pw_iter - self.seed = seed + + # Deprecate seed argument + if seed is not None: + if random_seed is not None: + raise TypeError( + "Cannot pass both 'random_seed' and 'seed'." + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + ) + warnings.warn( + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + FutureWarning, + stacklevel=2, + ) + random_seed = seed + self.random_seed = random_seed @property def chi0_ratio(self): @@ -940,17 +1043,17 @@ def n_pw_iter(self, value): self._n_pw_iter = validate_integer("n_pw_iter", value, min_val=1) @property - def seed(self): + def random_seed(self): """Random seed to initialize with Returns ------- int, numpy.random.Generator or None """ - return self._seed + return self._random_seed - @seed.setter - def seed(self, value): + @random_seed.setter + def random_seed(self, value): try: np.random.default_rng(value) except TypeError as err: @@ -959,11 +1062,20 @@ def seed(self, value): f"a {type(value).__name__}" ) raise TypeError(msg) from err - self._seed = value + self._random_seed = value + + seed = deprecate_property( + random_seed, + "seed", + "random_seed", + removal_version="0.24.0", + future_warn=True, + error=False, + ) def initialize(self): """""" - rng = np.random.default_rng(seed=self.seed) + rng = np.random.default_rng(seed=self.random_seed) if self.verbose: print("Calculating the scaling parameter.") @@ -986,7 +1098,9 @@ def initialize(self): dm_eigenvalue_list = [] for dm in self.dmisfit.objfcts: - dm_eigenvalue_list += [eigenvalue_by_power_iteration(dm, m, seed=rng)] + dm_eigenvalue_list += [ + eigenvalue_by_power_iteration(dm, m, random_seed=rng) + ] self.chi0 = self.chi0_ratio / np.r_[dm_eigenvalue_list] self.chi0 = self.chi0 / np.sum(self.chi0) @@ -1225,7 +1339,7 @@ def print_final_misfit(self): if self.opt.print_type == "ubc": self.opt.print_target = ( ">> Target misfit: %.1f (# of data) is achieved" - ) % (self.target * self.invProb.opt.factor) + ) % (self.target) class MultiTargetMisfits(InversionDirective): @@ -2062,6 +2176,7 @@ def endIter(self): self.outDict[self.opt.iter] = iterDict +@deprecate_class(removal_version="0.24.0", error=False) class Update_IRLS(InversionDirective): f_old = 0 f_min_change = 1e-2 diff --git a/simpeg/directives/sim_directives.py b/simpeg/directives/sim_directives.py index 480cda76ee..f40b828c7d 100644 --- a/simpeg/directives/sim_directives.py +++ b/simpeg/directives/sim_directives.py @@ -270,7 +270,7 @@ def initialize(self): dmis, m, n_pw_iter=self.n_pw_iter, - seed=rng, + random_seed=rng, ) ) @@ -279,7 +279,7 @@ def initialize(self): reg, m, n_pw_iter=self.n_pw_iter, - seed=rng, + random_seed=rng, ) ) diff --git a/simpeg/electromagnetics/analytics/FDEMDipolarfields.py b/simpeg/electromagnetics/analytics/FDEMDipolarfields.py index bfdfee7748..62f6e8d1eb 100644 --- a/simpeg/electromagnetics/analytics/FDEMDipolarfields.py +++ b/simpeg/electromagnetics/analytics/FDEMDipolarfields.py @@ -199,7 +199,7 @@ def J_galvanic_from_ElectricDipoleWholeSpace( Add description of parameters """ - Ex_galvanic, Ey_galvanic, Ez_galvanic = E_galvanic_from_ElectricDipoleWholeSpaced( + Ex_galvanic, Ey_galvanic, Ez_galvanic = E_galvanic_from_ElectricDipoleWholeSpace( XYZ, srcLoc, sig, @@ -229,7 +229,7 @@ def J_inductive_from_ElectricDipoleWholeSpace( Ex_inductive, Ey_inductive, Ez_inductive, - ) = E_inductive_from_ElectricDipoleWholeSpaced( + ) = E_inductive_from_ElectricDipoleWholeSpace( XYZ, srcLoc, sig, @@ -318,6 +318,7 @@ def B_from_ElectricDipoleWholeSpace( kappa=kappa, epsr=epsr, ) + mu = mu_0 * (1 + kappa) Bx = mu * Hx By = mu * Hy Bz = mu * Hz diff --git a/simpeg/electromagnetics/analytics/FDEMcasing.py b/simpeg/electromagnetics/analytics/FDEMcasing.py index 0196d1277b..1510a6a2e9 100644 --- a/simpeg/electromagnetics/analytics/FDEMcasing.py +++ b/simpeg/electromagnetics/analytics/FDEMcasing.py @@ -120,9 +120,10 @@ def getCasingEphiMagDipole( srcloc, obsloc, freq, sigma, a, b, mu=(mu_0, mu_0, mu_0), eps=epsilon_0, moment=1.0 ): mu = np.asarray(mu) + omega = 2 * np.pi * freq return ( 1j - * omega(freq) + * omega * mu * _getCasingHertzMagDipoleDeriv_r( srcloc, obsloc, freq, sigma, a, b, mu, eps, moment diff --git a/simpeg/electromagnetics/base_1d.py b/simpeg/electromagnetics/base_1d.py index a6d89f7b9f..0aa4237b1c 100644 --- a/simpeg/electromagnetics/base_1d.py +++ b/simpeg/electromagnetics/base_1d.py @@ -1,8 +1,9 @@ +from collections import namedtuple + from scipy.constants import mu_0 import numpy as np from scipy import sparse as sp from scipy.special import roots_legendre -from empymod.transform import get_dlf_points from ..simulation import BaseSimulation @@ -17,10 +18,16 @@ validate_integer, ) from .. import props -from empymod.utils import check_hankel +import libdlf __all__ = ["BaseEM1DSimulation"] +HANKEL_FILTERS = {} +for filter_name in libdlf.hankel.__all__: + hankel_filter = getattr(libdlf.hankel, filter_name) + if "j0" in hankel_filter.values and "j1" in hankel_filter.values: + HANKEL_FILTERS[filter_name] = hankel_filter + ############################################################################### # # # Base EM1D Simulation # @@ -95,7 +102,7 @@ def __init__( n_points_per_path=3, **kwargs, ): - super().__init__(mesh=None, **kwargs) + super().__init__(**kwargs) self.sigma = sigma self.rho = rho self.sigmaMap = sigmaMap @@ -137,30 +144,33 @@ def __init__( self.hankel_filter = hankel_filter self.fix_Jmatrix = fix_Jmatrix - # Check input arguments. If self.hankel_filter is not a valid filter, - # it will set it to the default (key_201_2009). - ht, htarg = check_hankel( - "dlf", {"dlf": self.hankel_filter, "pts_per_dec": 0}, 1 - ) - - self._fhtfilt = htarg["dlf"] # Store filter - # self.hankel_pts_per_dec = htarg["pts_per_dec"] # Store pts_per_dec if self.verbose: print(">> Use " + self.hankel_filter + " filter for Hankel Transform") @property def hankel_filter(self): - """The hankely filter to use. + """The hankel filter used. Returns ------- str + + See Also + -------- + libdlf.hankel + The package housing the filter values. """ return self._hankel_filter @hankel_filter.setter def hankel_filter(self, value): - self._hankel_filter = validate_string("hankel_filter", value) + self._hankel_filter = validate_string( + "hankel_filter", value, list(HANKEL_FILTERS.keys()) + ) + base, j0, j1 = HANKEL_FILTERS[self._hankel_filter]() + hank = namedtuple("HankelFilter", "base j0 j1") + self._fhtfilt = hank(base, j0, j1) + self._coefficients_set = False _hankel_pts_per_dec = 0 # Default: Standard DLF @@ -430,9 +440,8 @@ def _compute_hankel_coefficients(self): offsets = src.radius * np.ones(rx.locations.shape[0]) # computations for hankel transform... - lambd, _ = get_dlf_points( - self._fhtfilt, offsets, self._hankel_pts_per_dec - ) + lambd = self._fhtfilt.base / offsets[:, None] + # calculate the source-rx coefficients for the hankel transform C0 = 0.0 C1 = 0.0 @@ -567,8 +576,8 @@ def _compute_hankel_coefficients(self): self._W = self._W.tocsr() @property - def deleteTheseOnModelUpdate(self): - toDelete = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + toDelete = super()._delete_on_model_update if self.fix_Jmatrix is False: toDelete += ["_J", "_jtjdiag"] return toDelete diff --git a/simpeg/electromagnetics/frequency_domain/simulation.py b/simpeg/electromagnetics/frequency_domain/simulation.py index 33f3f424b3..e7be9dc693 100644 --- a/simpeg/electromagnetics/frequency_domain/simulation.py +++ b/simpeg/electromagnetics/frequency_domain/simulation.py @@ -486,7 +486,7 @@ def getSourceTerm(self, freq): return s_m, s_e @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): """List of model-dependent attributes to clean upon model update. Some of the FDEM simulation's attributes are model-dependent. This property specifies @@ -497,7 +497,7 @@ def deleteTheseOnModelUpdate(self): list of str List of the model-dependent attributes to clean upon model update. """ - toDelete = super().deleteTheseOnModelUpdate + toDelete = super()._delete_on_model_update return toDelete + ["_Jmatrix", "_gtgdiag"] diff --git a/simpeg/electromagnetics/frequency_domain/sources.py b/simpeg/electromagnetics/frequency_domain/sources.py index c92ab26b3c..9f7ea1a566 100644 --- a/simpeg/electromagnetics/frequency_domain/sources.py +++ b/simpeg/electromagnetics/frequency_domain/sources.py @@ -473,7 +473,9 @@ def _dipole(self): return self.__dipole def _srcFct(self, obsLoc, coordinates="cartesian"): - return self._dipole.vector_potential(obsLoc, coordinates=coordinates) + out = self._dipole.vector_potential(obsLoc, coordinates=coordinates) + out[np.isnan(out)] = 0 + return out def bPrimary(self, simulation): """Compute primary magnetic flux density. @@ -683,7 +685,9 @@ def _srcFct(self, obsLoc, coordinates="cartesian"): location=self.location, moment=self.moment, ) - return self._dipole.magnetic_flux_density(obsLoc, coordinates=coordinates) + out = self._dipole.magnetic_flux_density(obsLoc, coordinates=coordinates) + out[np.isnan(out)] = 0 + return out def bPrimary(self, simulation): """ @@ -869,7 +873,9 @@ def _srcFct(self, obsLoc, coordinates="cartesian"): radius=self.radius, current=self.current, ) - return self.n_turns * self._loop.vector_potential(obsLoc, coordinates) + out = self._loop.vector_potential(obsLoc, coordinates) + out[np.isnan(out)] = 0 + return self.n_turns * out N = deprecate_property( n_turns, "N", "n_turns", removal_version="0.19.0", error=True diff --git a/simpeg/electromagnetics/natural_source/__init__.py b/simpeg/electromagnetics/natural_source/__init__.py index dca9d80cc5..07cf986b76 100644 --- a/simpeg/electromagnetics/natural_source/__init__.py +++ b/simpeg/electromagnetics/natural_source/__init__.py @@ -23,6 +23,10 @@ .. autosummary:: :toctree: generated/ + receivers.Impedance + receivers.Admittance + receivers.ApparentConductivity + receivers.Tipper receivers.PointNaturalSource receivers.Point3DTipper diff --git a/simpeg/electromagnetics/natural_source/fields.py b/simpeg/electromagnetics/natural_source/fields.py index 2493c7f0bd..3ba8507807 100644 --- a/simpeg/electromagnetics/natural_source/fields.py +++ b/simpeg/electromagnetics/natural_source/fields.py @@ -681,7 +681,7 @@ def _b_pyDeriv(self, src, du_dm_v, adjoint=False): # Primary does not depend on u return np.array( self._b_pyDeriv_u(src, du_dm_v, adjoint) - + self._b_pyDeriv_m(src, v, adjoint), + + self._b_pyDeriv_m(src, du_dm_v, adjoint), complex, ) diff --git a/simpeg/electromagnetics/natural_source/receivers.py b/simpeg/electromagnetics/natural_source/receivers.py index 75498271f5..dcf9a86969 100644 --- a/simpeg/electromagnetics/natural_source/receivers.py +++ b/simpeg/electromagnetics/natural_source/receivers.py @@ -1,8 +1,13 @@ -from ...utils.code_utils import deprecate_class, validate_string - +from ...utils.code_utils import ( + validate_string, + validate_type, + validate_ndarray_with_shape, + deprecate_class, +) +import warnings import numpy as np from scipy.constants import mu_0 -import scipy.sparse as sp +from scipy.sparse import csr_matrix from ...survey import BaseRx @@ -10,68 +15,236 @@ def _alpha(src): return 1 / (2 * np.pi * mu_0 * src.frequency) -class PointNaturalSource(BaseRx): - """Point receiver class for magnetotelluric simulations. +class BaseNaturalSourceRx(BaseRx): + """ + Base class for natural source electromagnetic receivers. - Assumes that the data locations are standard xyz coordinates; - i.e. (x,y,z) is (Easting, Northing, up). + Parameters + ---------- + locations1, locations2 : (n_loc, n_dim) array_like + Locations where the two fields are measured. + **kwargs + Additional keyword arguments passed to `simpeg.BaseRx`. + """ + + _loc_names = ("First", "Second") + + def __init__(self, locations1, locations2, **kwargs): + super().__init__(locations=(locations1, locations2), **kwargs) + + @property + def locations(self): + """Locations of the two field measurements. + + Locations where the two fields are measured for the receiver. + The name of the field is dependant upon the MT receiver, but + for common MT receivers, these would be the electric field + and magnetic field measurement locations. + + Returns + ------- + locations1, locations2 : (n_loc, n_dim) numpy.ndarray + """ + return self._locations + + @locations.setter + def locations(self, locs): + locs = validate_type("locations", locs, tuple) + try: + loc0, loc1 = locs + except ValueError: + raise ValueError( + f"locations must have two values to unpack, got {len(locs)}" + ) + # check that they are both numpy arrays and have the same shape. + loc0 = validate_ndarray_with_shape( + f"{self._loc_names[0]} locations", loc0, shape=("*", "*") + ) + loc1 = validate_ndarray_with_shape( + f"{self._loc_names[1]} locations", loc1, shape=loc0.shape + ) + self._locations = (loc0, loc1) + # make sure projection matrices are cleared + self._Ps = {} + + @property + def nD(self): + """Number of data associated with the receiver object. + + Returns + ------- + int + Number of data associated with the receiver object. + """ + + return self._locations[0].shape[0] + + def getP(self, mesh, projected_grid, location_id=0): + """Get projection matrix from mesh to specified receiver locations. + + Natural source electromagnetic data may be computed from field measurements + at one or two locations. The `getP` method returns the projection matrix from + the mesh to the appropriate receiver locations. `location_id=0` is used to + project from the mesh to the set of roving receiver locations. `location_id=1` + is used when horizontal fields used to compute NSEM data are measured at a + base station. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh. + projected_grid : str + Define what part of the mesh (i.e. edges, faces, centers, nodes) to + project from. Must be one of:: + + 'Ex', 'edges_x' -> x-component of field defined on x edges + 'Ey', 'edges_y' -> y-component of field defined on y edges + 'Ez', 'edges_z' -> z-component of field defined on z edges + 'Fx', 'faces_x' -> x-component of field defined on x faces + 'Fy', 'faces_y' -> y-component of field defined on y faces + 'Fz', 'faces_z' -> z-component of field defined on z faces + 'N', 'nodes' -> scalar field defined on nodes + 'CC', 'cell_centers' -> scalar field defined on cell centers + 'CCVx', 'cell_centers_x' -> x-component of vector field defined on cell centers + 'CCVy', 'cell_centers_y' -> y-component of vector field defined on cell centers + 'CCVz', 'cell_centers_z' -> z-component of vector field defined on cell centers + + locations_id : int + Receiver locations ID. 0 used for roving locations. 1 used for base station locations. + + Returns + ------- + scipy.sparse.csr_matrix + P, the interpolation matrix. + """ + key = (mesh.n_cells, projected_grid, location_id) + if key in self._Ps: + return self._Ps[key] + locs = self._locations[location_id] + P = mesh.get_interpolation_matrix(locs, projected_grid) + if self.storeProjections: + self._Ps[key] = P + return P + + +class _ElectricAndMagneticReceiver(BaseNaturalSourceRx): + """ + Intermediate class for MT receivers that measure an electric and magnetic field + """ + + _loc_names = ("Electric field", "Magnetic field") + + @property + def locations_e(self): + """Electric field measurement locations + + Returns + ------- + numpy.ndarray + Location where the electric field is measured for all receiver data + """ + return self._locations[0] + + @property + def locations_h(self): + """Magnetic field measurement locations + + Returns + ------- + numpy.ndarray + Location where the magnetic field is measured for all receiver data + """ + return self._locations[1] + + +class Impedance(_ElectricAndMagneticReceiver): + r"""Receiver class for 1D, 2D and 3D impedance data. + + This class is used to simulate data types that can be derived from the impedance tensor: + + .. math:: + \begin{bmatrix} Z_{xx} & Z_{xy} \\ Z_{yx} & Z_{yy} \end{bmatrix} = + \begin{bmatrix} E_x^{(x)} & E_x^{(y)} \\ E_y^{(x)} & E_y^{(y)} \end{bmatrix} \, + \begin{bmatrix} H_x^{(x)} & H_x^{(y)} \\ H_y^{(x)} & H_y^{(y)} \end{bmatrix}^{-1} + + where superscripts :math:`(x)` and :math:`(y)` denote signals corresponding to + incident planewaves whose electric fields are polarized along the x and y-directions + respectively. Electric and magnetic fields do not need to be simulated at the same + location, so this class can be used to simulate quasi-impedance data; i.e. where + the electric fields are measured at a base station. + + Note that in ``simpeg``, natural source EM data are defined according to + standard xyz coordinates; i.e. (x,y,z) is (Easting, Northing, Z +ve up). + + In addition to measuring the real or imaginary component of an impedance tensor + element :math:`Z_{ij}`, the receiver object can be set to measure the + the apparent resistivity: + + .. math:: + \rho_{ij} = \dfrac{| Z_{ij} \, |^2}{\mu_0 \omega} + + or the phase angle: + + .. math:: + \phi_{ij} = \frac{180}{\pi} \, + \tan^{-1} \Bigg ( \dfrac{Im[Z_{ij}]}{Re[Z_{ij}]} \Bigg ) + + where :math:`\mu_0` is the permeability of free-space and :math:`\omega` is the + angular frequency in rad/s. The phase angle is represented in degrees and + is computed by: Parameters ---------- - locations : (n_loc, n_dim) numpy.ndarray - Receiver locations. + locations_e : (n_loc, n_dim) array_like + Locations where the electric fields are measured. + locations_h : (n_loc, n_dim) array_like, optional + Locations where the magnetic fields are measured. Defaults to the same + locations as electric field measurements, `locations_e`. orientation : {'xx', 'xy', 'yx', 'yy'} - MT receiver orientation. - component : {'real', 'imag', 'apparent_resistivity', 'phase'} - MT data type. + Receiver orientation. Specifies whether the receiver's data correspond to + the :math:`Z_{xx}`, :math:`Z_{xy}`, :math:`Z_{yx}` or :math:`Z_{yy}` impedance. + The data type is specified by the `component` input argument. + component : {'real', 'imag', 'apparent_resistivity', 'phase', 'complex'} + Data type. For the impedance element :math:`Z_{ij}` specified by the `orientation` + input argument, the receiver can be set to compute the following: + - 'real': Real component of the impedance (V/A) + - 'imag': Imaginary component of the impedance (V/A) + - 'rho': Apparent resistivity (:math:`\Omega m`) + - 'phase': Phase angle (degrees) + - 'complex': The complex impedance is returned. Do not use for inversion! + storeProjections : bool + Whether to cache to internal projection matrices. """ def __init__( self, - locations=None, - orientation="xy", - component="real", - locations_e=None, + locations_e, locations_h=None, + orientation="xx", + component="real", storeProjections=False, ): + if locations_h is None: + locations_h = locations_e + super().__init__( + locations1=locations_e, + locations2=locations_h, + storeProjections=storeProjections, + ) self.orientation = orientation self.component = component - # check if locations_e or h have been provided - if (locations_e is not None) and (locations_h is not None): - # check that locations are same size - if locations_e.size == locations_h.size: - self._locations_e = locations_e - self._locations_h = locations_h - else: - raise Exception("location h needs to be same size as location e") - - locations = np.hstack([locations_e, locations_h]) - elif locations is not None: - # check shape of locations - if isinstance(locations, list): - if len(locations) == 2: - self._locations_e = locations[0] - self._locations_h = locations[1] - elif len(locations) == 1: - self._locations_e = locations[0] - self._locations_h = locations[0] - else: - raise Exception("incorrect size of list, must be length of 1 or 2") - locations = locations[0] - elif isinstance(locations, np.ndarray): - self._locations_e = locations - self._locations_h = locations - else: - raise Exception("locations need to be either a list or numpy array") - else: - locations = np.array([[0.0]]) - super().__init__(locations, storeProjections=storeProjections) - @property def component(self): - """Data type; i.e. "real", "imag", "apparent_resistivity", "phase" + r"""Data type; i.e. "real", "imag", "apparent_resistivity", "phase" + + For the impedance element :math:`Z_{ij}`, the `component` property specifies + whether the data are: + - 'real': Real component of the impedance (V/A) + - 'imag': Imaginary component of the impedance (V/A) + - 'rho': Apparent resistivity (:math:`\Omega m`) + - 'phase': Phase angle (degrees) + - 'complex': Complex impedance (V/A) Returns ------- @@ -101,17 +274,22 @@ def component(self, var): "rhoa", ), ("phase", "phi"), + "complex", ], ) @property def orientation(self): - """Orientation of the receiver. + """Receiver orientation. + + Specifies whether the receiver's data correspond to + the :math:`Z_{xx}`, :math:`Z_{xy}`, :math:`Z_{yx}` or :math:`Z_{yy}` impedance. + The data type is specified by the `component` input argument. Returns ------- str - Orientation of the receiver. One of {'xx', 'xy', 'yx', 'yy'} + Receiver orientation. One of {'xx', 'xy', 'yx', 'yy'} """ return self._orientation @@ -121,72 +299,6 @@ def orientation(self, var): "orientation", var, string_list=("xx", "xy", "yx", "yy") ) - @property - def locations_e(self): - """Electric field measurement locations - - Returns - ------- - numpy.ndarray - Location where the electric field is measured for all receiver data - """ - return self._locations_e - - @property - def locations_h(self): - """Magnetic field measurement locations - - Returns - ------- - numpy.ndarray - Location where the magnetic field is measured for all receiver data - """ - return self._locations_h - - def getP(self, mesh, projected_grid, field="e"): - """Projection matrices for all components collected by the receivers - - Note projection matrices are stored as a dictionary listed by meshes. - - Parameters - ---------- - mesh : discretize.base.BaseMesh - The mesh on which the discrete set of equations is solved - projected_grid : str - Define what part of the mesh (i.e. edges, faces, centers, nodes) to - project from. Must be one of:: - - 'Ex', 'edges_x' -> x-component of field defined on x edges - 'Ey', 'edges_y' -> y-component of field defined on y edges - 'Ez', 'edges_z' -> z-component of field defined on z edges - 'Fx', 'faces_x' -> x-component of field defined on x faces - 'Fy', 'faces_y' -> y-component of field defined on y faces - 'Fz', 'faces_z' -> z-component of field defined on z faces - 'N', 'nodes' -> scalar field defined on nodes - 'CC', 'cell_centers' -> scalar field defined on cell centers - 'CCVx', 'cell_centers_x' -> x-component of vector field defined on cell centers - 'CCVy', 'cell_centers_y' -> y-component of vector field defined on cell centers - 'CCVz', 'cell_centers_z' -> z-component of vector field defined on cell centers - - field : str, default = "e" - Whether to project electric or magnetic fields from mesh. - Choose "e" or "h" - """ - if mesh.dim < 3: - return super().getP(mesh, projected_grid) - - if (mesh.n_cells, projected_grid, field) in self._Ps: - return self._Ps[(mesh.n_cells, projected_grid, field)] - - if field == "e": - locs = self.locations_e - else: - locs = self.locations_h - P = mesh.get_interpolation_matrix(locs, projected_grid) - if self.storeProjections: - self._Ps[(mesh.n_cells, projected_grid, field)] = P - return P - def _eval_impedance(self, src, mesh, f): if mesh.dim < 3 and self.orientation in ["xx", "yy"]: return 0.0 @@ -194,12 +306,12 @@ def _eval_impedance(self, src, mesh, f): h = f[src, "h"] if mesh.dim == 3: if self.orientation[0] == "x": - e = self.getP(mesh, "Ex", "e") @ e + e = self.getP(mesh, "Ex", 0) @ e else: - e = self.getP(mesh, "Ey", "e") @ e + e = self.getP(mesh, "Ey", 0) @ e - hx = self.getP(mesh, "Fx", "h") @ h - hy = self.getP(mesh, "Fy", "h") @ h + hx = self.getP(mesh, "Fx", 1) @ h + hy = self.getP(mesh, "Fy", 1) @ h if self.orientation[1] == "x": h = hy else: @@ -226,7 +338,7 @@ def _eval_impedance(self, src, mesh, f): # need to negate if 'yx' and fields are xy # and as well if 'xy' and fields are 'yx' if mesh.dim == 1 and self.orientation != f.field_directions: - bot = -bot + bot *= -1 return top / bot def _eval_impedance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): @@ -239,14 +351,14 @@ def _eval_impedance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=Fals h = f[src, "h"] if mesh.dim == 3: if self.orientation[0] == "x": - Pe = self.getP(mesh, "Ex", "e") + Pe = self.getP(mesh, "Ex", 0) e = Pe @ e else: - Pe = self.getP(mesh, "Ey", "e") + Pe = self.getP(mesh, "Ey", 0) e = Pe @ e - Phx = self.getP(mesh, "Fx", "h") - Phy = self.getP(mesh, "Fy", "h") + Phx = self.getP(mesh, "Fx", 1) + Phy = self.getP(mesh, "Fy", 1) hx = Phx @ h hy = Phy @ h if self.orientation[1] == "x": @@ -275,7 +387,7 @@ def _eval_impedance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=Fals bot = PH @ h[:, 0] if mesh.dim == 1 and self.orientation != f.field_directions: - bot = -bot + bot *= -1 imp = top / bot @@ -315,8 +427,8 @@ def _eval_impedance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=Fals else: ghx_v -= gh_v - gh_v = Phx.T @ sp.csr_matrix(ghx_v) + Phy.T @ sp.csr_matrix(ghy_v) - ge_v = Pe.T @ sp.csr_matrix(ge_v) + gh_v = Phx.T @ csr_matrix(ghx_v) + Phy.T @ csr_matrix(ghy_v) + ge_v = Pe.T @ csr_matrix(ge_v) else: if mesh.dim == 1 and self.orientation != f.field_directions: gbot_v = -gbot_v @@ -357,7 +469,7 @@ def _eval_impedance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=Fals dh_v = PH @ f._hDeriv(src, du_dm_v, v, adjoint=False) if mesh.dim == 1 and self.orientation != f.field_directions: - dh_v = -dh_v + dh_v *= -1 imp_deriv = (de_v - imp * dh_v) / bot @@ -377,29 +489,26 @@ def _eval_impedance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=Fals rx_deriv = getattr(imp_deriv, self.component) return rx_deriv - def eval(self, src, mesh, f, return_complex=False): # noqa: A003 - """ - Project the fields to natural source data. + def eval(self, src, mesh, f): # noqa: A003 + """Compute receiver data from the discrete field solution. Parameters ---------- - src : simpeg.electromagnetics.frequency_domain.sources.BaseFDEMSrc - NSEM source - mesh : discretize.TensorMesh mesh - Mesh on which the discretize solution is obtained + src : .frequency_domain.sources.BaseFDEMSrc + NSEM source. + mesh : discretize.TensorMesh + Mesh on which the discretize solution is obtained. f : simpeg.electromagnetics.frequency_domain.fields.FieldsFDEM - NSEM fields object of the source - return_complex : bool (optional) - Flag for return the complex evaluation + NSEM fields object of the source. Returns ------- numpy.ndarray - Evaluated data for the receiver + Evaluated data for the receiver. """ imp = self._eval_impedance(src, mesh, f) - if return_complex: + if self.component == "complex": return imp elif self.component == "apparent_resistivity": return _alpha(src) * (imp.real**2 + imp.imag**2) @@ -409,102 +518,206 @@ def eval(self, src, mesh, f, return_complex=False): # noqa: A003 return getattr(imp, self.component) def evalDeriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): - """Derivative of projection with respect to the fields + r"""Derivative of data with respect to the fields. + + Let :math:`\mathbf{d}` represent the data corresponding the receiver object. + And let :math:`\mathbf{u}` represent the discrete numerical solution of the + fields on the mesh. Where :math:`\mathbf{P}` is a projection function that + maps from the fields to the data, i.e.: + + .. math:: + \mathbf{d} = \mathbf{P}(\mathbf{u}) + + this method computes and returns the derivative: + + .. math:: + \dfrac{\partial \mathbf{d}}{\partial \mathbf{u}} = + \dfrac{\partial [ \mathbf{P} (\mathbf{u}) ]}{\partial \mathbf{u}} Parameters ---------- - str : simpeg.electromagnetics.frequency_domain.sources.BaseFDEMSrc - NSEM source + str : .frequency_domain.sources.BaseFDEMSrc + The NSEM source. mesh : discretize.TensorMesh - Mesh on which the discretize solution is obtained + Mesh on which the discretize solution is obtained. f : simpeg.electromagnetics.frequency_domain.fields.FieldsFDEM - NSEM fields object of the source - du_dm_v : None, + NSEM fields object for the source. + du_dm_v : None, optional Supply pre-computed derivative? - v : numpy.ndarray + v : numpy.ndarray, optional Vector of size - adjoint : bool, default = ``False`` - If ``True``, compute the adjoint operation + adjoint : bool, optional + Whether to compute the ajoint operation. Returns ------- numpy.ndarray - Calculated derivative (nD,) (adjoint=False) and (nP,2) (adjoint=True) for both polarizations + Calculated derivative (n_data,) if `adjoint` is ``False``, and (n_param, 2) if `adjoint` + is ``True``, for both polarizations. """ + if self.component == "complex": + raise NotImplementedError( + "complex valued data derivative is not implemented." + ) return self._eval_impedance_deriv( src, mesh, f, du_dm_v=du_dm_v, v=v, adjoint=adjoint ) -class Point3DTipper(PointNaturalSource): - """Point receiver class for Z-axis tipper simulations. +class Tipper(BaseNaturalSourceRx): + r"""Receiver class for tipper data (3D problems only). - Assumes that the data locations are standard xyz coordinates; - i.e. (x,y,z) is (Easting, Northing, up). + This class can be used to simulate AFMag tipper data, defined according to: + + .. math:: + \begin{bmatrix} T_{zx} & T_{zy} \end{bmatrix} = + \begin{bmatrix} H_x^{(x)} & H_y^{(x)} \\ H_x^{(y)} & H_y^{(y)} \end{bmatrix}^{-1} \, + \begin{bmatrix} H_z^{(x)} \\ H_z^{(y)} \end{bmatrix} + + where superscripts :math:`(x)` and :math:`(y)` denote signals corresponding to + incident planewaves whose electric fields are polarized along the x and y-directions + respectively. Note that in ``simpeg``, natural source EM data are defined according to + standard xyz coordinates; i.e. (x,y,z) is (Easting, Northing, Z +ve up). + + The receiver class can also be used to simulate a diverse set of Tipper-like data types + when horizontal magnetic fields are measured at a remote base station. These are defined + according to: + + .. math:: + \begin{bmatrix} T_{xx} & T_{yx} & T_{zx} \\ T_{xy} & T_{yy} & T_{zy} \end{bmatrix} = + \begin{bmatrix} H_x^{(x)} & H_y^{(x)} \\ H_x^{(y)} & H_y^{(y)} \end{bmatrix}_b^{-1} \, + \begin{bmatrix} H_x^{(x)} & H_y^{(x)} & H_z^{(x)} \\ H_x^{(y)} & H_y^{(y)} & H_z^{(y)} \end{bmatrix}_r + + where subscript :math:`b` denotes the base station location and subscript + :math:`r` denotes the mobile receiver location. Parameters ---------- - locations : (n_loc, n_dim) numpy.ndarray - Receiver locations. - orientation : str, default = 'zx' - NSEM receiver orientation. Must be one of {'zx', 'zy'} - component : str, default = 'real' - NSEM data type. Choose one of {'real', 'imag', 'apparent_resistivity', 'phase'} + locations_h : (n_loc, n_dim) array_like + Locations where the roving magnetic fields are measured. + locations_base : (n_loc, n_dim) array_like, optional + Locations where the base station magnetic fields are measured. Defaults to + the same locations as the roving magnetic fields measurements, + `locations_r`. + orientation : {'xx', 'yx', 'zx', 'zy', 'yy', 'zy'} + Specifies the tipper element :math:`T_{ij}` corresponding to the data. + component : {'real', 'imag', 'complex'} + Tipper data type. For the tipper element :math:`T_{ij}` specified by the `orientation` + input argument, the receiver can be set to compute the following: + - 'real': Real component of the tipper (unitless) + - 'imag': Imaginary component of the tipper (unitless) + - 'complex': The complex tipper is returned. Do not use for inversion! + storeProjections : bool + Whether to cache to internal projection matrices. """ + _loc_names = ("Roving magnetic field", "Base station magnetic field") + def __init__( self, - locations, - orientation="zx", + locations_h, + locations_base=None, + orientation="xx", component="real", - locations_e=None, - locations_h=None, storeProjections=False, ): + if locations_base is None: + locations_base = locations_h super().__init__( - locations=locations, - orientation=orientation, - component=component, - locations_e=locations_e, - locations_h=locations_h, + locations1=locations_h, + locations2=locations_base, storeProjections=storeProjections, ) + self.orientation = orientation + self.component = component + + @property + def locations_h(self): + """Roving magnetic field measurement locations. + + Returns + ------- + numpy.ndarray + Roving locations where the magnetic field is measured for all receiver data. + """ + return self._locations[0] + + @property + def locations_base(self): + """Base station magnetic field measurement locations. + + Returns + ------- + numpy.ndarray + Base station locations where the horizontal magnetic fields are measured. + """ + return self._locations[1] + + @property + def component(self): + r"""Tipper data type; i.e. "real", "imag" + + For the tipper element :math:`T_{ij}`, the `component` property specifies + whether the data are: + - 'real': Real component of the tipper (unitless) + - 'imag': Imaginary component of the tipper (unitless) + - 'complex': Complex tipper (unitless) + + Returns + ------- + str + Tipper data type; i.e. "real", "imag", "complex" + """ + return self._component + + @component.setter + def component(self, var): + self._component = validate_string( + "component", + var, + [ + ("real", "re", "in-phase", "in phase"), + ("imag", "imaginary", "im", "out-of-phase", "out of phase"), + "complex", + ], + ) @property def orientation(self): - """Orientation of the receiver. + """Specifies the tipper element :math:`T_{ij}` corresponding to the data. Returns ------- str - Orientation of the receiver. One of {'zx', 'zy'} + Specifies the tipper element :math:`T_{ij}` corresponding to the data. + One of {'xx', 'yx', 'zx', 'zy', 'yy', 'zy'}. """ return self._orientation @orientation.setter def orientation(self, var): self._orientation = validate_string( - "orientation", var, string_list=("zx", "zy") + "orientation", var, string_list=("zx", "zy", "xx", "xy", "yx", "yy") ) def _eval_tipper(self, src, mesh, f): # will grab both primary and secondary and sum them! + h = f[src, "h"] - if not isinstance(f, np.ndarray): - h = f[src, "h"] - else: - h = f + Phx = self.getP(mesh, "Fx", 1) + Phy = self.getP(mesh, "Fy", 1) + Pho = self.getP(mesh, "F" + self.orientation[0], 0) - hx = self.getP(mesh, "Fx", "h") @ h - hy = self.getP(mesh, "Fy", "h") @ h - hz = self.getP(mesh, "Fz", "h") @ h + hx = Phx @ h + hy = Phy @ h + ho = Pho @ h if self.orientation[1] == "x": h = -hy else: h = hx - top = h[:, 0] * hz[:, 1] - h[:, 1] * hz[:, 0] + top = h[:, 0] * ho[:, 1] - h[:, 1] * ho[:, 0] bot = hx[:, 0] * hy[:, 1] - hx[:, 1] * hy[:, 0] return top / bot @@ -516,9 +729,9 @@ def _eval_tipper_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): else: h = f - Phx = self.getP(mesh, "Fx", "h") - Phy = self.getP(mesh, "Fy", "h") - Phz = self.getP(mesh, "Fz", "h") + Phx = self.getP(mesh, "Fx", 1) + Phy = self.getP(mesh, "Fy", 1) + Phz = self.getP(mesh, "Fz", 1) hx = Phx @ h hy = Phy @ h hz = Phz @ h @@ -556,9 +769,9 @@ def _eval_tipper_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): ghx_v += gh_v gh_v = ( - Phx.T @ sp.csr_matrix(ghx_v) - + Phy.T @ sp.csr_matrix(ghy_v) - + Phz.T @ sp.csr_matrix(ghz_v) + Phx.T @ csr_matrix(ghx_v) + + Phy.T @ csr_matrix(ghy_v) + + Phz.T @ csr_matrix(ghz_v) ) return f._hDeriv(src, None, gh_v, adjoint=True) @@ -586,81 +799,598 @@ def _eval_tipper_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): return (bot * dtop_v - top * dbot_v) / (bot * bot) - def eval(self, src, mesh, f, return_complex=False): # noqa: A003 + def eval(self, src, mesh, f): # noqa: A003 + tip = self._eval_tipper(src, mesh, f) + if self.component == "complex": + return tip + else: + return getattr(tip, self.component) + + def evalDeriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): + # Docstring inherited from parent class (Impedance). + if self.component == "complex": + raise NotImplementedError( + "complex valued data derivative is not implemented." + ) + if adjoint: + if self.component == "imag": + v = -1j * v + imp_deriv = self._eval_tipper_deriv( + src, mesh, f, du_dm_v=du_dm_v, v=v, adjoint=adjoint + ) + if adjoint: + return imp_deriv + return getattr(imp_deriv, self.component) + + +class Admittance(_ElectricAndMagneticReceiver): + r"""Receiver class for data types derived from the 3D admittance tensor. + + This class is used to simulate data types that can be derived from the admittance tensor: + + .. math:: + \begin{bmatrix} Y_{xx} & Y_{xy} \\ Y_{yx} & Y_{yy} \\ Y_{zx} & Y_{zy} \end{bmatrix} = + \begin{bmatrix} H_x^{(x)} & H_x^{(y)} \\ H_y^{(x)} & H_y^{(y)} \\ H_z^{(x)} & H_z^{(y)} \end{bmatrix}_{\, r} \; + \begin{bmatrix} E_x^{(x)} & E_x^{(y)} \\ E_y^{(x)} & E_y^{(y)} \end{bmatrix}_b^{-1} + + where superscripts :math:`(x)` and :math:`(y)` denote signals corresponding to + incident planewaves whose electric fields are polarized along the x and y-directions + respectively. Note that in simpeg, natural source EM data are defined according to + standard xyz coordinates; i.e. (x,y,z) is (Easting, Northing, Z +ve up). + + Parameters + ---------- + locations_e : (n_loc, n_dim) array_like + Locations where the electric fields are measured. + locations_h : (n_loc, n_dim) array_like, optional + Locations where the magnetic fields are measured. Defaults to the same + locations as electric field measurements, `locations_e`. + orientation : {'xx', 'xy', 'yx', 'yy', 'zx', 'zy'} + Admittance receiver orientation. Specifies the admittance tensor element + :math:`Y_{ij}` corresponding to the data. The data type is specified by + the `component` input argument. + component : {'real', 'imag', 'complex'} + Admittance data type. For the admittance element :math:`Y_{ij}` specified by the + `orientation` input argument, the receiver can be set to compute the following: + - 'real': Real component of the admittance (A/V) + - 'imag': Imaginary component of the admittance (A/V) + - 'complex': The complex admittance is returned. Do not use for inversion! + storeProjections : bool + Whether to cache to internal projection matrices. + """ + + def __init__( + self, + locations_e, + locations_h=None, + orientation="xx", + component="real", + storeProjections=False, + ): + if locations_h is None: + locations_h = locations_e + super().__init__( + locations1=locations_e, + locations2=locations_h, + storeProjections=storeProjections, + ) + self.orientation = orientation + self.component = component + + @property + def orientation(self): + """Receiver orientation. + + Specifies whether the receiver's data correspond to + the :math:`Y_{xx}`, :math:`Y_{xy}`, :math:`Y_{yx}`, :math:`Y_{yy}`, + :math:`Y_{zx}`, or :math:`Y_{zy}` admittance. + + Returns + ------- + str + Receiver orientation. One of {'xx', 'xy', 'yx', 'yy', 'zx', 'zy'} """ - Project the fields to natural source data. + return self._orientation + + @orientation.setter + def orientation(self, var): + self._orientation = validate_string( + "orientation", var, string_list=("xx", "xy", "yx", "yy", "zx", "zy") + ) + + @property + def component(self): + r"""Admittance data type. + + For the admittance element :math:`Y_{ij}`, the `component` property specifies + whether the data are: + - 'real': Real component of the admittance (A/V) + - 'imag': Imaginary component of the admittance (A/V) + - 'complex': Complex admittance (A/V) + + Returns + ------- + str + Data type; i.e. "real", "imag". + """ + return self._component + + @component.setter + def component(self, var): + self._component = validate_string( + "component", + var, + [ + ("real", "re", "in-phase", "in phase"), + ("imag", "imaginary", "im", "out-of-phase", "out of phase"), + "complex", + ], + ) + + def _eval_admittance(self, src, mesh, f): + if mesh.dim < 3: + raise NotImplementedError( + "Admittance receiver not implemented for dim < 3." + ) + + e = f[src, "e"] + h = f[src, "h"] + + ex = self.getP(mesh, "Ex", 0) @ e + ey = self.getP(mesh, "Ey", 0) @ e + + h = self.getP(mesh, "F" + self.orientation[0], 1) @ h + + if self.orientation[1] == "x": + top = h[:, 0] * ey[:, 1] - h[:, 1] * ex[:, 1] + else: + top = -h[:, 0] * ey[:, 0] + h[:, 1] * ex[:, 0] + + bot = ex[:, 0] * ey[:, 1] - ex[:, 1] * ey[:, 0] + + return top / bot + + def _eval_admittance_deriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): + if mesh.dim < 3: + raise NotImplementedError( + "Admittance receiver not implemented for dim < 3." + ) + + # Compute admittances + e = f[src, "e"] + h = f[src, "h"] + + Pex = self.getP(mesh, "Ex", 0) + Pey = self.getP(mesh, "Ey", 0) + Ph = self.getP(mesh, "F" + self.orientation[0], 1) + + ex = Pex @ e + ey = Pey @ e + h = Ph @ h + + if self.orientation[1] == "x": + p_ind = 1 + fact = 1.0 + else: + p_ind = 0 + fact = -1.0 + + top = fact * (h[:, 0] * ey[:, p_ind] - h[:, 1] * ex[:, p_ind]) + bot = ex[:, 0] * ey[:, 1] - ex[:, 1] * ey[:, 0] + adm = top / bot + + # ADJOINT + if adjoint: + if self.component == "imag": + v = -1j * v + + # J_T * v = d_top_T * a_v + d_bot_T * b + a_v = fact * v / bot # term 1 + b_v = -adm * v / bot # term 2 + + ex_v = np.c_[ey[:, 1], -ey[:, 0]] * b_v[:, None] # terms dex in bot + ey_v = np.c_[-ex[:, 1], ex[:, 0]] * b_v[:, None] # terms dey in bot + ex_v[:, p_ind] -= h[:, 1] * a_v # add terms dex in top + ey_v[:, p_ind] += h[:, 0] * a_v # add terms dey in top + e_v = Pex.T @ ex_v + Pey.T @ ey_v + + h_v = np.c_[ey[:, p_ind], -ex[:, p_ind]] * a_v[:, None] # h in top + h_v = Ph.T @ h_v + + fu_e_v, fm_e_v = f._eDeriv(src, None, e_v, adjoint=True) + fu_h_v, fm_h_v = f._hDeriv(src, None, h_v, adjoint=True) + + return fu_e_v + fu_h_v, fm_e_v + fm_h_v + + # JVEC + de_v = f._eDeriv(src, du_dm_v, v, adjoint=False) + dh_v = Ph @ f._hDeriv(src, du_dm_v, v, adjoint=False) + + dex_v = Pex @ de_v + dey_v = Pey @ de_v + + dtop_v = fact * ( + h[:, 0] * dey_v[:, p_ind] + + dh_v[:, 0] * ey[:, p_ind] + - h[:, 1] * dex_v[:, p_ind] + - dh_v[:, 1] * ex[:, p_ind] + ) + dbot_v = ( + ex[:, 0] * dey_v[:, 1] + + dex_v[:, 0] * ey[:, 1] + - ex[:, 1] * dey_v[:, 0] + - dex_v[:, 1] * ey[:, 0] + ) + adm_deriv = (bot * dtop_v - top * dbot_v) / (bot * bot) + + return getattr(adm_deriv, self.component) + + def eval(self, src, mesh, f): # noqa: A003 + # Docstring inherited from parent class (Impedance). + adm = self._eval_admittance(src, mesh, f) + if self.component == "complex": + return adm + return getattr(adm, self.component) + + def evalDeriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): + # Docstring inherited from parent class (Impedance). + if self.component == "complex": + raise NotImplementedError( + "complex valued data derivative is not implemented." + ) + return self._eval_admittance_deriv( + src, mesh, f, du_dm_v=du_dm_v, v=v, adjoint=adjoint + ) + + +class ApparentConductivity(_ElectricAndMagneticReceiver): + r"""Receiver class for simulating apparent conductivity data (3D problems only). + + This class is used to simulate apparent conductivity data, in S/m, as defined by: + + .. math:: + \sigma_{app} = \mu_0 \omega \dfrac{\big | \vec{H} \big |^2}{\big | \vec{E} \big |^2} + + where :math:`\omega` is the angular frequency in rad/s, + + .. math:: + \big | \vec{H} \big | = \Big [ H_x^2 + H_y^2 + H_z^2 \Big ]^{1/2} + + and + + .. math:: + \big | \vec{E} \big | = \Big [ E_x^2 + E_y^2 \Big ]^{1/2} + + Parameters + ---------- + locations_e : (n_loc, n_dim) array_like + Locations where the electric fields are measured. + locations_h : (n_loc, n_dim) array_like, optional + Locations where the magnetic fields are measured. Defaults to the same + locations as electric field measurements, `locations_e`. + storeProjections : bool + Whether to cache to internal projection matrices. + """ + + def __init__(self, locations_e, locations_h=None, storeProjections=False): + if locations_h is None: + locations_h = locations_e + super().__init__( + locations1=locations_e, + locations2=locations_h, + storeProjections=storeProjections, + ) + + def _eval_apparent_conductivity(self, src, mesh, f): + if mesh.dim < 3: + raise NotImplementedError( + "ApparentConductivity receiver not implemented for dim < 3." + ) + + e = f[src, "e"] + h = f[src, "h"] + + Pex = self.getP(mesh, "Ex", 0) + Pey = self.getP(mesh, "Ey", 0) + Phx = self.getP(mesh, "Fx", 1) + Phy = self.getP(mesh, "Fy", 1) + Phz = self.getP(mesh, "Fz", 1) + + ex = np.sum(Pex @ e, axis=-1) + ey = np.sum(Pey @ e, axis=-1) + hx = np.sum(Phx @ h, axis=-1) + hy = np.sum(Phy @ h, axis=-1) + hz = np.sum(Phz @ h, axis=-1) + + top = np.abs(hx) ** 2 + np.abs(hy) ** 2 + np.abs(hz) ** 2 + bot = np.abs(ex) ** 2 + np.abs(ey) ** 2 + + return (2 * np.pi * src.frequency * mu_0) * top / bot + + def _eval_apparent_conductivity_deriv( + self, src, mesh, f, du_dm_v=None, v=None, adjoint=False + ): + if mesh.dim < 3: + raise NotImplementedError( + "Admittance receiver not implemented for dim < 3." + ) + + # Compute admittances + e = f[src, "e"] + h = f[src, "h"] + + Pex = self.getP(mesh, "Ex", 0) + Pey = self.getP(mesh, "Ey", 0) + Phx = self.getP(mesh, "Fx", 1) + Phy = self.getP(mesh, "Fy", 1) + Phz = self.getP(mesh, "Fz", 1) + + ex = np.sum(Pex @ e, axis=-1) + ey = np.sum(Pey @ e, axis=-1) + hx = np.sum(Phx @ h, axis=-1) + hy = np.sum(Phy @ h, axis=-1) + hz = np.sum(Phz @ h, axis=-1) + + fact = 2 * np.pi * src.frequency * mu_0 + top = np.abs(hx) ** 2 + np.abs(hy) ** 2 + np.abs(hz) ** 2 + bot = np.abs(ex) ** 2 + np.abs(ey) ** 2 + + # ADJOINT + if adjoint: + # Compute: J_T * v = d_top_T * a_v + d_bot_T * b + a_v = fact * v / bot # term 1 + b_v = -fact * top * v / bot**2 # term 2 + + hx *= a_v + hy *= a_v + hz *= a_v + ex *= b_v + ey *= b_v + + e_v = 2 * (Pex.T @ ex + Pey.T @ ey).conjugate() + h_v = 2 * (Phx.T @ hx + Phy.T @ hy + Phz.T @ hz).conjugate() + + fu_e_v, fm_e_v = f._eDeriv(src, None, e_v, adjoint=True) + fu_h_v, fm_h_v = f._hDeriv(src, None, h_v, adjoint=True) + + return fu_e_v + fu_h_v, fm_e_v + fm_h_v + + # JVEC + de_v = f._eDeriv(src, du_dm_v, v, adjoint=False) + dh_v = f._hDeriv(src, du_dm_v, v, adjoint=False) + + dex_v = np.sum(Pex @ de_v, axis=-1) + dey_v = np.sum(Pey @ de_v, axis=-1) + dhx_v = np.sum(Phx @ dh_v, axis=-1) + dhy_v = np.sum(Phy @ dh_v, axis=-1) + dhz_v = np.sum(Phz @ dh_v, axis=-1) + + # Imaginary components cancel and its 2x the real + dtop_v = ( + 2 + * ( + hx * dhx_v.conjugate() + hy * dhy_v.conjugate() + hz * dhz_v.conjugate() + ).real + ) + + dbot_v = 2 * (ex * dex_v.conjugate() + ey * dey_v.conjugate()).real + + return fact * (bot * dtop_v - top * dbot_v) / (bot * bot) + + def eval(self, src, mesh, f): # noqa: A003 + """Compute receiver data from the discrete field solution. Parameters ---------- - src : simpeg.electromagnetics.frequency_domain.sources.BaseFDEMSrc - NSEM source - mesh : discretize.TensorMesh mesh - Mesh on which the discretize solution is obtained + src : .frequency_domain.sources.BaseFDEMSrc + NSEM source. + mesh : discretize.TensorMesh + Mesh on which the discretize solution is obtained. f : simpeg.electromagnetics.frequency_domain.fields.FieldsFDEM - NSEM fields object of the source - return_complex : bool (optional) - Flag for return the complex evaluation + NSEM fields object of the source. Returns ------- numpy.ndarray - Evaluated data for the receiver + Evaluated data for the receiver. """ + return self._eval_apparent_conductivity(src, mesh, f) + + def evalDeriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): + r"""Derivative of data with respect to the fields. - rx_eval_complex = self._eval_tipper(src, mesh, f) + Let :math:`\mathbf{d}` represent the data corresponding the receiver object. + And let :math:`\mathbf{u}` represent the discrete numerical solution of the + fields on the mesh. Where :math:`\mathbf{P}` is a projection function that + maps from the fields to the data, i.e.: - return getattr(rx_eval_complex, self.component) + .. math:: + \mathbf{d} = \mathbf{P}(\mathbf{u}) - def evalDeriv(self, src, mesh, f, du_dm_v=None, v=None, adjoint=False): - """Derivative of projection with respect to the fields + this method computes and returns the derivative: + + .. math:: + \dfrac{\partial \mathbf{d}}{\partial \mathbf{u}} = + \dfrac{\partial [ \mathbf{P} (\mathbf{u}) ]}{\partial \mathbf{u}} Parameters ---------- - str : simpeg.electromagnetics.frequency_domain.sources.BaseFDEMSrc - NSEM source + src : .frequency_domain.sources.BaseFDEMSrc + The NSEM source. mesh : discretize.TensorMesh - Mesh on which the discretize solution is obtained + Mesh on which the discretize solution is obtained. f : simpeg.electromagnetics.frequency_domain.fields.FieldsFDEM - NSEM fields object of the source - du_dm_v : None, + NSEM fields object for the source. + du_dm_v : None, optional Supply pre-computed derivative? - v : numpy.ndarray + v : numpy.ndarray, optional Vector of size - adjoint : bool, default = ``False`` - If ``True``, compute the adjoint operation + adjoint : bool, optional + Whether to compute the ajoint operation. Returns ------- numpy.ndarray - Calculated derivative (nD,) (adjoint=False) and (nP,2) (adjoint=True) for both polarizations + Calculated derivative (n_data,) if `adjoint` is ``False``, and (n_param, 2) if `adjoint` + is ``True``, for both polarizations. """ - - if adjoint: - if self.component == "imag": - v = -1j * v - imp_deriv = self._eval_tipper_deriv( + return self._eval_apparent_conductivity_deriv( src, mesh, f, du_dm_v=du_dm_v, v=v, adjoint=adjoint ) - if adjoint: - return imp_deriv - return getattr(imp_deriv, self.component) -############ -# Deprecated -############ +@deprecate_class(removal_version="0.24.0", future_warn=True, replace_docstring=False) +class PointNaturalSource(Impedance): + """Point receiver class for magnetotelluric simulations. + .. warning:: + This class is deprecated and will be removed in SimPEG v0.24.0. + Please use :class:`.natural_source.receivers.Impedance`. -@deprecate_class(removal_version="0.19.0", error=True) -class Point_impedance1D(PointNaturalSource): - pass + Assumes that the data locations are standard xyz coordinates; + i.e. (x,y,z) is (Easting, Northing, up). + Parameters + ---------- + locations : (n_loc, n_dim) numpy.ndarray + Receiver locations. + orientation : {'xx', 'xy', 'yx', 'yy'} + MT receiver orientation. + component : {'real', 'imag', 'apparent_resistivity', 'phase'} + MT data type. + """ -@deprecate_class(removal_version="0.19.0", error=True) -class Point_impedance3D(PointNaturalSource): - pass + def __init__( + self, + locations=None, + orientation="xy", + component="real", + locations_e=None, + locations_h=None, + **kwargs, + ): + if locations is None: + if (locations_e is None) ^ ( + locations_h is None + ): # if only one of them is none + raise TypeError( + "Either locations or both locations_e and locations_h must be passed" + ) + if locations_e is None and locations_h is None: + warnings.warn( + "Using the default for locations is deprecated behavior. Please explicitly set locations. ", + FutureWarning, + stacklevel=2, + ) + locations_e = np.array([[0.0]]) + locations_h = locations_e + else: # locations was not None + if locations_e is not None or locations_h is not None: + raise TypeError( + "Cannot pass both locations and locations_e or locations_h at the same time." + ) + if isinstance(locations, list): + if len(locations) == 2: + locations_e = locations[0] + locations_h = locations[1] + elif len(locations) == 1: + locations_e = locations[0] + locations_h = locations[0] + else: + raise ValueError("incorrect size of list, must be length of 1 or 2") + else: + locations_e = locations_h = locations + + super().__init__( + locations_e=locations_e, + locations_h=locations_h, + orientation=orientation, + component=component, + **kwargs, + ) + + def eval(self, src, mesh, f, return_complex=False): # noqa: A003 + if return_complex: + warnings.warn( + "Calling with return_complex=True is deprecated in SimPEG 0.23. Instead set rx.component='complex'", + FutureWarning, + stacklevel=2, + ) + temp = self.component + self.component = "complex" + out = super().eval(src, mesh, f) + self.component = temp + else: + out = super().eval(src, mesh, f) + return out + + locations = property(lambda self: self._locations[0], Impedance.locations.fset) + + +@deprecate_class(removal_version="0.24.0", future_warn=True, replace_docstring=False) +class Point3DTipper(Tipper): + """Point receiver class for Z-axis tipper simulations. + + .. warning:: + This class is deprecated and will be removed in SimPEG v0.24.0. + Please use :class:`.natural_source.receivers.Tipper`. + + Assumes that the data locations are standard xyz coordinates; + i.e. (x,y,z) is (Easting, Northing, up). + Parameters + ---------- + locations : (n_loc, n_dim) numpy.ndarray + Receiver locations. + orientation : str, default = 'zx' + NSEM receiver orientation. Must be one of {'zx', 'zy'} + component : str, default = 'real' + NSEM data type. Choose one of {'real', 'imag', 'apparent_resistivity', 'phase'} + """ + + def __init__( + self, + locations, + orientation="zx", + component="real", + locations_e=None, + locations_h=None, + **kwargs, + ): + # note locations_e and locations_h never did anything for this class anyways + # so can just issue a warning here... + if locations_e is not None or locations_h is not None: + warnings.warn( + "locations_e and locations_h are unused for this class", + UserWarning, + stacklevel=2, + ) + if isinstance(locations, list): + if len(locations) < 3: + locations = locations[0] + else: + raise ValueError("incorrect size of list, must be length of 1 or 2") + + super().__init__( + locations_h=locations, + orientation=orientation, + component=component, + **kwargs, + ) + + def eval(self, src, mesh, f, return_complex=False): # noqa: A003 + if return_complex: + warnings.warn( + "Calling with return_complex=True is deprecated in SimPEG 0.23. Instead set rx.component='complex'", + FutureWarning, + stacklevel=2, + ) + temp = self.component + self.component = "complex" + out = super().eval(src, mesh, f) + self.component = temp + else: + out = super().eval(src, mesh, f) + return out -@deprecate_class(removal_version="0.19.0", error=True) -class Point_tipper3D(Point3DTipper): - pass + locations = property(lambda self: self._locations[0], Tipper.locations.fset) diff --git a/simpeg/electromagnetics/natural_source/simulation.py b/simpeg/electromagnetics/natural_source/simulation.py index cd531529a2..651a347957 100644 --- a/simpeg/electromagnetics/natural_source/simulation.py +++ b/simpeg/electromagnetics/natural_source/simulation.py @@ -474,8 +474,8 @@ def boundary_fields(self, model=None): return self._boundary_fields @property - def deleteTheseOnModelUpdate(self): - items = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + items = super()._delete_on_model_update items.append("_boundary_fields") return items @@ -696,8 +696,8 @@ def boundary_fields(self, model=None): return self._boundary_fields @property - def deleteTheseOnModelUpdate(self): - items = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + items = super()._delete_on_model_update items.append("_boundary_fields") return items diff --git a/simpeg/electromagnetics/natural_source/simulation_1d.py b/simpeg/electromagnetics/natural_source/simulation_1d.py index c96656530f..e421a30cca 100644 --- a/simpeg/electromagnetics/natural_source/simulation_1d.py +++ b/simpeg/electromagnetics/natural_source/simulation_1d.py @@ -5,6 +5,7 @@ from ... import props from ...utils import validate_type from ..frequency_domain.survey import Survey +from .receivers import Impedance class Simulation1DRecursive(BaseSimulation): @@ -56,7 +57,7 @@ def __init__( fix_Jmatrix=False, **kwargs, ): - super().__init__(mesh=None, survey=survey, **kwargs) + super().__init__(survey=survey, **kwargs) self.fix_Jmatrix = fix_Jmatrix self.sigma = sigma self.rho = rho @@ -81,6 +82,12 @@ def survey(self): def survey(self, value): if value is not None: value = validate_type("survey", value, Survey, cast=False) + for src in value.source_list: + for rx in src.receiver_list: + if not isinstance(rx, Impedance): + raise NotImplementedError( + f"{type(self).__name__} does not support {type(rx).__name__} receivers, only implemented for 'Impedance'." + ) self._survey = value @property @@ -345,8 +352,8 @@ def Jtvec(self, m, v, f=None): return JTvec @property - def deleteTheseOnModelUpdate(self): - toDelete = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + toDelete = super()._delete_on_model_update if self.fix_Jmatrix: return toDelete else: diff --git a/simpeg/electromagnetics/natural_source/survey.py b/simpeg/electromagnetics/natural_source/survey.py index 935316a955..18023547e2 100644 --- a/simpeg/electromagnetics/natural_source/survey.py +++ b/simpeg/electromagnetics/natural_source/survey.py @@ -5,7 +5,7 @@ from ...data import Data as BaseData from ...utils import mkvc from .sources import PlanewaveXYPrimary -from .receivers import PointNaturalSource, Point3DTipper +from .receivers import Impedance, Tipper from .utils.plot_utils import DataNSEMPlotMethods ######### @@ -85,7 +85,7 @@ def toRecArray(self, returnType="RealImag"): # Note: needs to be written more generally, # using diffterent rxTypes and not all the data at the locations # Assume the same locs for all RX - locs = src.receiver_list[0].locations + locs = src.receiver_list[0].locations_e if locs.shape[1] == 1: locs = np.hstack((np.array([[0.0, 0.0]]), locs)) elif locs.shape[1] == 2: @@ -141,9 +141,11 @@ def fromRecArray(cls, recArray, srcType="primary"): Parameters ---------- recArray : numpy.ndarray - Record array with the data. Has to have ('freq','x','y','z') columns and some ('zxx','zxy','zyx','zyy','tzx','tzy') - srcType : str, default: "primary" - The type of simpeg.EM.NSEM.SrcNSEM to be used. Either "primary" or "total" + Record array with the data. Has to have ('freq','x','y','z') + columns and some ('zxx','zxy','zyx','zyy','tzx','tzy'). + srcType : {"primary"} + The type of simpeg.EM.NSEM.SrcNSEM to be used. It currently accepts + only ``"primary"``. Returns ------- @@ -152,10 +154,13 @@ def fromRecArray(cls, recArray, srcType="primary"): """ if srcType == "primary": src = PlanewaveXYPrimary - elif srcType == "total": - src = Planewave_xy_1DhomotD + # TODO: implement total field formulation + # elif srcType == "total": + # src = Planewave_xy_1DhomotD else: - raise NotImplementedError("{:s} is not a valid source type for NSEMdata") + raise NotImplementedError( + f"Invalid srcType '{srcType}'. " "Only 'primary' is supported." + ) # Find all the frequencies in recArray uniFreq = np.unique(recArray["freq"].copy()) @@ -180,32 +185,40 @@ def fromRecArray(cls, recArray, srcType="primary"): if dFreq[rxType].dtype.name in "complex128": if "t" in rxType: receiver_list.append( - Point3DTipper(locs, rxType[1:3], "real") + Tipper(locs, orientation=rxType[1:3], component="real") ) dataList.append(dFreq[rxType][notNaNind].real.copy()) receiver_list.append( - Point3DTipper(locs, rxType[1:3], "imag") + Tipper(locs, orientation=rxType[1:3], component="imag") ) dataList.append(dFreq[rxType][notNaNind].imag.copy()) elif "z" in rxType: receiver_list.append( - PointNaturalSource(locs, rxType[1:3], "real") + Impedance( + locs, orientation=rxType[1:3], component="real" + ) ) dataList.append(dFreq[rxType][notNaNind].real.copy()) receiver_list.append( - PointNaturalSource(locs, rxType[1:3], "imag") + Impedance( + locs, orientation=rxType[1:3], component="imag" + ) ) dataList.append(dFreq[rxType][notNaNind].imag.copy()) else: component = "real" if "r" in rxType else "imag" if "z" in rxType: receiver_list.append( - PointNaturalSource(locs, rxType[1:3], component) + Impedance( + locs, orientation=rxType[1:3], component=component + ) ) dataList.append(dFreq[rxType][notNaNind].copy()) if "t" in rxType: receiver_list.append( - Point3DTipper(locs, rxType[1:3], component) + Tipper( + locs, orientation=rxType[1:3], component=component + ) ) dataList.append(dFreq[rxType][notNaNind].copy()) diff --git a/simpeg/electromagnetics/natural_source/utils/plot_data_types.py b/simpeg/electromagnetics/natural_source/utils/plot_data_types.py index 7eaee1e8be..aea4821aec 100644 --- a/simpeg/electromagnetics/natural_source/utils/plot_data_types.py +++ b/simpeg/electromagnetics/natural_source/utils/plot_data_types.py @@ -1,5 +1,6 @@ -from matplotlib import pyplot as plt, colors import numpy as np +from matplotlib import colors +from matplotlib import pyplot as plt def plotIsoFreqNSimpedance( diff --git a/simpeg/electromagnetics/natural_source/utils/plot_utils.py b/simpeg/electromagnetics/natural_source/utils/plot_utils.py index 81c6c6b140..4be450445b 100644 --- a/simpeg/electromagnetics/natural_source/utils/plot_utils.py +++ b/simpeg/electromagnetics/natural_source/utils/plot_utils.py @@ -543,7 +543,7 @@ def map_data_locations(self, ax=None, **plot_kwargs): unique_locations = _unique_rows( np.concatenate( [ - rx.locations + rx.locations_e for src in self.survey.source_list for rx in src.receiver_list ] @@ -691,7 +691,7 @@ def _get_map_data(data, frequency, orientation, component, plot_error=False): else: if plot_error: freqs, plot_data, std_data, floor_data = _extract_frequency_data( - data, frequency, orientation, component, return_uncert=error + data, frequency, orientation, component, return_uncert=True ) attr_uncert = std_data * np.abs(plot_data) + floor_data errorbars = [attr_uncert, attr_uncert] @@ -813,7 +813,7 @@ def _extract_frequency_data( # Should be a more specifice Exeption raise Exception("To many Receivers of the same type, orientation and component") - loc_arr = rx.locations + loc_arr = rx.locations_e data_arr = data[src, rx] if return_uncert: std_arr = data.relative_error[src, rx] @@ -844,7 +844,7 @@ def _extract_location_data(data, location, orientation, component, return_uncert else: rx = rx_list[0] - ind_loc = np.sqrt(np.sum((rx.locations[:, :2] - location) ** 2, axis=1)) < 0.1 + ind_loc = np.sqrt(np.sum((rx.locations_e[:, :2] - location) ** 2, axis=1)) < 0.1 if np.any(ind_loc): freq_list.append(src.frequency) data_list.append(data[src, rx][ind_loc]) diff --git a/simpeg/electromagnetics/natural_source/utils/solutions_1d.py b/simpeg/electromagnetics/natural_source/utils/solutions_1d.py index a69239a1ae..54513bab01 100644 --- a/simpeg/electromagnetics/natural_source/utils/solutions_1d.py +++ b/simpeg/electromagnetics/natural_source/utils/solutions_1d.py @@ -1,7 +1,7 @@ import numpy as np from scipy.constants import mu_0 -from .... import Solver +from pymatsolver import Solver from ....utils import sdiag from .analytic_1d import getEHfields diff --git a/simpeg/electromagnetics/natural_source/utils/source_utils.py b/simpeg/electromagnetics/natural_source/utils/source_utils.py index 7687ff5894..822c04d2c5 100644 --- a/simpeg/electromagnetics/natural_source/utils/source_utils.py +++ b/simpeg/electromagnetics/natural_source/utils/source_utils.py @@ -43,7 +43,7 @@ def homo1DModelSource(mesh, freq, sigma_1d): for i in np.arange(mesh.vnEy[0]): ey_py[i, :] = e0_1d # ey_py[1:-1, 1:-1, 1:-1] = 0 - eBG_py = np.vstack((ex_py, mkvc(ey_py, 2), ez_py)) + eBG_py = np.vstack((ex_py, mkvc(ey_py, 2))) elif mesh.dim == 3: # us the z component of ex_grid as lookup for solution edges_u, inv_edges = np.unique(mesh.gridEx[:, -1], return_inverse=True) @@ -113,7 +113,7 @@ def analytic1DModelSource(mesh, freq, sigma_1d): for i in np.arange(mesh.vnEy[0]): ey_py[i, :] = e0_1d # ey_py[1:-1, 1:-1, 1:-1] = 0 - eBG_py = np.vstack((ex_py, mkvc(ey_py, 2), ez_py)) + eBG_py = np.vstack((ex_py, mkvc(ey_py, 2))) elif mesh.dim == 3: # Setup x (east) polarization (_x) ex_px = -np.array([E1dFieldDict[i] for i in mesh.gridEx[:, 2]]).reshape(-1, 1) diff --git a/simpeg/electromagnetics/natural_source/utils/test_utils.py b/simpeg/electromagnetics/natural_source/utils/test_utils.py index 878ddaea82..34943aae44 100644 --- a/simpeg/electromagnetics/natural_source/utils/test_utils.py +++ b/simpeg/electromagnetics/natural_source/utils/test_utils.py @@ -242,7 +242,7 @@ def setupSimpegNSEM_tests_location_assign_list( # Set the mapping actMap = maps.InjectActiveCells( - mesh=mesh, indActive=active, valInactive=np.log(1e-8) + mesh=mesh, active_cells=active, value_inactive=np.log(1e-8) ) mapping = maps.ExpMap(mesh) * actMap # print(survey_ns.source_list) @@ -367,7 +367,7 @@ def setupSimpegNSEM_PrimarySecondary(inputSetup, freqs, comp="Imp", singleFreq=F # Set the mapping actMap = maps.InjectActiveCells( - mesh=mesh, indActive=active, valInactive=np.log(1e-8) + mesh=mesh, active_cells=active, value_inactive=np.log(1e-8) ) mapping = maps.ExpMap(mesh) * actMap # print(survey_ns.source_list) @@ -472,12 +472,6 @@ def setupSimpegNSEM_ePrimSec(inputSetup, comp="Imp", singleFreq=False, expMap=Tr ) problem.model = sig problem.verbose = False - try: - from pymatsolver import Pardiso - - problem.solver = Pardiso - except ImportError: - pass return (survey, problem) diff --git a/simpeg/electromagnetics/static/induced_polarization/simulation.py b/simpeg/electromagnetics/static/induced_polarization/simulation.py index b5a6ea89d4..5aa88b19b9 100644 --- a/simpeg/electromagnetics/static/induced_polarization/simulation.py +++ b/simpeg/electromagnetics/static/induced_polarization/simulation.py @@ -62,7 +62,7 @@ def _scale(self): def __init__( self, - mesh=None, + mesh, survey=None, sigma=None, rho=None, @@ -132,7 +132,7 @@ def Jtvec(self, m, v, f=None): return super().Jtvec(m, v * self._scale, f) @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): toDelete = [] return toDelete diff --git a/simpeg/electromagnetics/static/resistivity/IODC.py b/simpeg/electromagnetics/static/resistivity/IODC.py index cc47403d7e..912bccc7a0 100644 --- a/simpeg/electromagnetics/static/resistivity/IODC.py +++ b/simpeg/electromagnetics/static/resistivity/IODC.py @@ -1,5 +1,4 @@ import numpy as np -import pandas as pd import matplotlib.pyplot as plt import matplotlib import warnings @@ -7,6 +6,12 @@ from discretize import TensorMesh, TreeMesh from discretize.base import BaseMesh from discretize.utils import refine_tree_xyz, unpack_widths, active_from_xyz +from discretize.utils import requires as module_requires + +try: + import pandas +except ImportError: + pandas = False from ....utils import ( sdiag, @@ -1283,6 +1288,7 @@ def read_ubc_dc2d_obs_file(self, filename, input_type="simple", toponame=None): survey.topo = topo return survey + @module_requires({"pandas": pandas}) def write_to_csv(self, fname, dobs, standard_deviation=None, **kwargs): uncert = kwargs.pop("uncertainty", None) if uncert is not None: @@ -1300,7 +1306,7 @@ def write_to_csv(self, fname, dobs, standard_deviation=None, **kwargs): dobs, standard_deviation, ] - df = pd.DataFrame( + df = pandas.DataFrame( data=data, columns=[ "Ax", @@ -1317,8 +1323,9 @@ def write_to_csv(self, fname, dobs, standard_deviation=None, **kwargs): ) df.to_csv(fname) + @module_requires({"pandas": pandas}) def read_dc_data_csv(self, fname, dim=2): - df = pd.read_csv(fname) + df = pandas.read_csv(fname) if dim == 2: a_locations = df[["Ax", "Az"]].values b_locations = df[["Bx", "Bz"]].values @@ -1352,8 +1359,9 @@ def read_dc_data_csv(self, fname, dim=2): raise NotImplementedError() return survey + @module_requires({"pandas": pandas}) def read_topo_csv(self, fname, dim=2): if dim == 2: - df = pd.read_csv(fname) + df = pandas.read_csv(fname) topo = df[["X", "Z"]].values return topo diff --git a/simpeg/electromagnetics/static/resistivity/simulation.py b/simpeg/electromagnetics/static/resistivity/simulation.py index bdd09e1666..36c1742311 100644 --- a/simpeg/electromagnetics/static/resistivity/simulation.py +++ b/simpeg/electromagnetics/static/resistivity/simulation.py @@ -284,9 +284,9 @@ def getSourceTerm(self): return self._q @property - def deleteTheseOnModelUpdate(self): - toDelete = super().deleteTheseOnModelUpdate - return toDelete + ["_Jmatrix", "_jtjdiag"] + def _delete_on_model_update(self): + toDelete = super()._delete_on_model_update + return toDelete + ["_Jmatrix", "_gtgdiag"] def _mini_survey_data(self, d_mini): if self._mini_survey is not None: diff --git a/simpeg/electromagnetics/static/resistivity/simulation_1d.py b/simpeg/electromagnetics/static/resistivity/simulation_1d.py index f2528d9a6f..85d72bd2fd 100644 --- a/simpeg/electromagnetics/static/resistivity/simulation_1d.py +++ b/simpeg/electromagnetics/static/resistivity/simulation_1d.py @@ -1,28 +1,22 @@ +from collections import namedtuple + +import libdlf import numpy as np +from ...utils.em1d_utils import get_splined_dlf_points from ....simulation import BaseSimulation from .... import props from .survey import Survey -from empymod.transform import get_dlf_points -from empymod import filters from ....utils import validate_type, validate_string from scipy.interpolate import InterpolatedUnivariateSpline as iuSpline - -HANKEL_FILTERS = [ - "kong_61_2007", - "kong_241_2007", - "key_101_2009", - "key_201_2009", - "key_401_2009", - "anderson_801_1982", - "key_51_2012", - "key_101_2012", - "key_201_2012", - "wer_201_2018", -] +HANKEL_FILTERS = {} +for filter_name in libdlf.hankel.__all__: + hankel_filter = getattr(libdlf.hankel, filter_name) + if "j0" in hankel_filter.values: + HANKEL_FILTERS[filter_name] = hankel_filter def _phi_tilde(rho, thicknesses, lambdas): @@ -200,11 +194,12 @@ def hankel_filter(self): @hankel_filter.setter def hankel_filter(self, value): self._hankel_filter = validate_string( - "hankel_filter", - value, - HANKEL_FILTERS, + "hankel_filter", value, list(HANKEL_FILTERS.keys()) ) - self._fhtfilt = getattr(filters, self._hankel_filter)() + filt = HANKEL_FILTERS[self._hankel_filter]() + hank = namedtuple("HankelFilter", "base j0") + self._fhtfilt = hank(filt[0], filt[1]) + self._coefficients_set = False @property def fix_Jmatrix(self): @@ -225,8 +220,8 @@ def _compute_hankel_coefficients(self): return survey = self.survey - r_min = np.infty - r_max = -np.infty + r_min = np.inf + r_max = -np.inf for src in survey.source_list: src_loc = src.location @@ -241,9 +236,8 @@ def _compute_hankel_coefficients(self): r_max = max(off.max(), r_max) self.survey.set_geometric_factor() - lambdas, r_spline_points = get_dlf_points( - self._fhtfilt, np.r_[r_min, r_max], -1 - ) + lambdas, r_spline_points = get_splined_dlf_points(self._fhtfilt, r_min, r_max) + lambdas = lambdas.reshape(-1) n_lambda = len(lambdas) n_r = len(r_spline_points) @@ -346,8 +340,8 @@ def Jtvec(self, m, v, f=None): return self.getJ(m, f=f).T @ v @property - def deleteTheseOnModelUpdate(self): - to_delete = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + to_delete = super()._delete_on_model_update if not self.fix_Jmatrix: to_delete = to_delete + ["_Jmatrix"] return to_delete diff --git a/simpeg/electromagnetics/static/resistivity/simulation_2d.py b/simpeg/electromagnetics/static/resistivity/simulation_2d.py index 9a593913b0..09718ab450 100644 --- a/simpeg/electromagnetics/static/resistivity/simulation_2d.py +++ b/simpeg/electromagnetics/static/resistivity/simulation_2d.py @@ -21,6 +21,7 @@ from .utils import _mini_pole_pole from scipy.special import k0e, k1e, k0 from discretize.utils import make_boundary_bool +import discretize.base class BaseDCSimulation2D(BaseElectricalPDESimulation): @@ -128,6 +129,15 @@ def g(k): if miniaturize: self._dipoles, self._invs, self._mini_survey = _mini_pole_pole(self.survey) + @BaseElectricalPDESimulation.mesh.setter + def mesh(self, value): + value = validate_type("mesh", value, discretize.base.BaseMesh, cast=False) + if value.dim != 2: + raise ValueError( + f"{type(self).__name__} mesh must be 2D, received a {value.dim}D mesh." + ) + self._mesh = value + @property def survey(self): """The DC survey object. @@ -435,8 +445,8 @@ def getSourceTerm(self, ky): return q @property - def deleteTheseOnModelUpdate(self): - toDelete = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + toDelete = super()._delete_on_model_update if self.fix_Jmatrix: return toDelete return toDelete + ["_Jmatrix"] diff --git a/simpeg/electromagnetics/static/resistivity/survey.py b/simpeg/electromagnetics/static/resistivity/survey.py index 8f2e438664..1da25060d4 100644 --- a/simpeg/electromagnetics/static/resistivity/survey.py +++ b/simpeg/electromagnetics/static/resistivity/survey.py @@ -1,3 +1,4 @@ +import warnings import numpy as np from ....utils.code_utils import validate_string @@ -19,20 +20,26 @@ class Survey(BaseSurvey): List of SimPEG DC/IP sources survey_geometry : {"surface", "borehole", "general"} Survey geometry. - survey_type : {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} - Survey type. """ def __init__( self, source_list, survey_geometry="surface", - survey_type="dipole-dipole", **kwargs, ): + if (key := "survey_type") in kwargs: + warnings.warn( + f"Argument '{key}' is ignored and will be removed in future " + "versions of SimPEG. Types of sources and their corresponding " + "receivers are obtained from their respective classes, without " + "the need to specify the survey type.", + FutureWarning, + stacklevel=0, + ) + kwargs.pop(key) super(Survey, self).__init__(source_list, **kwargs) self.survey_geometry = survey_geometry - self.survey_type = survey_type @property def survey_geometry(self): @@ -56,29 +63,42 @@ def survey_geometry(self, var): @property def survey_type(self): - """Survey type; one of {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} + """ + ``survey_type`` has been removed. + + Survey type; one of {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} + + .. important: + + The `survey_type` property has been removed. Types of sources and + their corresponding receivers are obtained from their respective + classes, without the need to specify the survey type. Returns ------- str Survey type; one of {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} """ - return self._survey_type + warnings.warn( + "Property 'survey_type' has been removed." + "Types of sources and their corresponding receivers are obtained from " + "their respective classes, without the need to specify the survey type.", + FutureWarning, + stacklevel=0, + ) @survey_type.setter def survey_type(self, var): - var = validate_string( - "survey_type", - var, - ("dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"), + warnings.warn( + "Property 'survey_type' has been removed." + "Types of sources and their corresponding receivers are obtained from " + "their respective classes, without the need to specify the survey type.", + FutureWarning, + stacklevel=0, ) - self._survey_type = var def __repr__(self): - return ( - f"{self.__class__.__name__}({self.survey_type}; " - f"#sources: {self.nSrc}; #data: {self.nD})" - ) + return f"{self.__class__.__name__}(#sources: {self.nSrc}; #data: {self.nD})" @property def locations_a(self): @@ -265,7 +285,13 @@ def getABMN_locations(self): ) def drape_electrodes_on_topography( - self, mesh, ind_active, option="top", topography=None, force=False + self, + mesh, + active_cells, + option="top", + topography=None, + force=False, + ind_active=None, ): """Shift electrode locations to discrete surface topography. @@ -273,7 +299,7 @@ def drape_electrodes_on_topography( ---------- mesh : discretize.TensorMesh or discretize.TreeMesh The mesh on which the discretized fields are computed - ind_active : numpy.ndarray of int or bool + active_cells : numpy.ndarray of int or bool Active topography cells option :{"top", "center"} Define topography at tops of cells or cell centers. @@ -281,8 +307,21 @@ def drape_electrodes_on_topography( Surface topography force : bool, default = ``False`` If ``True`` force electrodes to surface even if borehole + ind_active : numpy.ndarray of int or bool, optional + + .. deprecated:: 0.23.0 + + Argument ``ind_active`` is deprecated in favor of ``active_cells`` + and will be removed in SimPEG v0.24.0. """ + # Deprecate ind_active argument + if ind_active is not None: + raise TypeError( + "'ind_active' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead." + ) + if self.survey_geometry == "surface": loc_a = self.locations_a[:, :2] loc_b = self.locations_b[:, :2] @@ -296,7 +335,7 @@ def drape_electrodes_on_topography( inv_m, inv_n = inv[: len(loc_m)], inv[len(loc_m) :] electrodes_shifted = drapeTopotoLoc( - mesh, unique_electrodes, ind_active=ind_active, option=option + mesh, unique_electrodes, active_cells=active_cells, option=option ) a_shifted = electrodes_shifted[inv_a] b_shifted = electrodes_shifted[inv_b] diff --git a/simpeg/electromagnetics/static/self_potential/simulation.py b/simpeg/electromagnetics/static/self_potential/simulation.py index 4a57592349..36306e5ceb 100644 --- a/simpeg/electromagnetics/static/self_potential/simulation.py +++ b/simpeg/electromagnetics/static/self_potential/simulation.py @@ -78,10 +78,10 @@ def getRHSDeriv(self, source, v, adjoint=False): return self.Vol @ (self.qDeriv @ v) @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): # When enabling resistivity derivatives, uncomment these lines # if self.rhoMap is not None: - # return super().deleteTheseOnModelUpdate + # return super()._delete_on_model_update if self.storeJ and self.qMap is not None and not self.qMap.is_linear: return ["_Jmatrix", "_jtjdiag"] return [] @@ -166,7 +166,7 @@ class Survey(dc.Survey): Parameters ---------- - source_list : list of sources.StreamingCurrents + source_list : list of .sources.StreamingCurrents """ @property @@ -175,7 +175,7 @@ def source_list(self): Returns ------- - list of sources.StreamingCurrents + list of .sources.StreamingCurrents """ return self._source_list diff --git a/simpeg/electromagnetics/static/spectral_induced_polarization/data.py b/simpeg/electromagnetics/static/spectral_induced_polarization/data.py index 8535915679..f84e0185ee 100644 --- a/simpeg/electromagnetics/static/spectral_induced_polarization/data.py +++ b/simpeg/electromagnetics/static/spectral_induced_polarization/data.py @@ -1,4 +1,5 @@ import numpy as np +from discretize.utils import mkvc from ....data import Data as BaseData diff --git a/simpeg/electromagnetics/static/spectral_induced_polarization/run.py b/simpeg/electromagnetics/static/spectral_induced_polarization/run.py index 93ee3cf5ed..8a13cd0b88 100644 --- a/simpeg/electromagnetics/static/spectral_induced_polarization/run.py +++ b/simpeg/electromagnetics/static/spectral_induced_polarization/run.py @@ -1,3 +1,4 @@ +import warnings import numpy as np from simpeg import ( maps, @@ -12,13 +13,14 @@ def spectral_ip_mappings( mesh, - indActive=None, + active_cells=None, inactive_eta=1e-4, inactive_tau=1e-4, inactive_c=1e-4, is_log_eta=True, is_log_tau=True, is_log_c=True, + indActive=None, ): """ Generates Mappings for Spectral Induced Polarization Simulation. @@ -36,20 +38,39 @@ def spectral_ip_mappings( TODO: Illustrate input and output variables """ - - if indActive is None: - indActive = np.ones(mesh.nC, dtype=bool) + # Deprecate indActive argument + if indActive is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'indActive'." + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = indActive + + if active_cells is None: + active_cells = np.ones(mesh.nC, dtype=bool) actmap_eta = maps.InjectActiveCells( - mesh, indActive=indActive, valInactive=inactive_eta + mesh, active_cells=active_cells, value_inactive=inactive_eta ) actmap_tau = maps.InjectActiveCells( - mesh, indActive=indActive, valInactive=inactive_tau + mesh, active_cells=active_cells, value_inactive=inactive_tau + ) + actmap_c = maps.InjectActiveCells( + mesh, active_cells=active_cells, value_inactive=inactive_c ) - actmap_c = maps.InjectActiveCells(mesh, indActive=indActive, valInactive=inactive_c) wires = maps.Wires( - ("eta", indActive.sum()), ("tau", indActive.sum()), ("c", indActive.sum()) + ("eta", active_cells.sum()), + ("tau", active_cells.sum()), + ("c", active_cells.sum()), ) if is_log_eta: diff --git a/simpeg/electromagnetics/static/spectral_induced_polarization/simulation.py b/simpeg/electromagnetics/static/spectral_induced_polarization/simulation.py index 04263d3197..5abc4b4e8f 100644 --- a/simpeg/electromagnetics/static/spectral_induced_polarization/simulation.py +++ b/simpeg/electromagnetics/static/spectral_induced_polarization/simulation.py @@ -603,7 +603,7 @@ def Jtvec(self, m, v, f=None): return Jtv @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): toDelete = [ "_etaDeriv_store", "_tauiDeriv_store", diff --git a/simpeg/electromagnetics/static/spectral_induced_polarization/survey.py b/simpeg/electromagnetics/static/spectral_induced_polarization/survey.py index 7039d4fb05..0826d84f4b 100644 --- a/simpeg/electromagnetics/static/spectral_induced_polarization/survey.py +++ b/simpeg/electromagnetics/static/spectral_induced_polarization/survey.py @@ -1,3 +1,4 @@ +import warnings from ....survey import BaseTimeSurvey from . import sources from . import receivers @@ -14,25 +15,27 @@ class Survey(BaseTimeSurvey): List of SimPEG spectral IP sources survey_geometry : {"surface", "borehole", "general"} Survey geometry. - survey_type : {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} - Survey type. """ _n_pulse = 2 _T = 8.0 - def __init__( - self, - source_list=None, - survey_geometry="surface", - survey_type="dipole-dipole", - **kwargs, - ): + def __init__(self, source_list=None, survey_geometry="surface", **kwargs): + if (key := "survey_type") in kwargs: + warnings.warn( + f"Argument '{key}' is ignored and will be removed in future " + "versions of SimPEG. Types of sources and their corresponding " + "receivers are obtained from their respective classes, without " + "the need to specify the survey type.", + FutureWarning, + stacklevel=1, + ) + kwargs.pop(key) + if source_list is None: raise AttributeError("Survey cannot be instantiated without sources") super(Survey, self).__init__(source_list, **kwargs) self.survey_geometry = survey_geometry - self.survey_type = survey_type @property def n_pulse(self): @@ -75,21 +78,38 @@ def survey_geometry(self, var): @property def survey_type(self): - """Survey type; one of {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} + """ + ``survey_type`` has been removed. + + Survey type; one of {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} + + .. important: + + The `survey_type` property has been removed. Types of sources and + their corresponding receivers are obtained from their respective + classes, without the need to specify the survey type. Returns ------- str Survey type; one of {"dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"} """ - return self._survey_type + warnings.warn( + "Property 'survey_type' has been removed." + "Types of sources and their corresponding receivers are obtained from " + "their respective classes, without the need to specify the survey type.", + FutureWarning, + stacklevel=1, + ) @survey_type.setter def survey_type(self, var): - self._survey_type = validate_string( - "survey_type", - var, - ("dipole-dipole", "pole-dipole", "dipole-pole", "pole-pole"), + warnings.warn( + "Property 'survey_type' has been removed." + "Types of sources and their corresponding receivers are obtained from " + "their respective classes, without the need to specify the survey type.", + FutureWarning, + stacklevel=1, ) @property diff --git a/simpeg/electromagnetics/static/utils/static_utils.py b/simpeg/electromagnetics/static/utils/static_utils.py index a5fcaa7e52..7a552a03bd 100644 --- a/simpeg/electromagnetics/static/utils/static_utils.py +++ b/simpeg/electromagnetics/static/utils/static_utils.py @@ -1261,7 +1261,7 @@ def xy_2_r(x1, x2, y1, y2): srcClass = dc.Src.Dipole([rxClass], (endl[0, :]), (endl[1, :])) SrcList.append(srcClass) - survey = dc.Survey(SrcList, survey_type=survey_type) + survey = dc.Survey(SrcList) return survey @@ -1597,7 +1597,9 @@ def gettopoCC(mesh, ind_active, option="top"): raise NotImplementedError(f"{type(mesh)} mesh is not supported.") -def drapeTopotoLoc(mesh, pts, ind_active=None, option="top", topo=None, **kwargs): +def drapeTopotoLoc( + mesh, pts, active_cells=None, option="top", topo=None, ind_active=None +): """Drape locations right below discretized surface topography This function projects the set of locations provided to the discrete @@ -1609,7 +1611,7 @@ def drapeTopotoLoc(mesh, pts, ind_active=None, option="top", topo=None, **kwargs A 2D tensor or tree mesh pts : (n, dim) numpy.ndarray The set of points being projected to the discretize surface topography - ind_active : numpy.ndarray of int or bool, optional + active_cells : numpy.ndarray of int or bool, optional Index array for all cells lying below the surface topography. Surface topography can be specified using the 'ind_active' or 'topo' input parameters. option : {"top", "center"} @@ -1618,10 +1620,28 @@ def drapeTopotoLoc(mesh, pts, ind_active=None, option="top", topo=None, **kwargs topo : (n, dim) numpy.ndarray Surface topography. Can be used if an active indices array cannot be provided for the input parameter 'ind_active' - """ + ind_active : numpy.ndarray of int or bool, optional + + .. deprecated:: 0.23.0 - if "actind" in kwargs: - ind_active = kwargs.pop("actind") + Argument ``ind_active`` is deprecated in favor of ``active_cells`` + and will be removed in SimPEG v0.24.0. + """ + # Deprecate ind_active argument + if ind_active is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'ind_active'." + "'ind_active' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'ind_active' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = ind_active if isinstance(mesh, discretize.CurvilinearMesh): raise ValueError("Curvilinear mesh is not supported.") @@ -1640,22 +1660,22 @@ def drapeTopotoLoc(mesh, pts, ind_active=None, option="top", topo=None, **kwargs else: raise ValueError("Unsupported mesh dimension") - if ind_active is None: - ind_active = discretize.utils.active_from_xyz(mesh, topo) + if active_cells is None: + active_cells = discretize.utils.active_from_xyz(mesh, topo) if mesh._meshType == "TENSOR": - meshtemp, topoCC = gettopoCC(mesh, ind_active, option=option) + meshtemp, topoCC = gettopoCC(mesh, active_cells, option=option) inds = meshtemp.closest_points_index(pts) topo = topoCC[inds] out = np.c_[pts, topo] elif mesh._meshType == "TREE": if mesh.dim == 3: - uniqXYlocs, topoCC = gettopoCC(mesh, ind_active, option=option) + uniqXYlocs, topoCC = gettopoCC(mesh, active_cells, option=option) inds = closestPointsGrid(uniqXYlocs, pts) out = np.c_[uniqXYlocs[inds, :], topoCC[inds]] else: - uniqXlocs, topoCC = gettopoCC(mesh, ind_active, option=option) + uniqXlocs, topoCC = gettopoCC(mesh, active_cells, option=option) inds = closestPointsGrid(uniqXlocs, pts, dim=1) out = np.c_[uniqXlocs[inds], topoCC[inds]] else: @@ -1691,13 +1711,21 @@ def genTopography(mesh, zmin, zmax, seed=None, its=100, anisotropy=None): [mesh.h[0], mesh.h[1]], x0=[mesh.x0[0], mesh.x0[1]] ) out = model_builder.create_random_model( - mesh.vnC[:2], bounds=[zmin, zmax], its=its, seed=seed, anisotropy=anisotropy + mesh.vnC[:2], + bounds=[zmin, zmax], + its=its, + random_seed=seed, + anisotropy=anisotropy, ) return out, mesh2D elif mesh.dim == 2: mesh1D = discretize.TensorMesh([mesh.h[0]], x0=[mesh.x0[0]]) out = model_builder.create_random_model( - mesh.vnC[:1], bounds=[zmin, zmax], its=its, seed=seed, anisotropy=anisotropy + mesh.vnC[:1], + bounds=[zmin, zmax], + its=its, + random_seed=seed, + anisotropy=anisotropy, ) return out, mesh1D else: diff --git a/simpeg/electromagnetics/time_domain/simulation.py b/simpeg/electromagnetics/time_domain/simulation.py index 31720a94c5..c896e3d9d3 100644 --- a/simpeg/electromagnetics/time_domain/simulation.py +++ b/simpeg/electromagnetics/time_domain/simulation.py @@ -608,7 +608,7 @@ def Adcinv(self): return self._Adcinv @property - def clean_on_model_update(self): + def _delete_on_model_update(self): """List of model-dependent attributes to clean upon model update. Some of the TDEM simulation's attributes are model-dependent. This property specifies @@ -619,8 +619,11 @@ def clean_on_model_update(self): list of str List of the model-dependent attributes to clean upon model update. """ - items = super().clean_on_model_update - return items + ["_Adcinv"] #: clear DC matrix factors on any model updates + items = super()._delete_on_model_update + if self.sigmaMap is not None: + items = items + ["_Adcinv"] #: clear DC matrix factors on any model updates + # if there is a sigmaMap + return items ############################################################################### diff --git a/simpeg/electromagnetics/time_domain/simulation_1d.py b/simpeg/electromagnetics/time_domain/simulation_1d.py index 3343ec3fba..e2f5b8a6bb 100644 --- a/simpeg/electromagnetics/time_domain/simulation_1d.py +++ b/simpeg/electromagnetics/time_domain/simulation_1d.py @@ -1,3 +1,5 @@ +from collections import namedtuple + from ..base_1d import BaseEM1DSimulation from .sources import StepOffWaveform from .receivers import ( @@ -12,13 +14,19 @@ from scipy.interpolate import InterpolatedUnivariateSpline as iuSpline from scipy.special import roots_legendre -from empymod import filters -from empymod.transform import get_dlf_points +import libdlf from geoana.kernels.tranverse_electric_reflections import rTE_forward, rTE_gradient +from ..utils.em1d_utils import get_splined_dlf_points from ...utils import validate_type, validate_string +COS_FILTERS = {} +for filter_name in libdlf.fourier.__all__: + fourier_filter = getattr(libdlf.fourier, filter_name) + if "cos" in fourier_filter.values: + COS_FILTERS[filter_name] = fourier_filter + class Simulation1DLayered(BaseEM1DSimulation): """ @@ -26,7 +34,7 @@ class Simulation1DLayered(BaseEM1DSimulation): for a single sounding. """ - def __init__(self, survey=None, time_filter="key_81_CosSin_2009", **kwargs): + def __init__(self, survey=None, time_filter="key_81_2009", **kwargs): super().__init__(survey=survey, **kwargs) self._coefficients_set = False self.time_filter = time_filter @@ -54,18 +62,20 @@ def time_filter(self): @time_filter.setter def time_filter(self, value): + # translate old accepted keys to the names in libdlf for compatibility. + if value in [ + "key_81_CosSin_2009", + "key_201_CosSin_2012", + "key_601_CosSin_2009", + ]: + value = value.replace("CosSin_", "") self._time_filter = validate_string( - "time_filter", - value, - ["key_81_CosSin_2009", "key_201_CosSin_2012", "key_601_CosSin_2009"], + "time_filter", value, list(COS_FILTERS.keys()) ) - - if self._time_filter == "key_81_CosSin_2009": - self._fftfilt = filters.key_81_CosSin_2009() - elif self._time_filter == "key_201_CosSin_2012": - self._fftfilt = filters.key_201_CosSin_2012() - elif self._time_filter == "key_601_CosSin_2009": - self._fftfilt = filters.key_601_CosSin_2009() + filt = COS_FILTERS[self._time_filter]() + cos_filt = namedtuple("CosineFilter", "base cos") + self._fftfilt = cos_filt(filt[0], filt[-1]) + self._coefficients_set = False def get_coefficients(self): if self._coefficients_set is False: @@ -97,8 +107,8 @@ def _compute_coefficients(self): self._compute_hankel_coefficients() survey = self.survey - t_min = np.infty - t_max = -np.infty + t_min = np.inf + t_max = -np.inf x, w = roots_legendre(251) # loop through source and receiver lists to find the minimum and maximum # evaluation times for the step response @@ -123,8 +133,8 @@ def _compute_coefficients(self): f"Unsupported source waveform object of {src.waveform}" ) - omegas, t_spline_points = get_dlf_points(self._fftfilt, np.r_[t_min, t_max], -1) - omegas = omegas.reshape(-1) + omegas, t_spline_points = get_splined_dlf_points(self._fftfilt, t_min, t_max) + n_omega = len(omegas) n_t = len(t_spline_points) diff --git a/simpeg/electromagnetics/time_domain/sources.py b/simpeg/electromagnetics/time_domain/sources.py index 2d4f83ede4..fe7c18b8ab 100644 --- a/simpeg/electromagnetics/time_domain/sources.py +++ b/simpeg/electromagnetics/time_domain/sources.py @@ -1241,7 +1241,9 @@ def _srcFct(self, obsLoc, coordinates="cartesian"): location=self.location, moment=self.moment, ) - return self._dipole.vector_potential(obsLoc, coordinates=coordinates) + out = self._dipole.vector_potential(obsLoc, coordinates=coordinates) + out[np.isnan(out)] = 0 + return out def _aSrc(self, simulation): coordinates = "cartesian" @@ -1431,11 +1433,7 @@ def s_e(self, simulation, time): self.waveform.has_initial_fields is True and time < simulation.time_steps[1] ): - if simulation._fieldType == "b": - return Zero() - elif simulation._fieldType == "e": - # Compute s_e from vector potential - return C.T * (MfMui * b) + return C.T * (MfMui * b) else: return C.T * (MfMui * b) * self.waveform.eval(time) @@ -1446,11 +1444,7 @@ def s_e(self, simulation, time): self.waveform.has_initial_fields is True and time < simulation.time_steps[1] ): - if simulation._fieldType == "h": - return Zero() - elif simulation._fieldType == "j": - # Compute s_e from vector potential - return C * h + return C * h else: return C * h * self.waveform.eval(time) @@ -1602,7 +1596,9 @@ def _srcFct(self, obsLoc, coordinates="cartesian"): radius=self.radius, current=self.current, ) - return self.n_turns * self._loop.vector_potential(obsLoc, coordinates) + out = self._loop.vector_potential(obsLoc, coordinates) + out[np.isnan(out)] = 0 + return self.n_turns * out N = deprecate_property( n_turns, "N", "n_turns", removal_version="0.19.0", error=True diff --git a/simpeg/electromagnetics/utils/em1d_utils.py b/simpeg/electromagnetics/utils/em1d_utils.py index 91b0ee3f61..c551cb311d 100644 --- a/simpeg/electromagnetics/utils/em1d_utils.py +++ b/simpeg/electromagnetics/utils/em1d_utils.py @@ -219,3 +219,39 @@ def LogUniform(f, chi_inf=0.05, del_chi=0.05, tau1=1e-5, tau2=1e-2): return chi_inf + del_chi * ( 1 - np.log((1 + 1j * w * tau2) / (1 + 1j * w * tau1)) / np.log(tau2 / tau1) ) + + +def get_splined_dlf_points(filt, v_min, v_max): + """ + + Parameters + ---------- + filt : namedtuple of numpy.ndarray + The filter parameters loaded from libdlf, in a named tuple containing a `.base` property. + v_min, v_max : float + The minimum and maximum points needed + + Returns + ------- + lamb, spline_points : numpy.ndarray + The points to evaluate at in the filter space, and the + corresponding spline points in the transformed space. + """ + + # the below is adapted from empymod.transform.get_dlf_points + outmax = filt.base[-1] / v_min + outmin = filt.base[0] / v_max + + factor = np.around([filt.base[1] / filt.base[0]], 15) + + pts_per_dec = np.squeeze(1 / np.log(factor)) + + nout = int(np.ceil(np.log(outmax / outmin) * pts_per_dec) + 1) + if nout - filt.base.size < 3: + nout = filt.base.size + 3 + out = np.exp( + np.arange(np.log(outmin), np.log(outmin) + nout / pts_per_dec, 1 / pts_per_dec) + ) + + spline_points = v_max * np.exp(-np.arange(nout - filt.base.size + 1) / pts_per_dec) + return out, spline_points diff --git a/simpeg/electromagnetics/utils/testing_utils.py b/simpeg/electromagnetics/utils/testing_utils.py index ec7ad01a33..86444a8979 100644 --- a/simpeg/electromagnetics/utils/testing_utils.py +++ b/simpeg/electromagnetics/utils/testing_utils.py @@ -4,7 +4,6 @@ from discretize import TensorMesh from ... import maps, utils -from simpeg import SolverLU from simpeg.electromagnetics import frequency_domain as fdem FLR = 1e-20 # "zero", so if residual below this --> pass regardless of order @@ -126,13 +125,6 @@ def getFDEMProblem(fdemType, comp, SrcList, freq, useMu=False, verbose=False): else: raise NotImplementedError() - - try: - from pymatsolver import Pardiso - - prb.solver = Pardiso - except ImportError: - prb.solver = SolverLU # prb.solver_opts = dict(check_accuracy=True) return prb diff --git a/simpeg/electromagnetics/utils/waveform_utils.py b/simpeg/electromagnetics/utils/waveform_utils.py index 55e2c2f8ab..8120777712 100644 --- a/simpeg/electromagnetics/utils/waveform_utils.py +++ b/simpeg/electromagnetics/utils/waveform_utils.py @@ -119,6 +119,6 @@ def integral(quad_time, t): # just do not evaluate the integral at negative times... a = np.maximum(a, 0.0) b = np.maximum(b, 0.0) - val, _ = integrate.quadrature(integral, a, b, tol=0.0, maxiter=500, args=t) + val = integrate.quad(integral, a, b, epsabs=0.0, limit=500, args=t)[0] out[it] -= val return out diff --git a/simpeg/electromagnetics/viscous_remanent_magnetization/simulation.py b/simpeg/electromagnetics/viscous_remanent_magnetization/simulation.py index 27cfb040f1..fe9f707ad5 100644 --- a/simpeg/electromagnetics/viscous_remanent_magnetization/simulation.py +++ b/simpeg/electromagnetics/viscous_remanent_magnetization/simulation.py @@ -1,3 +1,4 @@ +import warnings import discretize import numpy as np import scipy.sparse as sp @@ -15,6 +16,7 @@ from .survey import SurveyVRM from .receivers import Point, SquareLoop +from ...utils.code_utils import deprecate_property ############################################ # BASE VRM PROBLEM CLASS @@ -32,10 +34,12 @@ def __init__( survey=None, refinement_factor=None, refinement_distance=None, + active_cells=None, indActive=None, **kwargs, ): - super().__init__(mesh=mesh, survey=survey, **kwargs) + self.mesh = mesh + super().__init__(survey=survey, **kwargs) if refinement_distance is None: if refinement_factor is None: @@ -48,18 +52,46 @@ def __init__( * np.arange(1, refinement_factor + 1) ) self.refinement_distance = refinement_distance - if indActive is None: - indActive = np.ones(self.mesh.n_cells, dtype=bool) - self.indActive = indActive - @BaseSimulation.mesh.setter + # Deprecate indActive argument + if indActive is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'indActive'." + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = indActive + + if active_cells is None: + active_cells = np.ones(self.mesh.n_cells, dtype=bool) + self.active_cells = active_cells + + @property + def mesh(self): + """Mesh for the integral VRM simulations. + + Returns + ------- + discretize.TensorMesh or discretize.TreeMesh + 3D Mesh on which the forward problem is discretized. + """ + return self._mesh + + @mesh.setter def mesh(self, value): value = validate_type( "mesh", value, (discretize.TensorMesh, discretize.TreeMesh), cast=False ) if value.dim != 3: raise ValueError( - f"Mesh must be 3D tensor or 3D tree. Current mesh is {value.dim}" + f"{type(self).__name__} mesh must be 3D, received a {value.dim}D mesh." ) self._mesh = value @@ -108,18 +140,29 @@ def refinement_distance(self, value): ) @property - def indActive(self): + def active_cells(self): """Topography active cells. Returns ------- (mesh.n_cells) numpy.ndarray of bool """ - return self._indActive + return self._active_cells - @indActive.setter - def indActive(self, value): - self._indActive = validate_active_indices("indActive", value, self.mesh.n_cells) + @active_cells.setter + def active_cells(self, value): + self._active_cells = validate_active_indices( + "active_cells", value, self.mesh.n_cells + ) + + indActive = deprecate_property( + active_cells, + "indActive", + "active_cells", + removal_version="0.24.0", + future_warn=True, + error=False, + ) def _getH0matrix(self, xyz, pp): """ @@ -697,12 +740,12 @@ def _getGeometryMatrix(self, xyzc, xyzh, pp): def _getAMatricies(self): """Returns the full geometric operator""" - indActive = self.indActive + active_cells = self.active_cells # GET CELL INFORMATION FOR FORWARD MODELING meshObj = self.mesh - xyzc = meshObj.gridCC[indActive, :] - xyzh = meshObj.h_gridded[indActive, :] + xyzc = meshObj.gridCC[active_cells, :] + xyzh = meshObj.h_gridded[active_cells, :] # GET LIST OF A MATRICIES A = [] @@ -811,7 +854,7 @@ def __init__(self, mesh, xi=None, xiMap=None, **kwargs): self.xi = xi self.xiMap = xiMap - nAct = list(self.indActive).count(True) + nAct = list(self.active_cells).count(True) if self.xiMap is None: self.xiMap = maps.IdentityMap(nP=nAct) diff --git a/simpeg/fields.py b/simpeg/fields.py index fd20be1716..f78c994219 100644 --- a/simpeg/fields.py +++ b/simpeg/fields.py @@ -8,7 +8,7 @@ class Fields: r"""Base class for storing fields. Fields classes are used to store the discrete field solution for a - corresponding simulation object; see :py:class:`SimPEG.simulation.BaseSimulation`. + corresponding simulation object; see :py:class:`simpeg.simulation.BaseSimulation`. Generally only one field solution (e.g. ``'eSolution'``, ``'phiSolution'``, ``'bSolution'``) is stored. However, it may be possible to extract multiple field types (e.g. ``'e'``, ``'b'``, ``'j'``, ``'h'``) on the fly from the fields object. The field solution that is stored and the @@ -17,7 +17,7 @@ class Fields: Parameters ---------- - simulation : SimPEG.simulation.BaseSimulation + simulation : simpeg.simulation.BaseSimulation The simulation object used to compute the discrete field solution. knownFields : dict of {key: str}, optional Dictionary defining the field solutions that are stored and where @@ -96,7 +96,7 @@ def simulation(self): Returns ------- - SimPEG.simulation.BaseSimulation + simpeg.simulation.BaseSimulation The simulation object used to compute the field solution. """ return self._simulation @@ -185,7 +185,7 @@ def survey(self): Returns ------- - SimPEG.survey.BaseSurvey + simpeg.survey.BaseSurvey Survey used by the simulation. """ return self.simulation.survey @@ -351,7 +351,7 @@ class TimeFields(Fields): r"""Base class for storing TDEM fields. ``TimeFields`` is a base class for storing discrete field solutions for simulations - that use discrete time-stepping; see :py:class:`SimPEG.simulation.BaseTimeSimulation`. + that use discrete time-stepping; see :py:class:`simpeg.simulation.BaseTimeSimulation`. Generally only one field solution (e.g. ``'eSolution'``, ``'phiSolution'``, ``'bSolution'``) is stored. However, it may be possible to extract multiple field types (e.g. ``'e'``, ``'b'``, ``'j'``, ``'h'``) on the fly from the fields object. The field solution that is stored and the @@ -360,7 +360,7 @@ class TimeFields(Fields): Parameters ---------- - simulation : SimPEG.simulation.BaseTimeSimulation + simulation : simpeg.simulation.BaseTimeSimulation The simulation object used to compute the discrete field solution. knownFields : dict of {key: str}, optional Dictionary defining the field solutions that are stored and where @@ -413,7 +413,7 @@ def simulation(self): Returns ------- - SimPEG.simulation.BaseTimeSimulation + simpeg.simulation.BaseTimeSimulation The simulation object used to compute the field solution. """ return self._simulation diff --git a/simpeg/flow/richards/empirical.py b/simpeg/flow/richards/empirical.py index ae74f05b96..97f6e5b640 100644 --- a/simpeg/flow/richards/empirical.py +++ b/simpeg/flow/richards/empirical.py @@ -1,7 +1,9 @@ +import discretize.base import numpy as np import scipy.sparse as sp from scipy import constants from ... import utils, props +from ...utils import validate_type def _get_projections(u): @@ -34,12 +36,19 @@ class NonLinearModel(props.HasModel): """A non linear model that has dependence on the fields and a model""" counter = None #: A simpeg.utils.Counter object - mesh = None #: A discretize Mesh def __init__(self, mesh, **kwargs): self.mesh = mesh super(NonLinearModel, self).__init__(**kwargs) + @property + def mesh(self): + return self._mesh + + @mesh.setter + def mesh(self, value): + self._mesh = validate_type("mesh", value, discretize.base.BaseMesh, cast=False) + @property def nP(self): """Number of parameters in the model.""" diff --git a/simpeg/flow/richards/simulation.py b/simpeg/flow/richards/simulation.py index c6dae5c408..20d5055c9e 100644 --- a/simpeg/flow/richards/simulation.py +++ b/simpeg/flow/richards/simulation.py @@ -1,8 +1,10 @@ +import discretize.base import numpy as np import scipy.sparse as sp import time from ... import utils +from ...base import BasePDESimulation from ...simulation import BaseTimeSimulation from ... import optimization from ...utils import ( @@ -19,7 +21,7 @@ from .empirical import BaseWaterRetention -class SimulationNDCellCentered(BaseTimeSimulation): +class SimulationNDCellCentered(BaseTimeSimulation, BasePDESimulation): """Richards Simulation""" def __init__( @@ -53,6 +55,22 @@ def __init__( ) water_retention = NestedModeler(BaseWaterRetention, "water retention curve") + @property + def mesh(self): + """Tensor style mesh for the Richards flow simulation. + + Returns + ------- + discretize.TensorMesh or discretize.TreeMesh + """ + return self._mesh + + @mesh.setter + def mesh(self, value): + self._mesh = validate_type( + "mesh", value, (discretize.TensorMesh, discretize.TreeMesh), cast=False + ) + # TODO: This can also be a function(time, u_ii) @property def boundary_conditions(self): diff --git a/simpeg/inverse_problem.py b/simpeg/inverse_problem.py index 59617296c0..c0d60667a6 100644 --- a/simpeg/inverse_problem.py +++ b/simpeg/inverse_problem.py @@ -13,8 +13,8 @@ validate_type, validate_ndarray_with_shape, ) -from .simulation import DefaultSolver from .version import __version__ as simpeg_version +from .utils.solver_utils import get_default_solver class BaseInvProblem: @@ -96,7 +96,7 @@ def counter(self, value): self._counter = value @property - def dmisfit(self): + def dmisfit(self) -> ComboObjectiveFunction: """The data misfit. Returns @@ -113,7 +113,7 @@ def dmisfit(self, value): self._dmisfit = value @property - def reg(self): + def reg(self) -> ComboObjectiveFunction: """The regularization object for the inversion Returns @@ -144,7 +144,7 @@ def opt(self, value): self._opt = validate_type("opt", value, Minimize, cast=False) @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): """A list of properties stored on this object to delete when the model is updated Returns @@ -170,7 +170,7 @@ def model(self, value): value = validate_ndarray_with_shape( "model", value, shape=[("*",), ("*", "*")], dtype=None ) - for prop in self.deleteTheseOnModelUpdate: + for prop in self._delete_on_model_update: if hasattr(self, prop): delattr(self, prop) self._model = value @@ -202,7 +202,6 @@ def startup(self, m0): self.model = m0 - solver = DefaultSolver set_default = True for objfct in self.dmisfit.objfcts: if ( @@ -222,15 +221,15 @@ def startup(self, m0): set_default = False break if set_default: + solver = get_default_solver() print( """ simpeg.InvProblem is setting bfgsH0 to the inverse of the eval2Deriv. ***Done using the default solver {} and no solver_opts.*** """.format( - DefaultSolver.__name__ + solver.__name__ ) ) - solver = DefaultSolver solver_opts = {} self.opt.bfgsH0 = solver( diff --git a/simpeg/maps/__init__.py b/simpeg/maps/__init__.py new file mode 100644 index 0000000000..d24d07aa9f --- /dev/null +++ b/simpeg/maps/__init__.py @@ -0,0 +1,35 @@ +from ._base import ( + ComboMap, + IdentityMap, + LinearMap, + Projection, + SphericalSystem, + SumMap, + TileMap, + Wires, +) +from ._clustering import PolynomialPetroClusterMap +from ._injection import Mesh2Mesh, InjectActiveCells +from ._property_maps import ( + ChiMap, + ComplexMap, + ExpMap, + LogisticSigmoidMap, + LogMap, + MuRelative, + ReciprocalMap, + SelfConsistentEffectiveMedium, + Weighting, +) +from ._parametric import ( + BaseParametric, + ParametricBlock, + ParametricBlockInLayer, + ParametricCasingAndLayer, + ParametricCircleMap, + ParametricEllipsoid, + ParametricLayer, + ParametricPolyMap, + ParametricSplineMap, +) +from ._surjection import Surject2Dto3D, SurjectFull, SurjectUnits, SurjectVertical1D diff --git a/simpeg/maps/_base.py b/simpeg/maps/_base.py new file mode 100644 index 0000000000..b2d0def858 --- /dev/null +++ b/simpeg/maps/_base.py @@ -0,0 +1,1352 @@ +""" +Base and general map classes. +""" + +from collections import namedtuple +import discretize +import numpy as np +import scipy.sparse as sp +from scipy.sparse import csr_matrix as csr +from discretize.tests import check_derivative +from discretize.utils import Zero, Identity, mkvc, speye, sdiag +import uuid + +from ..utils import ( + mat_utils, + validate_type, + validate_ndarray_with_shape, + validate_list_of_types, + validate_active_indices, + validate_integer, + validate_float, +) +from ..typing import RandomSeed + + +class IdentityMap: + r"""Identity mapping and the base mapping class for all other SimPEG mappings. + + The ``IdentityMap`` class is used to define the mapping when + the model parameters are the same as the parameters used in the forward + simulation. For a discrete set of model parameters :math:`\mathbf{m}`, + the mapping :math:`\mathbf{u}(\mathbf{m})` is equivalent to applying + the identity matrix; i.e.: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \mathbf{Im} + + The ``IdentityMap`` also acts as the base class for all other SimPEG mapping classes. + + Using the *mesh* or *nP* input arguments, the dimensions of the corresponding + mapping operator can be permanently set; i.e. (*mesh.nC*, *mesh.nC*) or (*nP*, *nP*). + However if both input arguments *mesh* and *nP* are ``None``, the shape of + mapping operator is arbitrary and can act on any vector; i.e. has shape (``*``, ``*``). + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int, or '*' + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + if (isinstance(nP, str) and nP == "*") or nP is None: + if mesh is not None: + nP = mesh.n_cells + else: + nP = "*" + else: + try: + nP = int(nP) + except (TypeError, ValueError) as err: + raise TypeError( + f"Unrecognized input of {repr(nP)} for number of parameters, must be an integer or '*'." + ) from err + self.mesh = mesh + self._nP = nP + + self._uuid = uuid.uuid4() + + super().__init__(**kwargs) + + @property + def nP(self): + r"""Number of parameters the mapping acts on. + + Returns + ------- + int or ``*`` + Number of parameters that the mapping acts on. Returns an + ``int`` if the dimensions of the mapping are set. If the + mapping can act on a vector of any length, ``*`` is returned. + """ + if self._nP != "*": + return int(self._nP) + if self.mesh is None: + return "*" + return int(self.mesh.nC) + + @property + def shape(self): + r"""Dimensions of the mapping operator + + The dimensions of the mesh depend on the input arguments used + during instantiation. If *mesh* is used to define the + identity map, the shape of mapping operator is (*mesh.nC*, *mesh.nC*). + If *nP* is used to define the identity map, the mapping operator + has dimensions (*nP*, *nP*). However if both *mesh* and *nP* are + used to define the identity map, the mapping will have shape + (*mesh.nC*, *nP*)! And if *mesh* and *nP* were ``None`` when + instantiating, the mapping has dimensions (``*``, ``*``) and may + act on a vector of any length. + + Returns + ------- + tuple + Dimensions of the mapping operator. If the dimensions of + the mapping are set, the return is a tuple (``int``,``int``). + If the mapping can act on a vector of arbitrary length, the + return is a tuple (``*``, ``*``). + """ + if self.mesh is None: + return (self.nP, self.nP) + return (self.mesh.nC, self.nP) + + def _transform(self, m): + """ + Changes the model into the physical property. + + .. note:: + + This can be called by the __mul__ property against a + :meth:numpy.ndarray. + + :param numpy.ndarray m: model + :rtype: numpy.ndarray + :return: transformed model + + """ + return m + + def inverse(self, D): + """ + The transform inverse is not implemented. + """ + raise NotImplementedError("The transform inverse is not implemented.") + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix or numpy.ndarray + Derivative of the mapping with respect to the model parameters. For an + identity mapping, this is just a sparse identity matrix. If the input + argument *v* is not ``None``, the method returns the derivative times + the vector *v*; which in this case is just *v*. + + Notes + ----- + Let :math:`\mathbf{m}` be a set of model parameters and let :math:`\mathbf{I}` + denote the identity map. Where the identity mapping acting on the model parameters + can be expressed as: + + .. math:: + \mathbf{u} = \mathbf{I m}, + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{I} + + For the Identity map **deriv** simply returns a sparse identity matrix. + """ + if v is not None: + return v + if isinstance(self.nP, (int, np.integer)): + return sp.identity(self.nP) + return Identity() + + def test(self, m=None, num=4, random_seed: RandomSeed | None = None, **kwargs): + """Derivative test for the mapping. + + This test validates the mapping by performing a convergence test. + + Parameters + ---------- + m : (nP) numpy.ndarray + Starting vector of model parameters for the derivative test + num : int + Number of iterations for the derivative test + random_seed : None or :class:`~simpeg.typing.RandomSeed`, optional + Random seed used for generating a random array for ``m`` if it's + None. It can either be an int, a predefined Numpy random number + generator, or any valid input to ``numpy.random.default_rng``. + kwargs: dict + Keyword arguments and associated values in the dictionary must + match those used in :meth:`discretize.tests.check_derivative` + + Returns + ------- + bool + Returns ``True`` if the test passes + """ + print("Testing {0!s}".format(str(self))) + rng = np.random.default_rng(seed=random_seed) + if m is None: + m = rng.uniform(size=self.nP) + if "plotIt" not in kwargs: + kwargs["plotIt"] = False + + assert isinstance( + self.nP, (int, np.integer) + ), "nP must be an integer for {}".format(self.__class__.__name__) + return check_derivative( + lambda m: [self * m, self.deriv(m)], m, num=num, random_seed=rng, **kwargs + ) + + def _assertMatchesPair(self, pair): + assert ( + isinstance(self, pair) + or isinstance(self, ComboMap) + and isinstance(self.maps[0], pair) + ), "Mapping object must be an instance of a {0!s} class.".format(pair.__name__) + + def __mul__(self, val): + if isinstance(val, IdentityMap): + if ( + not (self.shape[1] == "*" or val.shape[0] == "*") + and not self.shape[1] == val.shape[0] + ): + raise ValueError( + "Dimension mismatch in {0!s} and {1!s}.".format(str(self), str(val)) + ) + return ComboMap([self, val]) + + elif isinstance(val, np.ndarray): + if not self.shape[1] == "*" and not self.shape[1] == val.shape[0]: + raise ValueError( + "Dimension mismatch in {0!s} and np.ndarray{1!s}.".format( + str(self), str(val.shape) + ) + ) + return self._transform(val) + + elif isinstance(val, Zero): + return Zero() + + raise Exception( + "Unrecognized data type to multiply. Try a map or a numpy.ndarray!" + "You used a {} of type {}".format(val, type(val)) + ) + + def dot(self, map1): + r"""Multiply two mappings to create a :class:`simpeg.maps.ComboMap`. + + Let :math:`\mathbf{f}_1` and :math:`\mathbf{f}_2` represent two mapping functions. + Where :math:`\mathbf{m}` represents a set of input model parameters, + the ``dot`` method is used to create a combination mapping: + + .. math:: + u(\mathbf{m}) = f_2(f_1(\mathbf{m})) + + Where :math:`\mathbf{f_1} : M \rightarrow K_1` and acts on the + model first, and :math:`\mathbf{f_2} : K_1 \rightarrow K_2`, the combination + mapping :math:`\mathbf{u} : M \rightarrow K_2`. + + When using the **dot** method, the input argument *map1* represents the first + mapping that is be applied and *self* represents the second mapping + that is be applied. Therefore, the correct syntax for using this method is:: + + self.dot(map1) + + + Parameters + ---------- + map1 : + A SimPEG mapping object. + + Examples + -------- + Here we create a combination mapping that 1) projects a single scalar to + a vector space of length 5, then takes the natural exponent. + + >>> import numpy as np + >>> from simpeg.maps import ExpMap, Projection + + >>> nP1 = 1 + >>> nP2 = 5 + >>> ind = np.zeros(nP1, dtype=int) + + >>> projection_map = Projection(nP1, ind) + >>> projection_map.shape + (5, 1) + + >>> exp_map = ExpMap(nP=5) + >>> exp_map.shape + (5, 5) + + >>> combo_map = exp_map.dot(projection_map) + >>> combo_map.shape + (5, 1) + + >>> m = np.array([2]) + >>> combo_map * m + array([7.3890561, 7.3890561, 7.3890561, 7.3890561, 7.3890561]) + + """ + return self.__mul__(map1) + + def __matmul__(self, map1): + return self.__mul__(map1) + + __numpy_ufunc__ = True + + def __add__(self, map1): + return SumMap([self, map1]) # error-checking done inside of the SumMap + + def __str__(self): + return "{0!s}({1!s},{2!s})".format( + self.__class__.__name__, self.shape[0], self.shape[1] + ) + + def __len__(self): + return 1 + + @property + def mesh(self): + """ + The mesh used for the mapping + + Returns + ------- + discretize.base.BaseMesh or None + """ + return self._mesh + + @mesh.setter + def mesh(self, value): + if value is not None: + value = validate_type("mesh", value, discretize.base.BaseMesh, cast=False) + self._mesh = value + + @property + def is_linear(self): + """Determine whether or not this mapping is a linear operation. + + Returns + ------- + bool + """ + return True + + +class ComboMap(IdentityMap): + r"""Combination mapping constructed by joining a set of other mappings. + + A ``ComboMap`` is a single mapping object made by joining a set + of basic mapping operations by chaining them together, in order. + When creating a ``ComboMap``, the user provides a list of SimPEG mapping objects they wish to join. + The order of the mappings in this list is from last to first; i.e. + :math:`[\mathbf{f}_n , ... , \mathbf{f}_2 , \mathbf{f}_1]`. + + The combination mapping :math:`\mathbf{u}(\mathbf{m})` that acts on a + set of input model parameters :math:`\mathbf{m}` is defined as: + + .. math:: + \mathbf{u}(\mathbf{m}) = f_n(f_{n-1}(\cdots f_1(f_0(\mathbf{m})))) + + Note that any time that you create your own combination mapping, + be sure to test that the derivative is correct. + + Parameters + ---------- + maps : list of simpeg.maps.IdentityMap + A ``list`` of SimPEG mapping objects. The ordering of the mapping + objects in the ``list`` is from last applied to first applied! + + Examples + -------- + Here we create a combination mapping that 1) projects a single scalar to + a vector space of length 5, then takes the natural exponent. + + >>> import numpy as np + >>> from simpeg.maps import ExpMap, Projection, ComboMap + + >>> nP1 = 1 + >>> nP2 = 5 + >>> ind = np.zeros(nP1, dtype=int) + + >>> projection_map = Projection(nP1, ind) + >>> projection_map.shape + (5, 1) + + >>> exp_map = ExpMap(nP=5) + >>> exp_map.shape + (5, 5) + + Recall that the order of the mapping objects is from last applied + to first applied. + + >>> map_list = [exp_map, projection_map] + >>> combo_map = ComboMap(map_list) + >>> combo_map.shape + (5, 1) + + >>> m = np.array([2.]) + >>> combo_map * m + array([7.3890561, 7.3890561, 7.3890561, 7.3890561, 7.3890561]) + + """ + + def __init__(self, maps, **kwargs): + super().__init__(mesh=None, **kwargs) + + self.maps = [] + for ii, m in enumerate(maps): + assert isinstance(m, IdentityMap), "Unrecognized data type, " + "inherit from an IdentityMap or ComboMap!" + + if ( + ii > 0 + and not (self.shape[1] == "*" or m.shape[0] == "*") + and not self.shape[1] == m.shape[0] + ): + prev = self.maps[-1] + + raise ValueError( + "Dimension mismatch in map[{0!s}] ({1!s}, {2!s}) " + "and map[{3!s}] ({4!s}, {5!s}).".format( + prev.__class__.__name__, + prev.shape[0], + prev.shape[1], + m.__class__.__name__, + m.shape[0], + m.shape[1], + ) + ) + + if np.any([isinstance(m, SumMap), isinstance(m, IdentityMap)]): + self.maps += [m] + elif isinstance(m, ComboMap): + self.maps += m.maps + else: + raise ValueError("Map[{0!s}] not supported", m.__class__.__name__) + + @property + def shape(self): + r"""Dimensions of the mapping. + + For a list of SimPEG mappings [:math:`\mathbf{f}_n,...,\mathbf{f}_1`] + that have been joined to create a ``ComboMap``, this method returns + the dimensions of the combination mapping. Recall that the ordering + of the list of mappings is from last to first. + + Returns + ------- + (2) tuple of int + Dimensions of the mapping operator. + """ + return (self.maps[0].shape[0], self.maps[-1].shape[1]) + + @property + def nP(self): + r"""Number of parameters the mapping acts on. + + Returns + ------- + int + Number of parameters that the mapping acts on. + """ + return self.maps[-1].nP + + def _transform(self, m): + for map_i in reversed(self.maps): + m = map_i * m + return m + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + Any time that you create your own combination mapping, + be sure to test that the derivative is correct. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. + If the input argument *v* is not ``None``, the method returns + the derivative times the vector *v*. + + Notes + ----- + Let :math:`\mathbf{m}` be a set of model parameters and let + [:math:`\mathbf{f}_n,...,\mathbf{f}_1`] be the list of SimPEG mappings joined + to create a combination mapping. Recall that the list of mappings is ordered + from last applied to first applied. + + Where the combination mapping acting on the model parameters + can be expressed as: + + .. math:: + \mathbf{u}(\mathbf{m}) = f_n(f_{n-1}(\cdots f_1(f_0(\mathbf{m})))) + + The **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters. To do this, we use the chain rule, i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = + \frac{\partial \mathbf{f_n}}{\partial \mathbf{f_{n-1}}} + \cdots + \frac{\partial \mathbf{f_2}}{\partial \mathbf{f_{1}}} + \frac{\partial \mathbf{f_1}}{\partial \mathbf{m}} + """ + + if v is not None: + deriv = v + else: + deriv = 1 + + mi = m + for map_i in reversed(self.maps): + deriv = map_i.deriv(mi) * deriv + mi = map_i * mi + return deriv + + def __str__(self): + return "ComboMap[{0!s}]({1!s},{2!s})".format( + " * ".join([m.__str__() for m in self.maps]), self.shape[0], self.shape[1] + ) + + def __len__(self): + return len(self.maps) + + @property + def is_linear(self): + return all(m.is_linear for m in self.maps) + + +class LinearMap(IdentityMap): + """A generalized linear mapping. + + A simple map that implements the linear mapping, + + >>> y = A @ x + b + + Parameters + ---------- + A : (M, N) array_like, optional + The matrix operator, can be any object that implements `__matmul__` + and has a `shape` attribute. + b : (M) array_like, optional + Additive part of the linear operation. + """ + + def __init__(self, A, b=None, **kwargs): + kwargs.pop("mesh", None) + kwargs.pop("nP", None) + super().__init__(**kwargs) + self.A = A + self.b = b + + @property + def A(self): + """The linear operator matrix. + + Returns + ------- + LinearOperator + Must support matrix multiplication and have a shape attribute. + """ + return self._A + + @A.setter + def A(self, value): + if not hasattr(value, "__matmul__"): + raise TypeError( + f"{repr(value)} does not implement the matrix multiplication operator." + ) + if not hasattr(value, "shape"): + raise TypeError(f"{repr(value)} does not have a shape attribute.") + self._A = value + self._nP = value.shape[1] + self._shape = value.shape + + @property + def shape(self): + return self._shape + + @property + def b(self): + """Added part of the linear operation. + + Returns + ------- + numpy.ndarray + """ + return self._b + + @b.setter + def b(self, value): + if value is not None: + value = validate_ndarray_with_shape("b", value, shape=(self.shape[0],)) + self._b = value + + def _transform(self, m): + if self.b is None: + return self.A @ m + return self.A @ m + self.b + + def deriv(self, m, v=None): + if v is None: + return self.A + return self.A @ v + + +class Projection(IdentityMap): + r"""Projection mapping. + + ``Projection`` mapping can be used to project and/or rearange model + parameters. For a set of model parameter :math:`\mathbf{m}`, + the mapping :math:`\mathbf{u}(\mathbf{m})` can be defined by a linear + projection matrix :math:`\mathbf{P}` acting on the model, i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + + The number of model parameters the mapping acts on is + defined by *nP*. Projection and/or rearrangement of the parameters + is defined by *index*. Thus the dimensions of the mapping is + (*nInd*, *nP*). + + Parameters + ---------- + nP : int + Number of model parameters the mapping acts on + index : numpy.ndarray of int + Indexes defining the projection from the model space + + Examples + -------- + Here we define a mapping that rearranges and projects 2 model + parameters to a vector space spanning 4 parameters. + + >>> from simpeg.maps import Projection + >>> import numpy as np + + >>> nP = 2 + >>> index = np.array([1, 0, 1, 0], dtype=int) + >>> mapping = Projection(nP, index) + + >>> m = np.array([6, 8]) + >>> mapping * m + array([8, 6, 8, 6]) + + """ + + def __init__(self, nP, index, **kwargs): + assert isinstance( + index, (np.ndarray, slice, list) + ), "index must be a np.ndarray or slice, not {}".format(type(index)) + super(Projection, self).__init__(nP=nP, **kwargs) + + if isinstance(index, slice): + index = list(range(*index.indices(self.nP))) + + if isinstance(index, np.ndarray): + if index.dtype is np.dtype("bool"): + index = np.where(index)[0] + + self.index = index + self._shape = nI, nP = len(self.index), self.nP + + assert max(index) < nP, "maximum index must be less than {}".format(nP) + + # sparse projection matrix + self.P = sp.csr_matrix((np.ones(nI), (range(nI), self.index)), shape=(nI, nP)) + + def _transform(self, m): + return m[self.index] + + @property + def shape(self): + r"""Dimensions of the mapping. + + Returns + ------- + tuple + Where *nP* is the number of parameters the mapping acts on and + *nInd* is the length of the vector defining the mapping, the + dimensions of the mapping operator is a tuple of the + form (*nInd*, *nP*). + """ + return self._shape + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + Let :math:`\mathbf{m}` be a set of model parameters and let :math:`\mathbf{P}` + be a matrix denoting the projection mapping. Where the projection mapping acting + on the model parameters can be expressed as: + + .. math:: + \mathbf{u} = \mathbf{P m}, + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{P} + + Note that in this case, **deriv** simply returns a sparse projection matrix. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + + if v is not None: + return self.P * v + return self.P + + +class SumMap(ComboMap): + """Combination map constructed by summing multiple mappings + to the same vector space. + + A map to add model parameters contributing to the + forward operation e.g. F(m) = F(g(x) + h(y)) + + Assumes that the model vectors defined by g(x) and h(y) + are equal in length. + Allows to assume different things about the model m: + i.e. parametric + voxel models + + Parameters + ---------- + maps : list + A list of SimPEG mapping objects that are being summed. + Each mapping object in the list must act on the same number + of model parameters and must map to the same vector space! + """ + + def __init__(self, maps, **kwargs): + maps = validate_list_of_types("maps", maps, IdentityMap) + + # skip ComboMap's init + super(ComboMap, self).__init__(mesh=None, **kwargs) + + self.maps = [] + for ii, m in enumerate(maps): + if not isinstance(m, IdentityMap): + raise TypeError( + "Unrecognized data type {}, inherit from an " + "IdentityMap!".format(type(m)) + ) + + if ( + ii > 0 + and not (self.shape == "*" or m.shape == "*") + and not self.shape == m.shape + ): + raise ValueError( + "Dimension mismatch in map[{0!s}] ({1!s}, {2!s}) " + "and map[{3!s}] ({4!s}, {5!s}).".format( + self.maps[0].__class__.__name__, + self.maps[0].shape[0], + self.maps[0].shape[1], + m.__class__.__name__, + m.shape[0], + m.shape[1], + ) + ) + + self.maps += [m] + + @property + def shape(self): + """Dimensions of the mapping. + + Returns + ------- + tuple + The dimensions of the mapping. A tuple of the form (``int``,``int``) + """ + return (self.maps[0].shape[0], self.maps[0].shape[1]) + + @property + def nP(self): + r"""Number of parameters the combined mapping acts on. + + Returns + ------- + int + Number of parameters that the mapping acts on. + """ + return self.maps[-1].shape[1] + + def _transform(self, m): + for ii, map_i in enumerate(self.maps): + m0 = m.copy() + m0 = map_i * m0 + + if ii == 0: + mout = m0 + else: + mout += m0 + return mout + + def deriv(self, m, v=None): + """Derivative of mapping with respect to the input parameters + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + + for ii, map_i in enumerate(self.maps): + m0 = m.copy() + + if v is not None: + deriv = v + else: + deriv = sp.eye(self.nP) + + deriv = map_i.deriv(m0, v=deriv) + if ii == 0: + sumDeriv = deriv + else: + sumDeriv += deriv + + return sumDeriv + + +class SphericalSystem(IdentityMap): + r"""Mapping vectors from spherical to Cartesian coordinates. + + Let :math:`\mathbf{m}` be a model containing the amplitudes + (:math:`\mathbf{a}`), azimuthal angles (:math:`\mathbf{t}`) + and radial angles (:math:`\mathbf{p}`) for a set of vectors + in spherical space such that: + + .. math:: + \mathbf{m} = \begin{bmatrix} \mathbf{a} \\ \mathbf{t} \\ \mathbf{p} \end{bmatrix} + + ``SphericalSystem`` constructs a mapping :math:`\mathbf{u}(\mathbf{m}) + that converts the set of vectors in spherical coordinates to + their representation in Cartesian coordinates, i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \begin{bmatrix} \mathbf{v_x} \\ \mathbf{v_y} \\ \mathbf{v_z} \end{bmatrix} + + where :math:`\mathbf{v_x}`, :math:`\mathbf{v_y}` and :math:`\mathbf{v_z}` + store the x, y and z components of the vectors, respectively. + + Using the *mesh* or *nP* input arguments, the dimensions of the corresponding + mapping operator can be permanently set; i.e. (*3\*mesh.nC*, *3\*mesh.nC*) or (*nP*, *nP*). + However if both input arguments *mesh* and *nP* are ``None``, the shape of + mapping operator is arbitrary and can act on any vector whose length + is a multiple of 3; i.e. has shape (``*``, ``*``). + + Notes + ----- + + In Cartesian space, the components of each vector are defined as + + .. math:: + \mathbf{v} = (v_x, v_y, v_z) + + In spherical coordinates, vectors are is defined as: + + .. math:: + \mathbf{v^\prime} = (a, t, p) + + where + + - :math:`a` is the amplitude of the vector + - :math:`t` is the azimuthal angle defined positive from vertical + - :math:`p` is the radial angle defined positive CCW from Easting + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal + *3\*mesh.nC* . + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + if nP is not None: + assert nP % 3 == 0, "Number of parameters must be a multiple of 3" + super().__init__(mesh, nP, **kwargs) + self.model = None + + def sphericalDeriv(self, model): + if getattr(self, "model", None) is None: + self.model = model + + if getattr(self, "_sphericalDeriv", None) is None or not all( + self.model == model + ): + self.model = model + + # Do a double projection to make sure the parameters are bounded + m_xyz = mat_utils.spherical2cartesian(model.reshape((-1, 3), order="F")) + m_atp = mat_utils.cartesian2spherical( + m_xyz.reshape((-1, 3), order="F") + ).reshape((-1, 3), order="F") + + nC = m_atp[:, 0].shape[0] + + dm_dx = sp.hstack( + [ + sp.diags(np.cos(m_atp[:, 1]) * np.cos(m_atp[:, 2]), 0), + sp.diags( + -m_atp[:, 0] * np.sin(m_atp[:, 1]) * np.cos(m_atp[:, 2]), 0 + ), + sp.diags( + -m_atp[:, 0] * np.cos(m_atp[:, 1]) * np.sin(m_atp[:, 2]), 0 + ), + ] + ) + + dm_dy = sp.hstack( + [ + sp.diags(np.cos(m_atp[:, 1]) * np.sin(m_atp[:, 2]), 0), + sp.diags( + -m_atp[:, 0] * np.sin(m_atp[:, 1]) * np.sin(m_atp[:, 2]), 0 + ), + sp.diags( + m_atp[:, 0] * np.cos(m_atp[:, 1]) * np.cos(m_atp[:, 2]), 0 + ), + ] + ) + + dm_dz = sp.hstack( + [ + sp.diags(np.sin(m_atp[:, 1]), 0), + sp.diags(m_atp[:, 0] * np.cos(m_atp[:, 1]), 0), + csr((nC, nC)), + ] + ) + + self._sphericalDeriv = sp.vstack([dm_dx, dm_dy, dm_dz]) + + return self._sphericalDeriv + + def _transform(self, model): + return mat_utils.spherical2cartesian(model.reshape((-1, 3), order="F")) + + def inverse(self, u): + r"""Maps vectors in Cartesian coordinates to spherical coordinates. + + Let :math:`\mathbf{v_x}`, :math:`\mathbf{v_y}` and :math:`\mathbf{v_z}` + store the x, y and z components of a set of vectors in Cartesian + coordinates such that: + + .. math:: + \mathbf{u} = \begin{bmatrix} \mathbf{x} \\ \mathbf{y} \\ \mathbf{z} \end{bmatrix} + + The inverse mapping recovers the vectors in spherical coordinates, i.e.: + + .. math:: + \mathbf{m}(\mathbf{u}) = \begin{bmatrix} \mathbf{a} \\ \mathbf{t} \\ \mathbf{p} \end{bmatrix} + + where :math:`\mathbf{a}` are the amplitudes, :math:`\mathbf{t}` are the + azimuthal angles and :math:`\mathbf{p}` are the radial angles. + + Parameters + ---------- + u : numpy.ndarray + The x, y and z components of a set of vectors in Cartesian coordinates. + If the mapping is defined for a mesh, the numpy.ndarray has length + *3\*mesh.nC* . + + Returns + ------- + numpy.ndarray + The amplitudes (:math:`\mathbf{a}`), azimuthal angles (:math:`\mathbf{t}`) + and radial angles (:math:`\mathbf{p}`) for the set of vectors in spherical + coordinates. If the mapping is defined for a mesh, the numpy.ndarray has length + *3\*mesh.nC* . + """ + return mat_utils.cartesian2spherical(u.reshape((-1, 3), order="F")) + + @property + def shape(self): + r"""Dimensions of the mapping + + The dimensions of the mesh depend on the input arguments used + during instantiation. If *mesh* is used to define the + mapping, the shape of mapping operator is (*3\*mesh.nC*, *3\*mesh.nC*). + If *nP* is used to define the identity map, the mapping operator + has dimensions (*nP*, *nP*). If *mesh* and *nP* were ``None`` when + instantiating, the mapping has dimensions (``*``, ``*``) and may + act on a vector whose length is a multiple of 3. + + Returns + ------- + tuple + Dimensions of the mapping operator. If the dimensions of + the mapping are set, the return is a tuple (``int``,``int``). + If the mapping can act on a vector of arbitrary length, the + return is a tuple (``*``, ``*``). + """ + # return self.n_block*len(self.indices[0]), self.n_block*len(self.indices) + return (self.nP, self.nP) + + def deriv(self, m, v=None): + """Derivative of mapping with respect to the input parameters + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + + if v is not None: + return self.sphericalDeriv(m) * v + return self.sphericalDeriv(m) + + @property + def is_linear(self): + return False + + +class Wires(object): + r"""Mapping class for organizing multiple parameter types into a single model. + + Let :math:`\mathbf{p_1}` and :math:`\mathbf{p_2}` be vectors that + contain the parameter values for two different parameter types; for example, + electrical conductivity and magnetic permeability. Here, all parameters + are organized into a single model :math:`\mathbf{m}` of the form: + + .. math:: + \mathbf{m} = \begin{bmatrix} \mathbf{p_1} \\ \mathbf{p_2} \end{bmatrix} + + The ``Wires`` class constructs and applies the basic projection mappings + for extracting the values of a particular parameter type from the model. + For example: + + .. math:: + \mathbf{p_1} = \mathbf{P_{\! 1} m} + + where :math:`\mathbf{P_1}` is the projection matrix that extracts parameters + :math:`\mathbf{p_1}` from the complete set of model parameters :math:`\mathbf{m}`. + Likewise, there is a projection matrix for extracting :math:`\mathbf{p_2}`. + This can be extended to a model that containing more than 2 parameter types. + + Parameters + ---------- + args : tuple + Each input argument is a tuple (``str``, ``int``) that provides the name + and number of parameters for a given parameters type. + + Examples + -------- + Here we construct a wire mapping for a model where there + are two parameters types. Note that the number of parameters + of each type does not need to be the same. + + >>> from simpeg.maps import Wires, ReciprocalMap + >>> import numpy as np + + >>> p1 = np.r_[4.5, 2.7, 6.9, 7.1, 1.2] + >>> p2 = np.r_[10., 2., 5.]**-1 + >>> nP1 = len(p1) + >>> nP2 = len(p2) + >>> m = np.r_[p1, p2] + >>> m + array([4.5, 2.7, 6.9, 7.1, 1.2, 0.1, 0.5, 0.2]) + + Here we construct the wire map. The user provides a name + and the number of parameters for each type. The name + provided becomes the name of the method for constructing + the projection mapping. + + >>> wire_map = Wires(('name_1', nP1), ('name_2', nP2)) + + Here, we extract the values for the first parameter type. + + >>> wire_map.name_1 * m + array([4.5, 2.7, 6.9, 7.1, 1.2]) + + And here, we extract the values for the second parameter + type then apply a reciprocal mapping. + + >>> reciprocal_map = ReciprocalMap() + >>> reciprocal_map * wire_map.name_2 * m + array([10., 2., 5.]) + + """ + + def __init__(self, *args): + for arg in args: + assert ( + isinstance(arg, tuple) + and len(arg) == 2 + and isinstance(arg[0], str) + and + # TODO: this should be extended to a slice. + isinstance(arg[1], (int, np.integer)) + ), ( + "Each wire needs to be a tuple: (name, length). " + "You provided: {}".format(arg) + ) + + self._nP = int(np.sum([w[1] for w in args])) + start = 0 + maps = [] + for arg in args: + wire = Projection(self.nP, slice(start, start + arg[1])) + setattr(self, arg[0], wire) + maps += [(arg[0], wire)] + start += arg[1] + self.maps = maps + + self._tuple = namedtuple("Model", [w[0] for w in args]) + + def __mul__(self, val): + assert isinstance(val, np.ndarray) + split = [] + for _, w in self.maps: + split += [w * val] + return self._tuple(*split) + + @property + def nP(self): + r"""Number of parameters the mapping acts on. + + Returns + ------- + int + Number of parameters that the mapping acts on. + """ + return self._nP + + +class TileMap(IdentityMap): + """ + Mapping for tiled inversion. + + Uses volume averaging to map a model defined on a global mesh to the + local mesh. Everycell in the local mesh must also be in the global mesh. + """ + + def __init__( + self, + global_mesh, + global_active, + local_mesh, + tol=1e-8, + components=1, + enforce_active=True, + **kwargs, + ): + """ + Parameters + ---------- + global_mesh : discretize.TreeMesh + Global TreeMesh defining the entire domain. + global_active : numpy.ndarray of bool or int + Defines the active cells in the global mesh. + local_mesh : discretize.TreeMesh + Local TreeMesh for the simulation. + tol : float, optional + Tolerance to avoid zero division + components : int, optional + Number of components in the model. E.g. a vector model in 3D would have 3 + components. + """ + super().__init__(mesh=None) + self._global_mesh = validate_type( + "global_mesh", global_mesh, discretize.TreeMesh, cast=False + ) + self._local_mesh = validate_type( + "local_mesh", local_mesh, discretize.TreeMesh, cast=False + ) + + self._global_active = validate_active_indices( + "global_active", global_active, self.global_mesh.n_cells + ) + self._local_active = None + + self._tol = validate_float("tol", tol, min_val=0.0, inclusive_min=False) + self._components = validate_integer("components", components, min_val=1) + self.enforce_active = enforce_active + # trigger creation of P + _ = self.projection + + @property + def global_mesh(self): + """Global TreeMesh defining the entire domain. + + Returns + ------- + discretize.TreeMesh + """ + return self._global_mesh + + @property + def local_mesh(self): + """Local TreeMesh defining the local domain. + + Returns + ------- + discretize.TreeMesh + """ + return self._local_mesh + + @property + def global_active(self): + """Defines the active cells in the global mesh. + + Returns + ------- + (global_mesh.n_cells) numpy.ndarray of bool + """ + return self._global_active + + @property + def local_active(self): + """ + This is the local_active of the global_active used in the global problem. + + Returns + ------- + (local_mesh.n_cells) numpy.ndarray of bool + """ + return self._local_active + + @property + def tol(self): + """Tolerance to avoid zero division. + + Returns + ------- + float + """ + return self._tol + + @property + def components(self): + """Number of components in the model. + + Returns + ------- + int + """ + return self._components + + @property + def projection(self): + """ + Set the projection matrix with partial volumes + """ + if getattr(self, "_projection", None) is None: + in_local = self.local_mesh.get_containing_cells( + self.global_mesh.cell_centers + ) + + projection = ( + sp.csr_matrix( + ( + self.global_mesh.cell_volumes, + (in_local, np.arange(self.global_mesh.nC)), + ), + shape=(self.local_mesh.nC, self.global_mesh.nC), + ) + * speye(self.global_mesh.nC)[:, self.global_active] + ) + + self._local_active = mkvc(np.sum(projection, axis=1) > 0) + + if self.enforce_active: + self.local_active[ + self.local_mesh.get_containing_cells( + self.global_mesh.cell_centers[~self.global_active, :] + ) + ] = False + projection = projection[self.local_active, :] + + self._projection = sp.block_diag( + [ + sdiag(1.0 / np.sum(projection, axis=1)) * projection + for ii in range(self.components) + ], + format="csr", + ) + + return self._projection + + def _transform(self, m): + return self.projection * m + + @property + def shape(self): + """ + Shape of the matrix operation (number of indices x nP) + """ + return self.projection.shape + + def deriv(self, m, v=None): + """ + :param numpy.ndarray m: model + :rtype: scipy.sparse.csr_matrix + :return: derivative of transformed model + """ + if v is not None: + return self.projection * v + return self.projection diff --git a/simpeg/maps/_clustering.py b/simpeg/maps/_clustering.py new file mode 100644 index 0000000000..5761e92d72 --- /dev/null +++ b/simpeg/maps/_clustering.py @@ -0,0 +1,152 @@ +""" +Map classes for petrophysics clusters. +""" + +import numpy as np +from numpy.polynomial import polynomial + + +from ..utils import validate_ndarray_with_shape + +from ._base import IdentityMap + + +class PolynomialPetroClusterMap(IdentityMap): + """ + Modeling polynomial relationships between physical properties + + Parameters + ---------- + coeffxx : array_like, optional + Coefficients for the xx component. Default is [0, 1] + coeffxy : array_like, optional + Coefficients for the xy component. Default is [0] + coeffyx : array_like, optional + Coefficients for the yx component. Default is [0] + coeffyy : array_like, optional + Coefficients for the yy component. Default is [0, 1] + """ + + def __init__( + self, + coeffxx=None, + coeffxy=None, + coeffyx=None, + coeffyy=None, + mesh=None, + nP=None, + **kwargs, + ): + if coeffxx is None: + coeffxx = np.r_[0.0, 1.0] + if coeffxy is None: + coeffxy = np.r_[0.0] + if coeffyx is None: + coeffyx = np.r_[0.0] + if coeffyy is None: + coeffyy = np.r_[0.0, 1.0] + + self._coeffxx = validate_ndarray_with_shape("coeffxx", coeffxx, shape=("*",)) + self._coeffxy = validate_ndarray_with_shape("coeffxy", coeffxy, shape=("*",)) + self._coeffyx = validate_ndarray_with_shape("coeffyx", coeffyx, shape=("*",)) + self._coeffyy = validate_ndarray_with_shape("coeffyy", coeffyy, shape=("*",)) + + self._polynomialxx = polynomial.Polynomial(self.coeffxx) + self._polynomialxy = polynomial.Polynomial(self.coeffxy) + self._polynomialyx = polynomial.Polynomial(self.coeffyx) + self._polynomialyy = polynomial.Polynomial(self.coeffyy) + self._polynomialxx_deriv = self._polynomialxx.deriv(m=1) + self._polynomialxy_deriv = self._polynomialxy.deriv(m=1) + self._polynomialyx_deriv = self._polynomialyx.deriv(m=1) + self._polynomialyy_deriv = self._polynomialyy.deriv(m=1) + + super().__init__(mesh=mesh, nP=nP, **kwargs) + + @property + def coeffxx(self): + """Coefficients for the xx component. + + Returns + ------- + numpy.ndarray + """ + return self._coeffxx + + @property + def coeffxy(self): + """Coefficients for the xy component. + + Returns + ------- + numpy.ndarray + """ + return self._coeffxy + + @property + def coeffyx(self): + """Coefficients for the yx component. + + Returns + ------- + numpy.ndarray + """ + return self._coeffyx + + @property + def coeffyy(self): + """Coefficients for the yy component. + + Returns + ------- + numpy.ndarray + """ + return self._coeffyy + + def _transform(self, m): + out = m.copy() + out[:, 0] = self._polynomialxx(m[:, 0]) + self._polynomialxy(m[:, 1]) + out[:, 1] = self._polynomialyx(m[:, 0]) + self._polynomialyy(m[:, 1]) + return out + + def inverse(self, D): + r""" + :param numpy.array D: physical property + :rtype: numpy.array + :return: model + + The *transformInverse* changes the physical property into the + model. + + .. math:: + + m = \log{\sigma} + + """ + raise NotImplementedError("Inverse is not implemented.") + + def _derivmatrix(self, m): + return np.r_[ + [ + [ + self._polynomialxx_deriv(m[:, 0])[0], + self._polynomialyx_deriv(m[:, 0])[0], + ], + [ + self._polynomialxy_deriv(m[:, 1])[0], + self._polynomialyy_deriv(m[:, 1])[0], + ], + ] + ] + + def deriv(self, m, v=None): + """""" + if v is None: + out = self._derivmatrix(m.reshape(-1, 2)) + return out + else: + out = np.dot(self._derivmatrix(m.reshape(-1, 2)), v.reshape(2, -1)) + return out + + @property + def is_linear(self): + return False diff --git a/simpeg/maps/_injection.py b/simpeg/maps/_injection.py new file mode 100644 index 0000000000..e99c5bad10 --- /dev/null +++ b/simpeg/maps/_injection.py @@ -0,0 +1,390 @@ +""" +Injection and interpolation map classes. +""" + +import warnings +import discretize +import numpy as np +import scipy.sparse as sp +from numbers import Number + +from ..utils import ( + validate_type, + validate_ndarray_with_shape, + validate_float, + validate_active_indices, +) +from ._base import IdentityMap +from ..utils.code_utils import deprecate_property + + +class Mesh2Mesh(IdentityMap): + """ + Takes a model on one mesh are translates it to another mesh. + """ + + def __init__(self, meshes, active_cells=None, indActive=None, **kwargs): + # Sanity checks for the meshes parameter + try: + mesh, mesh2 = meshes + except TypeError: + raise TypeError("Couldn't unpack 'meshes' into two meshes.") + + super().__init__(mesh=mesh, **kwargs) + + self.mesh2 = mesh2 + # Check dimensions of both meshes + if mesh.dim != mesh2.dim: + raise ValueError( + f"Found meshes with dimensions '{mesh.dim}' and '{mesh2.dim}'. " + + "Both meshes must have the same dimension." + ) + + # Deprecate indActive argument + if indActive is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'indActive'." + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = indActive + + self.active_cells = active_cells + + # reset to not accepted None for mesh + @IdentityMap.mesh.setter + def mesh(self, value): + self._mesh = validate_type("mesh", value, discretize.base.BaseMesh, cast=False) + + @property + def mesh2(self): + """The source mesh used for the mapping. + + Returns + ------- + discretize.base.BaseMesh + """ + return self._mesh2 + + @mesh2.setter + def mesh2(self, value): + self._mesh2 = validate_type( + "mesh2", value, discretize.base.BaseMesh, cast=False + ) + + @property + def active_cells(self): + """Active indices on target mesh. + + Returns + ------- + (mesh.n_cells) numpy.ndarray of bool or none + """ + return self._active_cells + + @active_cells.setter + def active_cells(self, value): + if value is not None: + value = validate_active_indices("active_cells", value, self.mesh.n_cells) + self._active_cells = value + + indActive = deprecate_property( + active_cells, + "indActive", + "active_cells", + removal_version="0.24.0", + future_warn=True, + error=False, + ) + + @property + def P(self): + if getattr(self, "_P", None) is None: + self._P = self.mesh2.get_interpolation_matrix( + ( + self.mesh.cell_centers[self.active_cells, :] + if self.active_cells is not None + else self.mesh.cell_centers + ), + "CC", + zeros_outside=True, + ) + return self._P + + @property + def shape(self): + """Number of parameters in the model.""" + if self.active_cells is not None: + return (self.active_cells.sum(), self.mesh2.nC) + return (self.mesh.nC, self.mesh2.nC) + + @property + def nP(self): + """Number of parameters in the model.""" + return self.mesh2.nC + + def _transform(self, m): + return self.P * m + + def deriv(self, m, v=None): + if v is not None: + return self.P * v + return self.P + + +class InjectActiveCells(IdentityMap): + r"""Map active cells model to all cell of a mesh. + + The ``InjectActiveCells`` class is used to define the mapping when + the model consists of physical property values for a set of active + mesh cells; e.g. cells below topography. For a discrete set of + model parameters :math:`\mathbf{m}` defined on a set of active + cells, the mapping :math:`\mathbf{u}(\mathbf{m})` is defined as: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + \mathbf{d}\, m_\perp + + where :math:`\mathbf{P}` is a (*nC* , *nP*) projection matrix from + active cells to all mesh cells, and :math:`\mathbf{d}` is a + (*nC* , 1) matrix that projects the inactive cell value + :math:`m_\perp` to all inactive mesh cells. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + active_cells : numpy.ndarray + Active cells array. Can be a boolean ``numpy.ndarray`` of length *mesh.nC* + or a ``numpy.ndarray`` of ``int`` containing the indices of the active cells. + value_inactive : float or numpy.ndarray + The physical property value assigned to all inactive cells in the mesh + indActive : numpy.ndarray + + .. deprecated:: 0.23.0 + + Argument ``indActive`` is deprecated in favor of ``active_cells`` and will + be removed in SimPEG v0.24.0. + + valInactive : float or numpy.ndarray + + .. deprecated:: 0.23.0 + + Argument ``valInactive`` is deprecated in favor of ``value_inactive`` and + will be removed in SimPEG v0.24.0. + + """ + + def __init__( + self, + mesh, + active_cells=None, + value_inactive=0.0, + nC=None, + indActive=None, + valInactive=0.0, + ): + self.mesh = mesh + self.nC = nC or mesh.nC + + # Deprecate indActive argument + if indActive is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'indActive'." + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = indActive + + # Deprecate valInactive argument + if not isinstance(valInactive, Number) or valInactive != 0.0: + if not isinstance(value_inactive, Number) or value_inactive != 0.0: + raise TypeError( + "Cannot pass both 'value_inactive' and 'valInactive'." + "'valInactive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'value_inactive' instead.", + ) + warnings.warn( + "'valInactive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'value_inactive' instead.", + FutureWarning, + stacklevel=2, + ) + value_inactive = valInactive + + self.active_cells = active_cells + self._nP = np.sum(self.active_cells) + + self.P = sp.eye(self.nC, format="csr")[:, self.active_cells] + + self.value_inactive = value_inactive + + @property + def value_inactive(self): + """The physical property value assigned to all inactive cells in the mesh. + + Returns + ------- + numpy.ndarray + """ + return self._value_inactive + + @value_inactive.setter + def value_inactive(self, value): + n_inactive = self.nC - self.nP + if isinstance(value, Number): + value = validate_float("value_inactive", value) + value = np.full(n_inactive, value) + value = validate_ndarray_with_shape( + "value_inactive", value, shape=(n_inactive,) + ) + value_inactive = np.zeros(self.nC, dtype=float) + value_inactive[~self.active_cells] = value + self._value_inactive = value_inactive + + valInactive = deprecate_property( + value_inactive, + "valInactive", + "value_inactive", + removal_version="0.24.0", + future_warn=True, + error=False, + ) + + @property + def active_cells(self): + """ + + Returns + ------- + numpy.ndarray of bool + + """ + return self._active_cells + + @active_cells.setter + def active_cells(self, value): + if value is not None: + value = validate_active_indices("active_cells", value, self.nC) + self._active_cells = value + + indActive = deprecate_property( + active_cells, + "indActive", + "active_cells", + removal_version="0.24.0", + future_warn=True, + error=False, + ) + + @property + def shape(self): + """Dimensions of the mapping + + Returns + ------- + tuple of int + Where *nP* is the number of active cells and *nC* is + number of cell in the mesh, **shape** returns a + tuple (*nC* , *nP*). + """ + return (self.nC, self.nP) + + @property + def nP(self): + """Number of parameters the model acts on. + + Returns + ------- + int + Number of parameters the model acts on; i.e. the number of active cells + """ + return int(self.active_cells.sum()) + + def _transform(self, m): + if m.ndim > 1: + return self.P * m + self.value_inactive[:, None] + return self.P * m + self.value_inactive + + def inverse(self, u): + r"""Recover the model parameters (active cells) from a set of physical + property values defined on the entire mesh. + + For a discrete set of model parameters :math:`\mathbf{m}` defined + on a set of active cells, the mapping :math:`\mathbf{u}(\mathbf{m})` + is defined as: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + \mathbf{d} \,m_\perp + + where :math:`\mathbf{P}` is a (*nC* , *nP*) projection matrix from + active cells to all mesh cells, and :math:`\mathbf{d}` is a + (*nC* , 1) matrix that projects the inactive cell value + :math:`m_\perp` to all inactive mesh cells. + + The inverse mapping is given by: + + .. math:: + \mathbf{m}(\mathbf{u}) = \mathbf{P^T u} + + Parameters + ---------- + u : (mesh.nC) numpy.ndarray + A vector which contains physical property values for all + mesh cells. + """ + return self.P.T * u + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + For a discrete set of model parameters :math:`\mathbf{m}` defined + on a set of active cells, the mapping :math:`\mathbf{u}(\mathbf{m})` + is defined as: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + \mathbf{d} \, m_\perp + + where :math:`\mathbf{P}` is a (*nC* , *nP*) projection matrix from + active cells to all mesh cells, and :math:`\mathbf{d}` is a + (*nC* , 1) matrix that projects the inactive cell value + :math:`m_\perp` to all inactive mesh cells. + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{P} + + Note that in this case, **deriv** simply returns a sparse projection matrix. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + if v is not None: + return self.P * v + return self.P diff --git a/simpeg/maps/_parametric.py b/simpeg/maps/_parametric.py new file mode 100644 index 0000000000..814808eb84 --- /dev/null +++ b/simpeg/maps/_parametric.py @@ -0,0 +1,2738 @@ +""" +Parametric map classes. +""" + +import warnings +import discretize +import numpy as np +from numpy.polynomial import polynomial +import scipy.sparse as sp +from scipy.interpolate import UnivariateSpline + +from discretize.utils import sdiag + +from ..utils import ( + validate_type, + validate_ndarray_with_shape, + validate_float, + validate_integer, + validate_string, + validate_active_indices, +) +from ._base import IdentityMap +from ..utils.code_utils import deprecate_property + + +class ParametricCircleMap(IdentityMap): + r"""Mapping for a parameterized circle. + + Define the mapping from a parameterized model for a circle in a wholespace + to all cells within a 2D mesh. For a circle within a wholespace, the + model is defined by 5 parameters: the background physical property value + (:math:`\sigma_0`), the physical property value for the circle + (:math:`\sigma_c`), the x location :math:`x_0` and y location :math:`y_0` + for center of the circle, and the circle's radius (:math:`R`). + + Let :math:`\mathbf{m} = [\sigma_0, \sigma_1, x_0, y_0, R]` be the set of + model parameters the defines a circle within a wholespace. The mapping + :math:`\mathbf{u}(\mathbf{m})` from the parameterized model to all cells + within a 2D mesh is given by: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \sigma_0 + (\sigma_1 - \sigma_0) + \bigg [ \frac{1}{2} + \pi^{-1} \arctan \bigg ( a \big [ \sqrt{(\mathbf{x_c}-x_0)^2 + + (\mathbf{y_c}-y_0)^2} - R \big ] \bigg ) \bigg ] + + where :math:`\mathbf{x_c}` and :math:`\mathbf{y_c}` are vectors storing + the x and y positions of all cell centers for the 2D mesh and :math:`a` + is a user-defined constant which defines the sharpness of boundary of the + circular structure. + + Parameters + ---------- + mesh : discretize.BaseMesh + A 2D discretize mesh + logSigma : bool + If ``True``, parameters :math:`\sigma_0` and :math:`\sigma_1` represent the + natural log of the physical property values for the background and circle, + respectively. + slope : float + A constant for defining the sharpness of the boundary between the circle + and the wholespace. The sharpness increases as *slope* is increased. + + Examples + -------- + Here we define the parameterized model for a circle in a wholespace. We then + create and use a ``ParametricCircleMap`` to map the model to a 2D mesh. + + >>> from simpeg.maps import ParametricCircleMap + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib.pyplot as plt + + >>> h = 0.5*np.ones(20) + >>> mesh = TensorMesh([h, h]) + + >>> sigma0, sigma1, x0, y0, R = 0., 10., 4., 6., 2. + >>> model = np.r_[sigma0, sigma1, x0, y0, R] + >>> mapping = ParametricCircleMap(mesh, logSigma=False, slope=2) + + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_image(mapping * model, ax=ax) + + """ + + def __init__(self, mesh, logSigma=True, slope=0.1): + super().__init__(mesh=mesh) + if mesh.dim != 2: + raise NotImplementedError( + "Mesh must be 2D, not implemented yet for other dimensions." + ) + # TODO: this should be done through a composition with and ExpMap + self.logSigma = logSigma + self.slope = slope + + @property + def slope(self): + """Sharpness of the boundary. + + Larger number are sharper. + + Returns + ------- + float + """ + return self._slope + + @slope.setter + def slope(self, value): + self._slope = validate_float("slope", value, min_val=0.0, inclusive_min=False) + + @property + def logSigma(self): + """Whether the input needs to be transformed by an exponential + + Returns + ------- + float + """ + return self._logSigma + + @logSigma.setter + def logSigma(self, value): + self._logSigma = validate_type("logSigma", value, bool) + + @property + def nP(self): + r"""Number of parameters the mapping acts on; i.e. 5. + + Returns + ------- + int + The ``ParametricCircleMap`` acts on 5 parameters. + """ + return 5 + + def _transform(self, m): + a = self.slope + sig1, sig2, x, y, r = m[0], m[1], m[2], m[3], m[4] + if self.logSigma: + sig1, sig2 = np.exp(sig1), np.exp(sig2) + X = self.mesh.cell_centers[:, 0] + Y = self.mesh.cell_centers[:, 1] + return sig1 + (sig2 - sig1) * ( + np.arctan(a * (np.sqrt((X - x) ** 2 + (Y - y) ** 2) - r)) / np.pi + 0.5 + ) + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + Let :math:`\mathbf{m} = [\sigma_0, \sigma_1, x_0, y_0, R]` be the set of + model parameters the defines a circle within a wholespace. The mapping + :math:`\mathbf{u}(\mathbf{m})`from the parameterized model to all cells + within a 2D mesh is given by: + + .. math:: + \mathbf{u}(\mathbf{m}) = \sigma_0 + (\sigma_1 - \sigma_0) + \bigg [ \frac{1}{2} + \pi^{-1} \arctan \bigg ( a \big [ \sqrt{(\mathbf{x_c}-x_0)^2 + + (\mathbf{y_c}-y_0)^2} - R \big ] \bigg ) \bigg ] + + The derivative of the mapping with respect to the model parameters is a + ``numpy.ndarray`` of shape (*mesh.nC*, 5) given by: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = + \Bigg [ \frac{\partial \mathbf{u}}{\partial \sigma_0} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial \sigma_1} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial x_0} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial y_0} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial R} + \Bigg ] + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + a = self.slope + sig1, sig2, x, y, r = m[0], m[1], m[2], m[3], m[4] + if self.logSigma: + sig1, sig2 = np.exp(sig1), np.exp(sig2) + X = self.mesh.cell_centers[:, 0] + Y = self.mesh.cell_centers[:, 1] + if self.logSigma: + g1 = ( + -( + np.arctan(a * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2))) / np.pi + + 0.5 + ) + * sig1 + + sig1 + ) + g2 = ( + np.arctan(a * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2))) / np.pi + 0.5 + ) * sig2 + else: + g1 = ( + -( + np.arctan(a * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2))) / np.pi + + 0.5 + ) + + 1.0 + ) + g2 = ( + np.arctan(a * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2))) / np.pi + 0.5 + ) + + g3 = ( + a + * (-X + x) + * (-sig1 + sig2) + / ( + np.pi + * (a**2 * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2)) ** 2 + 1) + * np.sqrt((X - x) ** 2 + (Y - y) ** 2) + ) + ) + + g4 = ( + a + * (-Y + y) + * (-sig1 + sig2) + / ( + np.pi + * (a**2 * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2)) ** 2 + 1) + * np.sqrt((X - x) ** 2 + (Y - y) ** 2) + ) + ) + + g5 = ( + -a + * (-sig1 + sig2) + / (np.pi * (a**2 * (-r + np.sqrt((X - x) ** 2 + (Y - y) ** 2)) ** 2 + 1)) + ) + + if v is not None: + return sp.csr_matrix(np.c_[g1, g2, g3, g4, g5]) * v + return sp.csr_matrix(np.c_[g1, g2, g3, g4, g5]) + + @property + def is_linear(self): + return False + + +class ParametricPolyMap(IdentityMap): + r"""Mapping for 2 layer model whose interface is defined by a polynomial. + + This mapping is used when the cells lying below the Earth's surface can + be parameterized by a 2 layer model whose interface is defined by a + polynomial function. The model is defined by the physical property + values for each unit (:math:`\sigma_1` and :math:`\sigma_2`) and the + coefficients for the polynomial function (:math:`\mathbf{c}`). + + **For a 2D mesh** , the interface is defined by a polynomial function + of the form: + + .. math:: + p(x) = \sum_{i=0}^N c_i x^i + + where :math:`c_i` are the polynomial coefficients and :math:`N` is + the order of the polynomial. In this case, the model is defined as + + .. math:: + \mathbf{m} = [\sigma_1, \;\sigma_2,\; c_0 ,\;\ldots\; ,\; c_N] + + The mapping :math:`\mathbf{u}(\mathbf{m})` from the model to the mesh + is given by: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \sigma_1 + (\sigma_2 - \sigma_1) + \bigg [ \frac{1}{2} + \pi^{-1} \arctan \bigg ( + a \Big ( \mathbf{p}(\mathbf{x_c}) - \mathbf{y_c} \Big ) + \bigg ) \bigg ] + + where :math:`\mathbf{x_c}` and :math:`\mathbf{y_c}` are vectors containing the + x and y cell center locations for all active cells in the mesh, and :math:`a` is a + parameter which defines the sharpness of the boundary between the two layers. + :math:`\mathbf{p}(\mathbf{x_c})` evaluates the polynomial function for + every element in :math:`\mathbf{x_c}`. + + **For a 3D mesh** , the interface is defined by a 2D polynomial function + of the form: + + .. math:: + p(x,y) = + \sum_{j=0}^{N_y} \sum_{i=0}^{N_x} c_{ij} \, x^i y^j + + where :math:`c_{ij}` are the polynomial coefficients. :math:`N_x` + and :math:`N_y` define the order of the polynomial in :math:`x` and + :math:`y`, respectively. In this case, the model is defined as: + + .. math:: + \mathbf{m} = [\sigma_1, \; \sigma_2, \; c_{0,0} , \; c_{1,0} , \;\ldots , \; c_{N_x, N_y}] + + The mapping :math:`\mathbf{u}(\mathbf{m})` from the model to the mesh + is given by: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \sigma_1 + (\sigma_2 - \sigma_1) + \bigg [ \frac{1}{2} + \pi^{-1} \arctan \bigg ( + a \Big ( \mathbf{p}(\mathbf{x_c,y_c}) - \mathbf{z_c} \Big ) + \bigg ) \bigg ] + + where :math:`\mathbf{x_c}, \mathbf{y_c}` and :math:`\mathbf{y_z}` are vectors + containing the x, y and z cell center locations for all active cells in the mesh. + :math:`\mathbf{p}(\mathbf{x_c, y_c})` evaluates the polynomial function for + every corresponding pair of :math:`\mathbf{x_c}` and :math:`\mathbf{y_c}` + elements. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + order : int or list of int + Order of the polynomial. For a 2D mesh, this is an ``int``. For a 3D + mesh, the order for both variables is entered separately; i.e. + [*order1* , *order2*]. + logSigma : bool + If ``True``, parameters :math:`\sigma_1` and :math:`\sigma_2` represent + the natural log of a physical property. + normal : {'x', 'y', 'z'} + active_cells : (n_cells) numpy.ndarray, optional + Active cells array. Can be a boolean ``numpy.ndarray`` of length + ``mesh.n_cells`` or a ``numpy.ndarray`` of ``int`` containing the + indices of the active cells. + actInd : numpy.ndarray, optional + + .. deprecated:: 0.23.0 + + Argument ``actInd`` is deprecated in favor of ``active_cells`` and will + be removed in SimPEG v0.24.0. + + Examples + -------- + In this example, we define a 2 layer model whose interface is sharp and lies + along a polynomial function :math:`y(x)=c_0 + c_1 x`. In this case, the model is + defined as :math:`\mathbf{m} = [\sigma_1 , \sigma_2 , c_0 , c_1]`. We construct + a polynomial mapping from the model to the set of active cells (i.e. below the surface), + We then use an active cells mapping to map from the set of active cells to all + cells in the 2D mesh. + + >>> from simpeg.maps import ParametricPolyMap, InjectActiveCells + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib.pyplot as plt + + >>> h = 0.5*np.ones(20) + >>> mesh = TensorMesh([h, h]) + >>> ind_active = mesh.cell_centers[:, 1] < 8 + >>> + >>> sig1, sig2, c0, c1 = 10., 5., 2., 0.5 + >>> model = np.r_[sig1, sig2, c0, c1] + + >>> poly_map = ParametricPolyMap( + >>> mesh, order=1, logSigma=False, normal='Y', active_cells=ind_active, slope=1e4 + >>> ) + >>> act_map = InjectActiveCells(mesh, ind_active, 0.) + + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_image(act_map * poly_map * model, ax=ax) + >>> ax.set_title('Mapping on a 2D mesh') + + Here, we recreate the previous example on a 3D mesh but with a smoother interface. + For a 3D mesh, the 2D polynomial defining the sloping interface is given by + :math:`z(x,y) = c_0 + c_x x + c_y y + c_{xy} xy`. In this case, the model is + defined as :math:`\mathbf{m} = [\sigma_1 , \sigma_2 , c_0 , c_x, c_y, c_{xy}]`. + + >>> mesh = TensorMesh([h, h, h]) + >>> ind_active = mesh.cell_centers[:, 2] < 8 + >>> + >>> sig1, sig2, c0, cx, cy, cxy = 10., 5., 2., 0.5, 0., 0. + >>> model = np.r_[sig1, sig2, c0, cx, cy, cxy] + >>> + >>> poly_map = ParametricPolyMap( + >>> mesh, order=[1, 1], logSigma=False, normal='Z', active_cells=ind_active, slope=2 + >>> ) + >>> act_map = InjectActiveCells(mesh, ind_active, 0.) + >>> + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_slice(act_map * poly_map * model, ax=ax, normal='Y', ind=10) + >>> ax.set_title('Mapping on a 3D mesh') + + """ + + def __init__( + self, + mesh, + order, + logSigma=True, + normal="X", + active_cells=None, + slope=1e4, + actInd=None, + ): + super().__init__(mesh=mesh) + self.logSigma = logSigma + self.order = order + self.normal = normal + self.slope = slope + + # Deprecate actInd argument + if actInd is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'actInd'." + "'actInd' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'actInd' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = actInd + + if active_cells is None: + active_cells = np.ones(mesh.n_cells, dtype=bool) + self.active_cells = active_cells + + @property + def slope(self): + """Sharpness of the boundary. + + Larger number are sharper. + + Returns + ------- + float + """ + return self._slope + + @slope.setter + def slope(self, value): + self._slope = validate_float("slope", value, min_val=0.0, inclusive_min=False) + + @property + def logSigma(self): + """Whether the input needs to be transformed by an exponential + + Returns + ------- + float + """ + return self._logSigma + + @logSigma.setter + def logSigma(self, value): + self._logSigma = validate_type("logSigma", value, bool) + + @property + def normal(self): + """The projection axis. + + Returns + ------- + str + """ + return self._normal + + @normal.setter + def normal(self, value): + self._normal = validate_string("normal", value, ("x", "y", "z")) + + @property + def active_cells(self): + """Active indices of the mesh. + + Returns + ------- + (mesh.n_cells) numpy.ndarray of bool + """ + return self._active_cells + + @active_cells.setter + def active_cells(self, value): + self._active_cells = validate_active_indices( + "active_cells", value, self.mesh.n_cells + ) + self._nC = sum(self._active_cells) + + actInd = deprecate_property( + active_cells, + "actInd", + "active_cells", + removal_version="0.24.0", + future_warn=True, + error=False, + ) + + @property + def shape(self): + """Dimensions of the mapping. + + Returns + ------- + tuple of int + The dimensions of the mapping as a tuple of the form + (*nC* , *nP*), where *nP* is the number of model parameters + the mapping acts on and *nC* is the number of active cells + being mapping to. If ``active_cells`` is ``None``, then + *nC = mesh.nC*. + """ + return (self.nC, self.nP) + + @property + def nC(self): + """Number of active cells being mapped too. + + Returns + ------- + int + """ + return self._nC + + @property + def nP(self): + """Number of parameters the mapping acts on. + + Returns + ------- + int + The number of parameters the mapping acts on. + """ + if np.isscalar(self.order): + nP = self.order + 3 + else: + nP = (self.order[0] + 1) * (self.order[1] + 1) + 2 + return nP + + def _transform(self, m): + # Set model parameters + alpha = self.slope + sig1, sig2 = m[0], m[1] + c = m[2:] + if self.logSigma: + sig1, sig2 = np.exp(sig1), np.exp(sig2) + + # 2D + if self.mesh.dim == 2: + X = self.mesh.cell_centers[self.active_cells, 0] + Y = self.mesh.cell_centers[self.active_cells, 1] + if self.normal == "x": + f = polynomial.polyval(Y, c) - X + elif self.normal == "y": + f = polynomial.polyval(X, c) - Y + else: + raise (Exception("Input for normal = X or Y or Z")) + + # 3D + elif self.mesh.dim == 3: + X = self.mesh.cell_centers[self.active_cells, 0] + Y = self.mesh.cell_centers[self.active_cells, 1] + Z = self.mesh.cell_centers[self.active_cells, 2] + + if self.normal == "x": + f = ( + polynomial.polyval2d( + Y, + Z, + c.reshape((self.order[0] + 1, self.order[1] + 1), order="F"), + ) + - X + ) + elif self.normal == "y": + f = ( + polynomial.polyval2d( + X, + Z, + c.reshape((self.order[0] + 1, self.order[1] + 1), order="F"), + ) + - Y + ) + elif self.normal == "z": + f = ( + polynomial.polyval2d( + X, + Y, + c.reshape((self.order[0] + 1, self.order[1] + 1), order="F"), + ) + - Z + ) + else: + raise (Exception("Input for normal = X or Y or Z")) + + else: + raise (Exception("Only supports 2D or 3D")) + + return sig1 + (sig2 - sig1) * (np.arctan(alpha * f) / np.pi + 0.5) + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the model. + + For a model :math:`\mathbf{m} = [\sigma_1, \sigma_2, \mathbf{c}]`, + the derivative of the mapping with respect to the model parameters is a + ``numpy.ndarray`` of shape (*mesh.nC*, *nP*) of the form: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = + \Bigg [ \frac{\partial \mathbf{u}}{\partial \sigma_0} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial \sigma_1} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial c_0} \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial c_1} \;\; + \cdots \;\; + \Bigg [ \frac{\partial \mathbf{u}}{\partial c_N} + \Bigg ] + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + + """ + alpha = self.slope + sig1, sig2, c = m[0], m[1], m[2:] + if self.logSigma: + sig1, sig2 = np.exp(sig1), np.exp(sig2) + + # 2D + if self.mesh.dim == 2: + X = self.mesh.cell_centers[self.active_cells, 0] + Y = self.mesh.cell_centers[self.active_cells, 1] + + if self.normal == "x": + f = polynomial.polyval(Y, c) - X + V = polynomial.polyvander(Y, len(c) - 1) + elif self.normal == "y": + f = polynomial.polyval(X, c) - Y + V = polynomial.polyvander(X, len(c) - 1) + else: + raise (Exception("Input for normal = X or Y")) + + # 3D + elif self.mesh.dim == 3: + X = self.mesh.cell_centers[self.active_cells, 0] + Y = self.mesh.cell_centers[self.active_cells, 1] + Z = self.mesh.cell_centers[self.active_cells, 2] + + if self.normal == "x": + f = ( + polynomial.polyval2d( + Y, Z, c.reshape((self.order[0] + 1, self.order[1] + 1)) + ) + - X + ) + V = polynomial.polyvander2d(Y, Z, self.order) + elif self.normal == "y": + f = ( + polynomial.polyval2d( + X, Z, c.reshape((self.order[0] + 1, self.order[1] + 1)) + ) + - Y + ) + V = polynomial.polyvander2d(X, Z, self.order) + elif self.normal == "z": + f = ( + polynomial.polyval2d( + X, Y, c.reshape((self.order[0] + 1, self.order[1] + 1)) + ) + - Z + ) + V = polynomial.polyvander2d(X, Y, self.order) + else: + raise (Exception("Input for normal = X or Y or Z")) + + if self.logSigma: + g1 = -(np.arctan(alpha * f) / np.pi + 0.5) * sig1 + sig1 + g2 = (np.arctan(alpha * f) / np.pi + 0.5) * sig2 + else: + g1 = -(np.arctan(alpha * f) / np.pi + 0.5) + 1.0 + g2 = np.arctan(alpha * f) / np.pi + 0.5 + + g3 = sdiag(alpha * (sig2 - sig1) / (1.0 + (alpha * f) ** 2) / np.pi) * V + + if v is not None: + return sp.csr_matrix(np.c_[g1, g2, g3]) * v + return sp.csr_matrix(np.c_[g1, g2, g3]) + + @property + def is_linear(self): + return False + + +class ParametricSplineMap(IdentityMap): + r"""Mapping to parameterize the boundary between two geological units using + spline interpolation. + + .. math:: + + g = f(x)-y + + Define the model as: + + .. math:: + + m = [\sigma_1, \sigma_2, y] + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + pts : (n) numpy.ndarray + Points for the 1D spline tie points. + ptsv : (2) array_like + Points for linear interpolation between two splines in 3D. + order : int + Order of the spline mapping; e.g. 3 is cubic spline + logSigma : bool + If ``True``, :math:`\sigma_1` and :math:`\sigma_2` represent the natural + log of some physical property value for each unit. + normal : {'x', 'y', 'z'} + Defines the general direction of the normal vector for the interface. + slope : float + Parameter for defining the sharpness of the boundary. The sharpness is increased + if *slope* is large. + + Examples + -------- + In this example, we define a 2 layered model with a sloping + interface on a 2D mesh. The model consists of the physical + property values for the layers and the known elevations + for the interface at the horizontal positions supplied when + creating the mapping. + + >>> from simpeg.maps import ParametricSplineMap + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib.pyplot as plt + + >>> h = 0.5*np.ones(20) + >>> mesh = TensorMesh([h, h]) + + >>> x = np.linspace(0, 10, 6) + >>> y = 0.5*x + 2.5 + + >>> model = np.r_[10., 0., y] + >>> mapping = ParametricSplineMap(mesh, x, order=2, normal='Y', slope=2) + + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_image(mapping * model, ax=ax) + + """ + + def __init__( + self, mesh, pts, ptsv=None, order=3, logSigma=True, normal="x", slope=1e4 + ): + super().__init__(mesh=mesh) + self.slope = slope + self.logSigma = logSigma + self.normal = normal + self.order = order + self.pts = pts + self.ptsv = ptsv + self.spl = None + + @IdentityMap.mesh.setter + def mesh(self, value): + self._mesh = validate_type( + "mesh", value, discretize.base.BaseTensorMesh, cast=False + ) + + @property + def slope(self): + """Sharpness of the boundary. + + Larger number are sharper. + + Returns + ------- + float + """ + return self._slope + + @slope.setter + def slope(self, value): + self._slope = validate_float("slope", value, min_val=0.0, inclusive_min=False) + + @property + def logSigma(self): + """Whether the input needs to be transformed by an exponential + + Returns + ------- + float + """ + return self._logSigma + + @logSigma.setter + def logSigma(self, value): + self._logSigma = validate_type("logSigma", value, bool) + + @property + def normal(self): + """The projection axis. + + Returns + ------- + str + """ + return self._normal + + @normal.setter + def normal(self, value): + self._normal = validate_string("normal", value, ("x", "y", "z")) + + @property + def order(self): + """Order of the spline mapping. + + Returns + ------- + int + """ + return self._order + + @order.setter + def order(self, value): + self._order = validate_integer("order", value, min_val=1) + + @property + def pts(self): + """Points for the spline. + + Returns + ------- + numpy.ndarray + """ + return self._pts + + @pts.setter + def pts(self, value): + self._pts = validate_ndarray_with_shape("pts", value, shape=("*"), dtype=float) + + @property + def npts(self): + """The number of points. + + Returns + ------- + int + """ + return self._pts.shape[0] + + @property + def ptsv(self): + """Bottom and top values for the 3D spline surface. + + In 3D, two splines are created and linearly interpolated between these two + points. + + Returns + ------- + (2) numpy.ndarray + """ + return self._ptsv + + @ptsv.setter + def ptsv(self, value): + if value is not None: + value = validate_ndarray_with_shape("ptsv", value, shape=(2,)) + self._ptsv = value + + @property + def nP(self): + r"""Number of parameters the mapping acts on + + Returns + ------- + int + Number of parameters the mapping acts on. + - **2D mesh:** the mapping acts on *mesh.nC + 2* parameters + - **3D mesh:** the mapping acts on *2\*mesh.nC + 2* parameters + """ + if self.mesh.dim == 2: + return np.size(self.pts) + 2 + elif self.mesh.dim == 3: + return np.size(self.pts) * 2 + 2 + else: + raise (Exception("Only supports 2D and 3D")) + + def _transform(self, m): + # Set model parameters + alpha = self.slope + sig1, sig2 = m[0], m[1] + c = m[2:] + if self.logSigma: + sig1, sig2 = np.exp(sig1), np.exp(sig2) + # 2D + if self.mesh.dim == 2: + X = self.mesh.cell_centers[:, 0] + Y = self.mesh.cell_centers[:, 1] + self.spl = UnivariateSpline(self.pts, c, k=self.order, s=0) + if self.normal == "x": + f = self.spl(Y) - X + elif self.normal == "y": + f = self.spl(X) - Y + else: + raise (Exception("Input for normal = X or Y or Z")) + + # 3D: + # Comments: + # Make two spline functions and link them using linear interpolation. + # This is not quite direct extension of 2D to 3D case + # Using 2D interpolation is possible + + elif self.mesh.dim == 3: + X = self.mesh.cell_centers[:, 0] + Y = self.mesh.cell_centers[:, 1] + Z = self.mesh.cell_centers[:, 2] + + npts = np.size(self.pts) + if np.mod(c.size, 2): + raise (Exception("Put even points!")) + + self.spl = { + "splb": UnivariateSpline(self.pts, c[:npts], k=self.order, s=0), + "splt": UnivariateSpline(self.pts, c[npts:], k=self.order, s=0), + } + + if self.normal == "x": + zb = self.ptsv[0] + zt = self.ptsv[1] + flines = (self.spl["splt"](Y) - self.spl["splb"](Y)) * (Z - zb) / ( + zt - zb + ) + self.spl["splb"](Y) + f = flines - X + # elif self.normal =='Y': + # elif self.normal =='Z': + else: + raise (Exception("Input for normal = X or Y or Z")) + else: + raise (Exception("Only supports 2D and 3D")) + + return sig1 + (sig2 - sig1) * (np.arctan(alpha * f) / np.pi + 0.5) + + def deriv(self, m, v=None): + alpha = self.slope + sig1, sig2, c = m[0], m[1], m[2:] + if self.logSigma: + sig1, sig2 = np.exp(sig1), np.exp(sig2) + # 2D + if self.mesh.dim == 2: + X = self.mesh.cell_centers[:, 0] + Y = self.mesh.cell_centers[:, 1] + + if self.normal == "x": + f = self.spl(Y) - X + elif self.normal == "y": + f = self.spl(X) - Y + else: + raise (Exception("Input for normal = X or Y or Z")) + # 3D + elif self.mesh.dim == 3: + X = self.mesh.cell_centers[:, 0] + Y = self.mesh.cell_centers[:, 1] + Z = self.mesh.cell_centers[:, 2] + + if self.normal == "x": + zb = self.ptsv[0] + zt = self.ptsv[1] + flines = (self.spl["splt"](Y) - self.spl["splb"](Y)) * (Z - zb) / ( + zt - zb + ) + self.spl["splb"](Y) + f = flines - X + # elif self.normal =='Y': + # elif self.normal =='Z': + else: + raise (Exception("Not Implemented for Y and Z, your turn :)")) + + if self.logSigma: + g1 = -(np.arctan(alpha * f) / np.pi + 0.5) * sig1 + sig1 + g2 = (np.arctan(alpha * f) / np.pi + 0.5) * sig2 + else: + g1 = -(np.arctan(alpha * f) / np.pi + 0.5) + 1.0 + g2 = np.arctan(alpha * f) / np.pi + 0.5 + + if self.mesh.dim == 2: + g3 = np.zeros((self.mesh.nC, self.npts)) + if self.normal == "y": + # Here we use perturbation to compute sensitivity + # TODO: bit more generalization of this ... + # Modfications for X and Z directions ... + for i in range(np.size(self.pts)): + ctemp = c[i] + ind = np.argmin(abs(self.mesh.cell_centers_y - ctemp)) + ca = c.copy() + cb = c.copy() + dy = self.mesh.h[1][ind] * 1.5 + ca[i] = ctemp + dy + cb[i] = ctemp - dy + spla = UnivariateSpline(self.pts, ca, k=self.order, s=0) + splb = UnivariateSpline(self.pts, cb, k=self.order, s=0) + fderiv = (spla(X) - splb(X)) / (2 * dy) + g3[:, i] = ( + sdiag(alpha * (sig2 - sig1) / (1.0 + (alpha * f) ** 2) / np.pi) + * fderiv + ) + + elif self.mesh.dim == 3: + g3 = np.zeros((self.mesh.nC, self.npts * 2)) + if self.normal == "x": + # Here we use perturbation to compute sensitivity + for i in range(self.npts * 2): + ctemp = c[i] + ind = np.argmin(abs(self.mesh.cell_centers_y - ctemp)) + ca = c.copy() + cb = c.copy() + dy = self.mesh.h[1][ind] * 1.5 + ca[i] = ctemp + dy + cb[i] = ctemp - dy + + # treat bottom boundary + if i < self.npts: + splba = UnivariateSpline( + self.pts, ca[: self.npts], k=self.order, s=0 + ) + splbb = UnivariateSpline( + self.pts, cb[: self.npts], k=self.order, s=0 + ) + flinesa = ( + (self.spl["splt"](Y) - splba(Y)) * (Z - zb) / (zt - zb) + + splba(Y) + - X + ) + flinesb = ( + (self.spl["splt"](Y) - splbb(Y)) * (Z - zb) / (zt - zb) + + splbb(Y) + - X + ) + + # treat top boundary + else: + splta = UnivariateSpline( + self.pts, ca[self.npts :], k=self.order, s=0 + ) + spltb = UnivariateSpline( + self.pts, ca[self.npts :], k=self.order, s=0 + ) + flinesa = ( + (self.spl["splt"](Y) - splta(Y)) * (Z - zb) / (zt - zb) + + splta(Y) + - X + ) + flinesb = ( + (self.spl["splt"](Y) - spltb(Y)) * (Z - zb) / (zt - zb) + + spltb(Y) + - X + ) + fderiv = (flinesa - flinesb) / (2 * dy) + g3[:, i] = ( + sdiag(alpha * (sig2 - sig1) / (1.0 + (alpha * f) ** 2) / np.pi) + * fderiv + ) + else: + raise (Exception("Not Implemented for Y and Z, your turn :)")) + + if v is not None: + return sp.csr_matrix(np.c_[g1, g2, g3]) * v + return sp.csr_matrix(np.c_[g1, g2, g3]) + + @property + def is_linear(self): + return False + + +class BaseParametric(IdentityMap): + """Base class for parametric mappings from simple geological structures to meshes. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + slope : float, optional + Directly set the scaling parameter *slope* which sets the sharpness of boundaries + between units. + slopeFact : float, optional + Set sharpness of boundaries between units based on minimum cell size. If set, + the scalaing parameter *slope = slopeFact / dh*. + active_cells : numpy.ndarray, optional + Active cells array. Can be a boolean ``numpy.ndarray`` of length *mesh.nC* + or a ``numpy.ndarray`` of ``int`` containing the indices of the active cells. + indActive : numpy.ndarray + + .. deprecated:: 0.23.0 + + Argument ``indActive`` is deprecated in favor of ``active_cells`` and will + be removed in SimPEG v0.24.0. + + + """ + + def __init__( + self, + mesh, + slope=None, + slopeFact=1.0, + active_cells=None, + indActive=None, + **kwargs, + ): + super(BaseParametric, self).__init__(mesh, **kwargs) + + # Deprecate indActive argument + if indActive is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'indActive'." + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'indActive' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, + ) + active_cells = indActive + + self.active_cells = active_cells + self.slopeFact = slopeFact + if slope is not None: + self.slope = slope + + @property + def slope(self): + """Defines the sharpness of the boundaries. + + Returns + ------- + float + """ + return self._slope + + @slope.setter + def slope(self, value): + self._slope = validate_float("slope", value, min_val=0.0) + + @property + def slopeFact(self): + """Defines the slope scaled by the mesh. + + Returns + ------- + float + """ + return self._slopeFact + + @slopeFact.setter + def slopeFact(self, value): + self._slopeFact = validate_float("slopeFact", value, min_val=0.0) + self.slope = self._slopeFact / self.mesh.edge_lengths.min() + + @property + def active_cells(self): + return self._active_cells + + @active_cells.setter + def active_cells(self, value): + if value is not None: + value = validate_active_indices("active_cells", value, self.mesh.n_cells) + self._active_cells = value + + indActive = deprecate_property( + active_cells, + "indActive", + "active_cells", + removal_version="0.24.0", + future_warn=True, + error=False, + ) + + @property + def x(self): + """X cell center locations (active) for the output of the mapping. + + Returns + ------- + (n_active) numpy.ndarray + X cell center locations (active) for the output of the mapping. + """ + if getattr(self, "_x", None) is None: + if self.mesh.dim == 1: + self._x = [ + ( + self.mesh.cell_centers + if self.active_cells is None + else self.mesh.cell_centers[self.active_cells] + ) + ][0] + else: + self._x = [ + ( + self.mesh.cell_centers[:, 0] + if self.active_cells is None + else self.mesh.cell_centers[self.active_cells, 0] + ) + ][0] + return self._x + + @property + def y(self): + """Y cell center locations (active) for the output of the mapping. + + Returns + ------- + (n_active) numpy.ndarray + Y cell center locations (active) for the output of the mapping. + """ + if getattr(self, "_y", None) is None: + if self.mesh.dim > 1: + self._y = [ + ( + self.mesh.cell_centers[:, 1] + if self.active_cells is None + else self.mesh.cell_centers[self.active_cells, 1] + ) + ][0] + else: + self._y = None + return self._y + + @property + def z(self): + """Z cell center locations (active) for the output of the mapping. + + Returns + ------- + (n_active) numpy.ndarray + Z cell center locations (active) for the output of the mapping. + """ + if getattr(self, "_z", None) is None: + if self.mesh.dim > 2: + self._z = [ + ( + self.mesh.cell_centers[:, 2] + if self.active_cells is None + else self.mesh.cell_centers[self.active_cells, 2] + ) + ][0] + else: + self._z = None + return self._z + + def _atanfct(self, val, slope): + return np.arctan(slope * val) / np.pi + 0.5 + + def _atanfctDeriv(self, val, slope): + # d/dx(atan(x)) = 1/(1+x**2) + x = slope * val + dx = -slope + return (1.0 / (1 + x**2)) / np.pi * dx + + @property + def is_linear(self): + return False + + +class ParametricLayer(BaseParametric): + r"""Mapping for a horizontal layer within a wholespace. + + This mapping is used when the cells lying below the Earth's surface can + be parameterized by horizontal layer within a homogeneous medium. + The model is defined by the physical property value for the background + (:math:`\sigma_0`), the physical property value for the layer + (:math:`\sigma_1`), the elevation for the middle of the layer (:math:`z_L`) + and the thickness of the layer :math:`h`. + + For this mapping, the set of input model parameters are organized: + + .. math:: + \mathbf{m} = [\sigma_0, \;\sigma_1,\; z_L , \; h] + + The mapping :math:`\mathbf{u}(\mathbf{m})` from the model to the mesh + is given by: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \sigma_0 + \frac{(\sigma_1 - \sigma_0)}{\pi} \Bigg [ + \arctan \Bigg ( a \bigg ( \mathbf{z_c} - z_L + \frac{h}{2} \bigg ) \Bigg ) + - \arctan \Bigg ( a \bigg ( \mathbf{z_c} - z_L - \frac{h}{2} \bigg ) \Bigg ) \Bigg ] + + where :math:`\mathbf{z_c}` is a vectors containing the vertical cell center + locations for all active cells in the mesh, and :math:`a` is a + parameter which defines the sharpness of the boundaries between the layer + and the background. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + active_cells : numpy.ndarray, optional + Active cells array. Can be a boolean ``numpy.ndarray`` of length *mesh.nC* + or a ``numpy.ndarray`` of ``int`` containing the indices of the active cells. + slope : float + Directly define the constant *a* in the mapping function which defines the + sharpness of the boundaries. + slopeFact : float + Scaling factor for the sharpness of the boundaries based on cell size. + Using this option, we set *a = slopeFact / dh*. + indActive : numpy.ndarray + + .. deprecated:: 0.23.0 + + Argument ``indActive`` is deprecated in favor of ``active_cells`` and will + be removed in SimPEG v0.24.0. + + Examples + -------- + In this example, we define a layer in a wholespace whose interface is sharp. + We construct the mapping from the model to the set of active cells + (i.e. below the surface), We then use an active cells mapping to map from + the set of active cells to all cells in the mesh. + + >>> from simpeg.maps import ParametricLayer, InjectActiveCells + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib.pyplot as plt + + >>> dh = 0.25*np.ones(40) + >>> mesh = TensorMesh([dh, dh]) + >>> ind_active = mesh.cell_centers[:, 1] < 8 + + >>> sig0, sig1, zL, h = 5., 10., 4., 2 + >>> model = np.r_[sig0, sig1, zL, h] + + >>> layer_map = ParametricLayer( + >>> mesh, active_cells=ind_active, slope=4 + >>> ) + >>> act_map = InjectActiveCells(mesh, ind_active, 0.) + + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_image(act_map * layer_map * model, ax=ax) + + """ + + def __init__(self, mesh, **kwargs): + super().__init__(mesh, **kwargs) + + @property + def nP(self): + """Number of model parameters the mapping acts on; i.e 4 + + Returns + ------- + int + Returns an integer value of *4*. + """ + return 4 + + @property + def shape(self): + """Dimensions of the mapping + + Returns + ------- + tuple of int + Where *nP=4* is the number of parameters the mapping acts on + and *nAct* is the number of active cells in the mesh, **shape** + returns a tuple (*nAct* , *4*). + """ + if self.active_cells is not None: + return (sum(self.active_cells), self.nP) + return (self.mesh.nC, self.nP) + + def mDict(self, m): + r"""Return model parameters as a dictionary. + + For a model :math:`\mathbf{m} = [\sigma_0, \;\sigma_1,\; z_L , \; h]`, + **mDict** returns a dictionary:: + + {"val_background": m[0], "val_layer": m[1], "layer_center": m[2], "layer_thickness": m[3]} + + Returns + ------- + dict + The model as a dictionary + """ + return { + "val_background": m[0], + "val_layer": m[1], + "layer_center": m[2], + "layer_thickness": m[3], + } + + def _atanLayer(self, mDict): + if self.mesh.dim == 2: + z = self.y + elif self.mesh.dim == 3: + z = self.z + + layer_bottom = mDict["layer_center"] - mDict["layer_thickness"] / 2.0 + layer_top = mDict["layer_center"] + mDict["layer_thickness"] / 2.0 + + return self._atanfct(z - layer_bottom, self.slope) * self._atanfct( + z - layer_top, -self.slope + ) + + def _atanLayerDeriv_layer_center(self, mDict): + if self.mesh.dim == 2: + z = self.y + elif self.mesh.dim == 3: + z = self.z + + layer_bottom = mDict["layer_center"] - mDict["layer_thickness"] / 2.0 + layer_top = mDict["layer_center"] + mDict["layer_thickness"] / 2.0 + + return self._atanfctDeriv(z - layer_bottom, self.slope) * self._atanfct( + z - layer_top, -self.slope + ) + self._atanfct(z - layer_bottom, self.slope) * self._atanfctDeriv( + z - layer_top, -self.slope + ) + + def _atanLayerDeriv_layer_thickness(self, mDict): + if self.mesh.dim == 2: + z = self.y + elif self.mesh.dim == 3: + z = self.z + + layer_bottom = mDict["layer_center"] - mDict["layer_thickness"] / 2.0 + layer_top = mDict["layer_center"] + mDict["layer_thickness"] / 2.0 + + return -0.5 * self._atanfctDeriv(z - layer_bottom, self.slope) * self._atanfct( + z - layer_top, -self.slope + ) + 0.5 * self._atanfct(z - layer_bottom, self.slope) * self._atanfctDeriv( + z - layer_top, -self.slope + ) + + def layer_cont(self, mDict): + return mDict["val_background"] + ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayer(mDict) + + def _transform(self, m): + mDict = self.mDict(m) + return self.layer_cont(mDict) + + def _deriv_val_background(self, mDict): + return np.ones_like(self.x) - self._atanLayer(mDict) + + def _deriv_val_layer(self, mDict): + return self._atanLayer(mDict) + + def _deriv_layer_center(self, mDict): + return ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_center(mDict) + + def _deriv_layer_thickness(self, mDict): + return ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_thickness(mDict) + + def deriv(self, m): + r"""Derivative of the mapping with respect to the input parameters. + + Let :math:`\mathbf{m} = [\sigma_0, \;\sigma_1,\; z_L , \; h]` be the set of + model parameters the defines a layer within a wholespace. The mapping + :math:`\mathbf{u}(\mathbf{m})`from the parameterized model to all + active cells is given by: + + .. math:: + \mathbf{u}(\mathbf{m}) = \sigma_0 + \frac{(\sigma_1 - \sigma_0)}{\pi} \Bigg [ + \arctan \Bigg ( a \bigg ( \mathbf{z_c} - z_L + \frac{h}{2} \bigg ) \Bigg ) + - \arctan \Bigg ( a \bigg ( \mathbf{z_c} - z_L - \frac{h}{2} \bigg ) \Bigg ) \Bigg ] + + where :math:`\mathbf{z_c}` is a vectors containing the vertical cell center + locations for all active cells in the mesh. The derivative of the mapping + with respect to the model parameters is a ``numpy.ndarray`` of + shape (*nAct*, *4*) given by: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = + \Bigg [ \frac{\partial \mathbf{u}}{\partial \sigma_0} \;\; + \frac{\partial \mathbf{u}}{\partial \sigma_1} \;\; + \frac{\partial \mathbf{u}}{\partial z_L} \;\; + \frac{\partial \mathbf{u}}{\partial h} + \Bigg ] + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + + mDict = self.mDict(m) + + return sp.csr_matrix( + np.vstack( + [ + self._deriv_val_background(mDict), + self._deriv_val_layer(mDict), + self._deriv_layer_center(mDict), + self._deriv_layer_thickness(mDict), + ] + ).T + ) + + +class ParametricBlock(BaseParametric): + r"""Mapping for a rectangular block within a wholespace. + + This mapping is used when the cells lying below the Earth's surface can + be parameterized by rectangular block within a homogeneous medium. + The model is defined by the physical property value for the background + (:math:`\sigma_0`), the physical property value for the block + (:math:`\sigma_b`), parameters for the center of the block + (:math:`x_b [,y_b, z_b]`) and parameters for the dimensions along + each Cartesian direction (:math:`dx [,dy, dz]`) + + For this mapping, the set of input model parameters are organized: + + .. math:: + \mathbf{m} = \begin{cases} + 1D: \;\; [\sigma_0, \;\sigma_b,\; x_b , \; dx] \\ + 2D: \;\; [\sigma_0, \;\sigma_b,\; x_b , \; dx,\; y_b , \; dy] \\ + 3D: \;\; [\sigma_0, \;\sigma_b,\; x_b , \; dx,\; y_b , \; dy,\; z_b , \; dz] + \end{cases} + + The mapping :math:`\mathbf{u}(\mathbf{m})` from the model to the mesh + is given by: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \sigma_0 + (\sigma_b - \sigma_0) \bigg [ \frac{1}{2} + + \pi^{-1} \arctan \bigg ( a \, \boldsymbol{\eta} \big ( + x_b, y_b, z_b, dx, dy, dz \big ) \bigg ) \bigg ] + + where *a* is a parameter that impacts the sharpness of the arctan function, and + + .. math:: + \boldsymbol{\eta} \big ( x_b, y_b, z_b, dx, dy, dz \big ) = 1 - + \sum_{\xi \in (x,y,z)} \bigg [ \bigg ( \frac{2(\boldsymbol{\xi_c} - \xi_b)}{d\xi} \bigg )^2 + \varepsilon^2 + \bigg ]^{p/2} + + Parameters :math:`p` and :math:`\varepsilon` define the parameters of the Ekblom + function. :math:`\boldsymbol{\xi_c}` is a place holder for vectors containing + the x, [y and z] cell center locations of the mesh, :math:`\xi_b` is a placeholder + for the x[, y and z] location for the center of the block, and :math:`d\xi` is a + placeholder for the x[, y and z] dimensions of the block. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + active_cells : numpy.ndarray + Active cells array. Can be a boolean ``numpy.ndarray`` of length *mesh.nC* + or a ``numpy.ndarray`` of ``int`` containing the indices of the active cells. + slope : float + Directly define the constant *a* in the mapping function which defines the + sharpness of the boundaries. + slopeFact : float + Scaling factor for the sharpness of the boundaries based on cell size. + Using this option, we set *a = slopeFact / dh*. + epsilon : float + Epsilon value used in the ekblom representation of the block + p : float + p-value used in the ekblom representation of the block. + indActive : numpy.ndarray + + .. deprecated:: 0.23.0 + + Argument ``indActive`` is deprecated in favor of ``active_cells`` and will + be removed in SimPEG v0.24.0. + + Examples + -------- + In this example, we define a rectangular block in a wholespace whose + interface is sharp. We construct the mapping from the model to the + set of active cells (i.e. below the surface), We then use an active + cells mapping to map from the set of active cells to all cells in the mesh. + + >>> from simpeg.maps import ParametricBlock, InjectActiveCells + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib.pyplot as plt + + >>> dh = 0.5*np.ones(20) + >>> mesh = TensorMesh([dh, dh]) + >>> ind_active = mesh.cell_centers[:, 1] < 8 + + >>> sig0, sigb, xb, Lx, yb, Ly = 5., 10., 5., 4., 4., 2. + >>> model = np.r_[sig0, sigb, xb, Lx, yb, Ly] + + >>> block_map = ParametricBlock(mesh, active_cells=ind_active) + >>> act_map = InjectActiveCells(mesh, ind_active, 0.) + + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_image(act_map * block_map * model, ax=ax) + + """ + + def __init__(self, mesh, epsilon=1e-6, p=10, **kwargs): + self.epsilon = epsilon + self.p = p + super(ParametricBlock, self).__init__(mesh, **kwargs) + + @property + def epsilon(self): + """epsilon value used in the ekblom representation of the block. + + Returns + ------- + float + """ + return self._epsilon + + @epsilon.setter + def epsilon(self, value): + self._epsilon = validate_float("epsilon", value, min_val=0.0) + + @property + def p(self): + """p-value used in the ekblom representation of the block. + + Returns + ------- + float + """ + return self._p + + @p.setter + def p(self, value): + self._p = validate_float("p", value, min_val=0.0) + + @property + def nP(self): + """Number of parameters the mapping acts on. + + Returns + ------- + int + The number of the parameters defining the model depends on the dimension + of the mesh. *nP* + + - =4 for a 1D mesh + - =6 for a 2D mesh + - =8 for a 3D mesh + """ + if self.mesh.dim == 1: + return 4 + if self.mesh.dim == 2: + return 6 + elif self.mesh.dim == 3: + return 8 + + @property + def shape(self): + """Dimensions of the mapping + + Returns + ------- + tuple of int + Where *nP* is the number of parameters the mapping acts on + and *nAct* is the number of active cells in the mesh, **shape** + returns a tuple (*nAct* , *nP*). + """ + if self.active_cells is not None: + return (sum(self.active_cells), self.nP) + return (self.mesh.nC, self.nP) + + def _mDict1d(self, m): + return { + "val_background": m[0], + "val_block": m[1], + "x0": m[2], + "dx": m[3], + } + + def _mDict2d(self, m): + mDict = self._mDict1d(m) + mDict.update( + { + # 'theta_x': m[4], + "y0": m[4], + "dy": m[5], + # 'theta_y': m[7] + } + ) + return mDict + + def _mDict3d(self, m): + mDict = self._mDict2d(m) + mDict.update( + { + "z0": m[6], + "dz": m[7], + # 'theta_z': m[10] + } + ) + return mDict + + def mDict(self, m): + r"""Return model parameters as a dictionary. + + Returns + ------- + dict + The model as a dictionary + """ + return getattr(self, "_mDict{}d".format(self.mesh.dim))(m) + + def _ekblom(self, val): + return (val**2 + self.epsilon**2) ** (self.p / 2.0) + + def _ekblomDeriv(self, val): + return (self.p / 2) * (val**2 + self.epsilon**2) ** ((self.p / 2) - 1) * 2 * val + + # def _rotation(self, mDict): + # if self.mesh.dim == 2: + + # elif self.mesh.dim == 3: + + def _block1D(self, mDict): + return 1 - (self._ekblom((self.x - mDict["x0"]) / (0.5 * mDict["dx"]))) + + def _block2D(self, mDict): + return 1 - ( + self._ekblom((self.x - mDict["x0"]) / (0.5 * mDict["dx"])) + + self._ekblom((self.y - mDict["y0"]) / (0.5 * mDict["dy"])) + ) + + def _block3D(self, mDict): + return 1 - ( + self._ekblom((self.x - mDict["x0"]) / (0.5 * mDict["dx"])) + + self._ekblom((self.y - mDict["y0"]) / (0.5 * mDict["dy"])) + + self._ekblom((self.z - mDict["z0"]) / (0.5 * mDict["dz"])) + ) + + def _transform(self, m): + mDict = self.mDict(m) + return mDict["val_background"] + ( + mDict["val_block"] - mDict["val_background"] + ) * self._atanfct( + getattr(self, "_block{}D".format(self.mesh.dim))(mDict), slope=self.slope + ) + + def _deriv_val_background(self, mDict): + return 1 - self._atanfct( + getattr(self, "_block{}D".format(self.mesh.dim))(mDict), slope=self.slope + ) + + def _deriv_val_block(self, mDict): + return self._atanfct( + getattr(self, "_block{}D".format(self.mesh.dim))(mDict), slope=self.slope + ) + + def _deriv_center_block(self, mDict, orientation): + x = getattr(self, orientation) + x0 = mDict["{}0".format(orientation)] + dx = mDict["d{}".format(orientation)] + return (mDict["val_block"] - mDict["val_background"]) * ( + self._atanfctDeriv( + getattr(self, "_block{}D".format(self.mesh.dim))(mDict), + slope=self.slope, + ) + * (self._ekblomDeriv((x - x0) / (0.5 * dx))) + / -(0.5 * dx) + ) + + def _deriv_width_block(self, mDict, orientation): + x = getattr(self, orientation) + x0 = mDict["{}0".format(orientation)] + dx = mDict["d{}".format(orientation)] + return (mDict["val_block"] - mDict["val_background"]) * ( + self._atanfctDeriv( + getattr(self, "_block{}D".format(self.mesh.dim))(mDict), + slope=self.slope, + ) + * (self._ekblomDeriv((x - x0) / (0.5 * dx)) * (-(x - x0) / (0.5 * dx**2))) + ) + + def _deriv1D(self, mDict): + return np.vstack( + [ + self._deriv_val_background(mDict), + self._deriv_val_block(mDict), + self._deriv_center_block(mDict, "x"), + self._deriv_width_block(mDict, "x"), + ] + ).T + + def _deriv2D(self, mDict): + return np.vstack( + [ + self._deriv_val_background(mDict), + self._deriv_val_block(mDict), + self._deriv_center_block(mDict, "x"), + self._deriv_width_block(mDict, "x"), + self._deriv_center_block(mDict, "y"), + self._deriv_width_block(mDict, "y"), + ] + ).T + + def _deriv3D(self, mDict): + return np.vstack( + [ + self._deriv_val_background(mDict), + self._deriv_val_block(mDict), + self._deriv_center_block(mDict, "x"), + self._deriv_width_block(mDict, "x"), + self._deriv_center_block(mDict, "y"), + self._deriv_width_block(mDict, "y"), + self._deriv_center_block(mDict, "z"), + self._deriv_width_block(mDict, "z"), + ] + ).T + + def deriv(self, m): + r"""Derivative of the mapping with respect to the input parameters. + + Let :math:`\mathbf{m} = [\sigma_0, \;\sigma_1,\; x_b, \; dx, (\; y_b, \; dy, \; z_b , dz)]` + be the set of model parameters the defines a block/ellipsoid within a wholespace. + The mapping :math:`\mathbf{u}(\mathbf{m})` from the parameterized model to all + active cells is given by: + + The derivative of the mapping :math:`\mathbf{u}(\mathbf{m})` with respect to + the model parameters is a ``numpy.ndarray`` of shape (*nAct*, *nP*) given by: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \Bigg [ + \frac{\partial \mathbf{u}}{\partial \sigma_0} \;\; + \frac{\partial \mathbf{u}}{\partial \sigma_1} \;\; + \frac{\partial \mathbf{u}}{\partial x_b} \;\; + \frac{\partial \mathbf{u}}{\partial dx} \;\; + \frac{\partial \mathbf{u}}{\partial y_b} \;\; + \frac{\partial \mathbf{u}}{\partial dy} \;\; + \frac{\partial \mathbf{u}}{\partial z_b} \;\; + \frac{\partial \mathbf{u}}{\partial dz} + \Bigg ) \Bigg ] + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + return sp.csr_matrix( + getattr(self, "_deriv{}D".format(self.mesh.dim))(self.mDict(m)) + ) + + +class ParametricEllipsoid(ParametricBlock): + r"""Mapping for a rectangular block within a wholespace. + + This mapping is used when the cells lying below the Earth's surface can + be parameterized by an ellipsoid within a homogeneous medium. + The model is defined by the physical property value for the background + (:math:`\sigma_0`), the physical property value for the layer + (:math:`\sigma_b`), parameters for the center of the ellipsoid + (:math:`x_b [,y_b, z_b]`) and parameters for the dimensions along + each Cartesian direction (:math:`dx [,dy, dz]`) + + For this mapping, the set of input model parameters are organized: + + .. math:: + \mathbf{m} = \begin{cases} + 1D: \;\; [\sigma_0, \;\sigma_b,\; x_b , \; dx] \\ + 2D: \;\; [\sigma_0, \;\sigma_b,\; x_b , \; dx,\; y_b , \; dy] \\ + 3D: \;\; [\sigma_0, \;\sigma_b,\; x_b , \; dx,\; y_b , \; dy,\; z_b , \; dz] + \end{cases} + + The mapping :math:`\mathbf{u}(\mathbf{m})` from the model to the mesh + is given by: + + .. math:: + + \mathbf{u}(\mathbf{m}) = \sigma_0 + (\sigma_b - \sigma_0) \bigg [ \frac{1}{2} + + \pi^{-1} \arctan \bigg ( a \, \boldsymbol{\eta} \big ( + x_b, y_b, z_b, dx, dy, dz \big ) \bigg ) \bigg ] + + where *a* is a parameter that impacts the sharpness of the arctan function, and + + .. math:: + \boldsymbol{\eta} \big ( x_b, y_b, z_b, dx, dy, dz \big ) = 1 - + \sum_{\xi \in (x,y,z)} \bigg [ \bigg ( \frac{2(\boldsymbol{\xi_c} - \xi_b)}{d\xi} \bigg )^2 + \varepsilon^2 + \bigg ] + + :math:`\boldsymbol{\xi_c}` is a place holder for vectors containing + the x, [y and z] cell center locations of the mesh, :math:`\xi_b` is a placeholder + for the x[, y and z] location for the center of the block, and :math:`d\xi` is a + placeholder for the x[, y and z] dimensions of the block. + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + active_cells : numpy.ndarray + Active cells array. Can be a boolean ``numpy.ndarray`` of length *mesh.nC* + or a ``numpy.ndarray`` of ``int`` containing the indices of the active cells. + slope : float + Directly define the constant *a* in the mapping function which defines the + sharpness of the boundaries. + slopeFact : float + Scaling factor for the sharpness of the boundaries based on cell size. + Using this option, we set *a = slopeFact / dh*. + epsilon : float + Epsilon value used in the ekblom representation of the block + indActive : numpy.ndarray + + .. deprecated:: 0.23.0 + + Argument ``indActive`` is deprecated in favor of ``active_cells`` and will + be removed in SimPEG v0.24.0. + + Examples + -------- + In this example, we define an ellipse in a wholespace whose + interface is sharp. We construct the mapping from the model to the + set of active cells (i.e. below the surface), We then use an active + cells mapping to map from the set of active cells to all cells in the mesh. + + >>> from simpeg.maps import ParametricEllipsoid, InjectActiveCells + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib.pyplot as plt + + >>> dh = 0.5*np.ones(20) + >>> mesh = TensorMesh([dh, dh]) + >>> ind_active = mesh.cell_centers[:, 1] < 8 + + >>> sig0, sigb, xb, Lx, yb, Ly = 5., 10., 5., 4., 4., 3. + >>> model = np.r_[sig0, sigb, xb, Lx, yb, Ly] + + >>> ellipsoid_map = ParametricEllipsoid(mesh, active_cells=ind_active) + >>> act_map = InjectActiveCells(mesh, ind_active, 0.) + + >>> fig = plt.figure(figsize=(5, 5)) + >>> ax = fig.add_subplot(111) + >>> mesh.plot_image(act_map * ellipsoid_map * model, ax=ax) + + """ + + def __init__(self, mesh, **kwargs): + super(ParametricEllipsoid, self).__init__(mesh, p=2, **kwargs) + + +class ParametricCasingAndLayer(ParametricLayer): + """ + Parametric layered space with casing. + + .. code:: python + + m = [val_background, + val_layer, + val_casing, + val_insideCasing, + layer_center, + layer_thickness, + casing_radius, + casing_thickness, + casing_bottom, + casing_top + ] + + """ + + def __init__(self, mesh, **kwargs): + assert ( + mesh._meshType == "CYL" + ), "Parametric Casing in a layer map only works for a cyl mesh." + + super().__init__(mesh, **kwargs) + + @property + def nP(self): + return 10 + + @property + def shape(self): + if self.active_cells is not None: + return (sum(self.active_cells), self.nP) + return (self.mesh.nC, self.nP) + + def mDict(self, m): + # m = [val_background, val_layer, val_casing, val_insideCasing, + # layer_center, layer_thickness, casing_radius, casing_thickness, + # casing_bottom, casing_top] + + return { + "val_background": m[0], + "val_layer": m[1], + "val_casing": m[2], + "val_insideCasing": m[3], + "layer_center": m[4], + "layer_thickness": m[5], + "casing_radius": m[6], + "casing_thickness": m[7], + "casing_bottom": m[8], + "casing_top": m[9], + } + + def casing_a(self, mDict): + return mDict["casing_radius"] - 0.5 * mDict["casing_thickness"] + + def casing_b(self, mDict): + return mDict["casing_radius"] + 0.5 * mDict["casing_thickness"] + + def _atanCasingLength(self, mDict): + return self._atanfct(self.z - mDict["casing_top"], -self.slope) * self._atanfct( + self.z - mDict["casing_bottom"], self.slope + ) + + def _atanCasingLengthDeriv_casing_top(self, mDict): + return self._atanfctDeriv( + self.z - mDict["casing_top"], -self.slope + ) * self._atanfct(self.z - mDict["casing_bottom"], self.slope) + + def _atanCasingLengthDeriv_casing_bottom(self, mDict): + return self._atanfct( + self.z - mDict["casing_top"], -self.slope + ) * self._atanfctDeriv(self.z - mDict["casing_bottom"], self.slope) + + def _atanInsideCasing(self, mDict): + return self._atanCasingLength(mDict) * self._atanfct( + self.x - self.casing_a(mDict), -self.slope + ) + + def _atanInsideCasingDeriv_casing_radius(self, mDict): + return self._atanCasingLength(mDict) * self._atanfctDeriv( + self.x - self.casing_a(mDict), -self.slope + ) + + def _atanInsideCasingDeriv_casing_thickness(self, mDict): + return ( + self._atanCasingLength(mDict) + * -0.5 + * self._atanfctDeriv(self.x - self.casing_a(mDict), -self.slope) + ) + + def _atanInsideCasingDeriv_casing_top(self, mDict): + return self._atanCasingLengthDeriv_casing_top(mDict) * self._atanfct( + self.x - self.casing_a(mDict), -self.slope + ) + + def _atanInsideCasingDeriv_casing_bottom(self, mDict): + return self._atanCasingLengthDeriv_casing_bottom(mDict) * self._atanfct( + self.x - self.casing_a(mDict), -self.slope + ) + + def _atanCasing(self, mDict): + return ( + self._atanCasingLength(mDict) + * self._atanfct(self.x - self.casing_a(mDict), self.slope) + * self._atanfct(self.x - self.casing_b(mDict), -self.slope) + ) + + def _atanCasingDeriv_casing_radius(self, mDict): + return self._atanCasingLength(mDict) * ( + self._atanfctDeriv(self.x - self.casing_a(mDict), self.slope) + * self._atanfct(self.x - self.casing_b(mDict), -self.slope) + + self._atanfct(self.x - self.casing_a(mDict), self.slope) + * self._atanfctDeriv(self.x - self.casing_b(mDict), -self.slope) + ) + + def _atanCasingDeriv_casing_thickness(self, mDict): + return self._atanCasingLength(mDict) * ( + -0.5 + * self._atanfctDeriv(self.x - self.casing_a(mDict), self.slope) + * self._atanfct(self.x - self.casing_b(mDict), -self.slope) + + self._atanfct(self.x - self.casing_a(mDict), self.slope) + * 0.5 + * self._atanfctDeriv(self.x - self.casing_b(mDict), -self.slope) + ) + + def _atanCasingDeriv_casing_bottom(self, mDict): + return ( + self._atanCasingLengthDeriv_casing_bottom(mDict) + * self._atanfct(self.x - self.casing_a(mDict), self.slope) + * self._atanfct(self.x - self.casing_b(mDict), -self.slope) + ) + + def _atanCasingDeriv_casing_top(self, mDict): + return ( + self._atanCasingLengthDeriv_casing_top(mDict) + * self._atanfct(self.x - self.casing_a(mDict), self.slope) + * self._atanfct(self.x - self.casing_b(mDict), -self.slope) + ) + + def layer_cont(self, mDict): + # contribution from the layered background + return mDict["val_background"] + ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayer(mDict) + + def _transform(self, m): + mDict = self.mDict(m) + + # assemble the model + layer = self.layer_cont(mDict) + casing = (mDict["val_casing"] - layer) * self._atanCasing(mDict) + insideCasing = (mDict["val_insideCasing"] - layer) * self._atanInsideCasing( + mDict + ) + + return layer + casing + insideCasing + + def _deriv_val_background(self, mDict): + # contribution from the layered background + d_layer_cont_dval_background = 1.0 - self._atanLayer(mDict) + d_casing_cont_dval_background = ( + -1.0 * d_layer_cont_dval_background * self._atanCasing(mDict) + ) + d_insideCasing_cont_dval_background = ( + -1.0 * d_layer_cont_dval_background * self._atanInsideCasing(mDict) + ) + return ( + d_layer_cont_dval_background + + d_casing_cont_dval_background + + d_insideCasing_cont_dval_background + ) + + def _deriv_val_layer(self, mDict): + d_layer_cont_dval_layer = self._atanLayer(mDict) + d_casing_cont_dval_layer = ( + -1.0 * d_layer_cont_dval_layer * self._atanCasing(mDict) + ) + d_insideCasing_cont_dval_layer = ( + -1.0 * d_layer_cont_dval_layer * self._atanInsideCasing(mDict) + ) + return ( + d_layer_cont_dval_layer + + d_casing_cont_dval_layer + + d_insideCasing_cont_dval_layer + ) + + def _deriv_val_casing(self, mDict): + d_layer_cont_dval_casing = 0.0 + d_casing_cont_dval_casing = self._atanCasing(mDict) + d_insideCasing_cont_dval_casing = 0.0 + return ( + d_layer_cont_dval_casing + + d_casing_cont_dval_casing + + d_insideCasing_cont_dval_casing + ) + + def _deriv_val_insideCasing(self, mDict): + d_layer_cont_dval_insideCasing = 0.0 + d_casing_cont_dval_insideCasing = 0.0 + d_insideCasing_cont_dval_insideCasing = self._atanInsideCasing(mDict) + return ( + d_layer_cont_dval_insideCasing + + d_casing_cont_dval_insideCasing + + d_insideCasing_cont_dval_insideCasing + ) + + def _deriv_layer_center(self, mDict): + d_layer_cont_dlayer_center = ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_center(mDict) + d_casing_cont_dlayer_center = -d_layer_cont_dlayer_center * self._atanCasing( + mDict + ) + d_insideCasing_cont_dlayer_center = ( + -d_layer_cont_dlayer_center * self._atanInsideCasing(mDict) + ) + return ( + d_layer_cont_dlayer_center + + d_casing_cont_dlayer_center + + d_insideCasing_cont_dlayer_center + ) + + def _deriv_layer_thickness(self, mDict): + d_layer_cont_dlayer_thickness = ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_thickness(mDict) + d_casing_cont_dlayer_thickness = ( + -d_layer_cont_dlayer_thickness * self._atanCasing(mDict) + ) + d_insideCasing_cont_dlayer_thickness = ( + -d_layer_cont_dlayer_thickness * self._atanInsideCasing(mDict) + ) + return ( + d_layer_cont_dlayer_thickness + + d_casing_cont_dlayer_thickness + + d_insideCasing_cont_dlayer_thickness + ) + + def _deriv_casing_radius(self, mDict): + layer = self.layer_cont(mDict) + d_layer_cont_dcasing_radius = 0.0 + d_casing_cont_dcasing_radius = ( + mDict["val_casing"] - layer + ) * self._atanCasingDeriv_casing_radius(mDict) + d_insideCasing_cont_dcasing_radius = ( + mDict["val_insideCasing"] - layer + ) * self._atanInsideCasingDeriv_casing_radius(mDict) + return ( + d_layer_cont_dcasing_radius + + d_casing_cont_dcasing_radius + + d_insideCasing_cont_dcasing_radius + ) + + def _deriv_casing_thickness(self, mDict): + d_layer_cont_dcasing_thickness = 0.0 + d_casing_cont_dcasing_thickness = ( + mDict["val_casing"] - self.layer_cont(mDict) + ) * self._atanCasingDeriv_casing_thickness(mDict) + d_insideCasing_cont_dcasing_thickness = ( + mDict["val_insideCasing"] - self.layer_cont(mDict) + ) * self._atanInsideCasingDeriv_casing_thickness(mDict) + return ( + d_layer_cont_dcasing_thickness + + d_casing_cont_dcasing_thickness + + d_insideCasing_cont_dcasing_thickness + ) + + def _deriv_casing_bottom(self, mDict): + d_layer_cont_dcasing_bottom = 0.0 + d_casing_cont_dcasing_bottom = ( + mDict["val_casing"] - self.layer_cont(mDict) + ) * self._atanCasingDeriv_casing_bottom(mDict) + d_insideCasing_cont_dcasing_bottom = ( + mDict["val_insideCasing"] - self.layer_cont(mDict) + ) * self._atanInsideCasingDeriv_casing_bottom(mDict) + return ( + d_layer_cont_dcasing_bottom + + d_casing_cont_dcasing_bottom + + d_insideCasing_cont_dcasing_bottom + ) + + def _deriv_casing_top(self, mDict): + d_layer_cont_dcasing_top = 0.0 + d_casing_cont_dcasing_top = ( + mDict["val_casing"] - self.layer_cont(mDict) + ) * self._atanCasingDeriv_casing_top(mDict) + d_insideCasing_cont_dcasing_top = ( + mDict["val_insideCasing"] - self.layer_cont(mDict) + ) * self._atanInsideCasingDeriv_casing_top(mDict) + return ( + d_layer_cont_dcasing_top + + d_casing_cont_dcasing_top + + d_insideCasing_cont_dcasing_top + ) + + def deriv(self, m): + mDict = self.mDict(m) + + return sp.csr_matrix( + np.vstack( + [ + self._deriv_val_background(mDict), + self._deriv_val_layer(mDict), + self._deriv_val_casing(mDict), + self._deriv_val_insideCasing(mDict), + self._deriv_layer_center(mDict), + self._deriv_layer_thickness(mDict), + self._deriv_casing_radius(mDict), + self._deriv_casing_thickness(mDict), + self._deriv_casing_bottom(mDict), + self._deriv_casing_top(mDict), + ] + ).T + ) + + +class ParametricBlockInLayer(ParametricLayer): + """ + Parametric Block in a Layered Space + + For 2D: + + .. code:: python + + m = [val_background, + val_layer, + val_block, + layer_center, + layer_thickness, + block_x0, + block_dx + ] + + For 3D: + + .. code:: python + + m = [val_background, + val_layer, + val_block, + layer_center, + layer_thickness, + block_x0, + block_y0, + block_dx, + block_dy + ] + + **Required** + + :param discretize.base.BaseMesh mesh: SimPEG Mesh, 2D or 3D + + **Optional** + + :param float slopeFact: arctan slope factor - divided by the minimum h + spacing to give the slope of the arctan + functions + :param float slope: slope of the arctan function + :param numpy.ndarray active_cells: bool vector with + + """ + + def __init__(self, mesh, **kwargs): + super().__init__(mesh, **kwargs) + + @property + def nP(self): + if self.mesh.dim == 2: + return 7 + elif self.mesh.dim == 3: + return 9 + + @property + def shape(self): + if self.active_cells is not None: + return (sum(self.active_cells), self.nP) + return (self.mesh.nC, self.nP) + + def _mDict2d(self, m): + return { + "val_background": m[0], + "val_layer": m[1], + "val_block": m[2], + "layer_center": m[3], + "layer_thickness": m[4], + "x0": m[5], + "dx": m[6], + } + + def _mDict3d(self, m): + return { + "val_background": m[0], + "val_layer": m[1], + "val_block": m[2], + "layer_center": m[3], + "layer_thickness": m[4], + "x0": m[5], + "y0": m[6], + "dx": m[7], + "dy": m[8], + } + + def mDict(self, m): + if self.mesh.dim == 2: + return self._mDict2d(m) + elif self.mesh.dim == 3: + return self._mDict3d(m) + + def xleft(self, mDict): + return mDict["x0"] - 0.5 * mDict["dx"] + + def xright(self, mDict): + return mDict["x0"] + 0.5 * mDict["dx"] + + def yleft(self, mDict): + return mDict["y0"] - 0.5 * mDict["dy"] + + def yright(self, mDict): + return mDict["y0"] + 0.5 * mDict["dy"] + + def _atanBlock2d(self, mDict): + return ( + self._atanLayer(mDict) + * self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + ) + + def _atanBlock2dDeriv_layer_center(self, mDict): + return ( + self._atanLayerDeriv_layer_center(mDict) + * self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + ) + + def _atanBlock2dDeriv_layer_thickness(self, mDict): + return ( + self._atanLayerDeriv_layer_thickness(mDict) + * self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + ) + + def _atanBlock2dDeriv_x0(self, mDict): + return self._atanLayer(mDict) * ( + ( + self._atanfctDeriv(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + ) + + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfctDeriv(self.x - self.xright(mDict), -self.slope) + ) + ) + + def _atanBlock2dDeriv_dx(self, mDict): + return self._atanLayer(mDict) * ( + ( + self._atanfctDeriv(self.x - self.xleft(mDict), self.slope) + * -0.5 + * self._atanfct(self.x - self.xright(mDict), -self.slope) + ) + + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * 0.5 + * self._atanfctDeriv(self.x - self.xright(mDict), -self.slope) + ) + ) + + def _atanBlock3d(self, mDict): + return ( + self._atanLayer(mDict) + * self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + def _atanBlock3dDeriv_layer_center(self, mDict): + return ( + self._atanLayerDeriv_layer_center(mDict) + * self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + def _atanBlock3dDeriv_layer_thickness(self, mDict): + return ( + self._atanLayerDeriv_layer_thickness(mDict) + * self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + def _atanBlock3dDeriv_x0(self, mDict): + return self._atanLayer(mDict) * ( + ( + self._atanfctDeriv(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfctDeriv(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + ) + + def _atanBlock3dDeriv_y0(self, mDict): + return self._atanLayer(mDict) * ( + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfctDeriv(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfctDeriv(self.y - self.yright(mDict), -self.slope) + ) + ) + + def _atanBlock3dDeriv_dx(self, mDict): + return self._atanLayer(mDict) * ( + ( + self._atanfctDeriv(self.x - self.xleft(mDict), self.slope) + * -0.5 + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfctDeriv(self.x - self.xright(mDict), -self.slope) + * 0.5 + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + ) + + def _atanBlock3dDeriv_dy(self, mDict): + return self._atanLayer(mDict) * ( + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfctDeriv(self.y - self.yleft(mDict), self.slope) + * -0.5 + * self._atanfct(self.y - self.yright(mDict), -self.slope) + ) + + ( + self._atanfct(self.x - self.xleft(mDict), self.slope) + * self._atanfct(self.x - self.xright(mDict), -self.slope) + * self._atanfct(self.y - self.yleft(mDict), self.slope) + * self._atanfctDeriv(self.y - self.yright(mDict), -self.slope) + * 0.5 + ) + ) + + def _transform2d(self, m): + mDict = self.mDict(m) + # assemble the model + # contribution from the layered background + layer_cont = mDict["val_background"] + ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayer(mDict) + + # perturbation due to the blocks + block_cont = (mDict["val_block"] - layer_cont) * self._atanBlock2d(mDict) + + return layer_cont + block_cont + + def _deriv2d_val_background(self, mDict): + d_layer_dval_background = np.ones_like(self.x) - self._atanLayer(mDict) + d_block_dval_background = (-d_layer_dval_background) * self._atanBlock2d(mDict) + return d_layer_dval_background + d_block_dval_background + + def _deriv2d_val_layer(self, mDict): + d_layer_dval_layer = self._atanLayer(mDict) + d_block_dval_layer = (-d_layer_dval_layer) * self._atanBlock2d(mDict) + return d_layer_dval_layer + d_block_dval_layer + + def _deriv2d_val_block(self, mDict): + d_layer_dval_block = 0.0 + d_block_dval_block = (1.0 - d_layer_dval_block) * self._atanBlock2d(mDict) + return d_layer_dval_block + d_block_dval_block + + def _deriv2d_layer_center(self, mDict): + d_layer_dlayer_center = ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_center(mDict) + d_block_dlayer_center = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock2dDeriv_layer_center( + mDict + ) - d_layer_dlayer_center * self._atanBlock2d( + mDict + ) + return d_layer_dlayer_center + d_block_dlayer_center + + def _deriv2d_layer_thickness(self, mDict): + d_layer_dlayer_thickness = ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_thickness(mDict) + d_block_dlayer_thickness = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock2dDeriv_layer_thickness( + mDict + ) - d_layer_dlayer_thickness * self._atanBlock2d( + mDict + ) + return d_layer_dlayer_thickness + d_block_dlayer_thickness + + def _deriv2d_x0(self, mDict): + d_layer_dx0 = 0.0 + d_block_dx0 = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock2dDeriv_x0(mDict) + return d_layer_dx0 + d_block_dx0 + + def _deriv2d_dx(self, mDict): + d_layer_ddx = 0.0 + d_block_ddx = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock2dDeriv_dx(mDict) + return d_layer_ddx + d_block_ddx + + def _deriv2d(self, m): + mDict = self.mDict(m) + + return np.vstack( + [ + self._deriv2d_val_background(mDict), + self._deriv2d_val_layer(mDict), + self._deriv2d_val_block(mDict), + self._deriv2d_layer_center(mDict), + self._deriv2d_layer_thickness(mDict), + self._deriv2d_x0(mDict), + self._deriv2d_dx(mDict), + ] + ).T + + def _transform3d(self, m): + # parse model + mDict = self.mDict(m) + + # assemble the model + # contribution from the layered background + layer_cont = mDict["val_background"] + ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayer(mDict) + # perturbation due to the block + block_cont = (mDict["val_block"] - layer_cont) * self._atanBlock3d(mDict) + + return layer_cont + block_cont + + def _deriv3d_val_background(self, mDict): + d_layer_dval_background = np.ones_like(self.x) - self._atanLayer(mDict) + d_block_dval_background = (-d_layer_dval_background) * self._atanBlock3d(mDict) + return d_layer_dval_background + d_block_dval_background + + def _deriv3d_val_layer(self, mDict): + d_layer_dval_layer = self._atanLayer(mDict) + d_block_dval_layer = (-d_layer_dval_layer) * self._atanBlock3d(mDict) + return d_layer_dval_layer + d_block_dval_layer + + def _deriv3d_val_block(self, mDict): + d_layer_dval_block = 0.0 + d_block_dval_block = (1.0 - d_layer_dval_block) * self._atanBlock3d(mDict) + return d_layer_dval_block + d_block_dval_block + + def _deriv3d_layer_center(self, mDict): + d_layer_dlayer_center = ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_center(mDict) + d_block_dlayer_center = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock3dDeriv_layer_center( + mDict + ) - d_layer_dlayer_center * self._atanBlock3d( + mDict + ) + return d_layer_dlayer_center + d_block_dlayer_center + + def _deriv3d_layer_thickness(self, mDict): + d_layer_dlayer_thickness = ( + mDict["val_layer"] - mDict["val_background"] + ) * self._atanLayerDeriv_layer_thickness(mDict) + d_block_dlayer_thickness = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock3dDeriv_layer_thickness( + mDict + ) - d_layer_dlayer_thickness * self._atanBlock3d( + mDict + ) + return d_layer_dlayer_thickness + d_block_dlayer_thickness + + def _deriv3d_x0(self, mDict): + d_layer_dx0 = 0.0 + d_block_dx0 = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock3dDeriv_x0(mDict) + return d_layer_dx0 + d_block_dx0 + + def _deriv3d_y0(self, mDict): + d_layer_dy0 = 0.0 + d_block_dy0 = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock3dDeriv_y0(mDict) + return d_layer_dy0 + d_block_dy0 + + def _deriv3d_dx(self, mDict): + d_layer_ddx = 0.0 + d_block_ddx = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock3dDeriv_dx(mDict) + return d_layer_ddx + d_block_ddx + + def _deriv3d_dy(self, mDict): + d_layer_ddy = 0.0 + d_block_ddy = ( + mDict["val_block"] - self.layer_cont(mDict) + ) * self._atanBlock3dDeriv_dy(mDict) + return d_layer_ddy + d_block_ddy + + def _deriv3d(self, m): + mDict = self.mDict(m) + + return np.vstack( + [ + self._deriv3d_val_background(mDict), + self._deriv3d_val_layer(mDict), + self._deriv3d_val_block(mDict), + self._deriv3d_layer_center(mDict), + self._deriv3d_layer_thickness(mDict), + self._deriv3d_x0(mDict), + self._deriv3d_y0(mDict), + self._deriv3d_dx(mDict), + self._deriv3d_dy(mDict), + ] + ).T + + def _transform(self, m): + if self.mesh.dim == 2: + return self._transform2d(m) + elif self.mesh.dim == 3: + return self._transform3d(m) + + def deriv(self, m): + if self.mesh.dim == 2: + return sp.csr_matrix(self._deriv2d(m)) + elif self.mesh.dim == 3: + return sp.csr_matrix(self._deriv3d(m)) diff --git a/simpeg/maps/_property_maps.py b/simpeg/maps/_property_maps.py new file mode 100644 index 0000000000..87bf56b48b --- /dev/null +++ b/simpeg/maps/_property_maps.py @@ -0,0 +1,1474 @@ +""" +Maps that transform physical properties from one space to another. +""" + +import warnings +import numpy as np +import scipy.sparse as sp +from scipy.sparse.linalg import LinearOperator +from scipy.constants import mu_0 +from scipy.special import expit, logit +from discretize.utils import mkvc, sdiag, rotation_matrix_from_normals + +from ._base import IdentityMap + +from ..utils import validate_integer, validate_direction, validate_float, validate_type + + +class ExpMap(IdentityMap): + r"""Mapping that computes the natural exponentials of the model parameters. + + Where :math:`\mathbf{m}` is a set of model parameters, ``ExpMap`` creates + a mapping :math:`\mathbf{u}(\mathbf{m})` that computes the natural exponential + of every element in :math:`\mathbf{m}`; i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = exp(\mathbf{m}) + + ``ExpMap`` is commonly used when working with physical properties whose values + span many orders of magnitude (e.g. the electrical conductivity :math:`\sigma`). + By using ``ExpMap``, we can invert for a model that represents the natural log + of a set of physical property values, i.e. when :math:`m = log(\sigma)` + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + + def _transform(self, m): + return np.exp(mkvc(m)) + + def inverse(self, D): + r"""Apply the inverse of the exponential mapping to an array. + + For the exponential mapping :math:`\mathbf{u}(\mathbf{m})`, the + inverse mapping on a variable :math:`\mathbf{x}` is performed by taking + the natural logarithms of elements, i.e.: + + .. math:: + \mathbf{m} = \mathbf{u}^{-1}(\mathbf{x}) = log(\mathbf{x}) + + Parameters + ---------- + D : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + A :class:`numpy.ndarray` containing result of applying the + inverse mapping to the elements in *D*; which in this case + is the natural logarithm. + """ + return np.log(mkvc(D)) + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a mapping :math:`\mathbf{u}(\mathbf{m})` that computes the natural + exponential function for each parameter in the model :math:`\mathbf{m}`, + i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = exp(\mathbf{m}), + + the derivative of the mapping with respect to the model is a diagonal + matrix of the form: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} + = \textrm{diag} \big ( exp(\mathbf{m}) \big ) + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + deriv = sdiag(np.exp(mkvc(m))) + if v is not None: + return deriv * v + return deriv + + @property + def is_linear(self): + return False + + +class ReciprocalMap(IdentityMap): + r"""Mapping that computes the reciprocals of the model parameters. + + Where :math:`\mathbf{m}` is a set of model parameters, ``ReciprocalMap`` + creates a mapping :math:`\mathbf{u}(\mathbf{m})` that computes the + reciprocal of every element in :math:`\mathbf{m}`; + i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{m}^{-1} + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + + def _transform(self, m): + return 1.0 / mkvc(m) + + def inverse(self, D): + r"""Apply the inverse of the reciprocal mapping to an array. + + For the reciprocal mapping :math:`\mathbf{u}(\mathbf{m})`, + the inverse mapping on a variable :math:`\mathbf{x}` is itself a + reciprocal mapping, i.e.: + + .. math:: + \mathbf{m} = \mathbf{u}^{-1}(\mathbf{x}) = \mathbf{x}^{-1} + + Parameters + ---------- + D : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + A :class:`numpy.ndarray` containing result of applying the + inverse mapping to the elements in *D*; which in this case + is just a reciprocal mapping. + """ + return 1.0 / mkvc(D) + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a mapping that computes the reciprocal for each + parameter in the model :math:`\mathbf{m}`, i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{m}^{-1} + + the derivative of the mapping with respect to the model is a diagonal + matrix of the form: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} + = \textrm{diag} \big ( -\mathbf{m}^{-2} \big ) + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + deriv = sdiag(-mkvc(m) ** (-2)) + if v is not None: + return deriv * v + return deriv + + @property + def is_linear(self): + return False + + +class LogMap(IdentityMap): + r"""Mapping that computes the natural logarithm of the model parameters. + + Where :math:`\mathbf{m}` is a set of model parameters, ``LogMap`` + creates a mapping :math:`\mathbf{u}(\mathbf{m})` that computes the + natural logarithm of every element in + :math:`\mathbf{m}`; i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \textrm{log}(\mathbf{m}) + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + + def _transform(self, m): + return np.log(mkvc(m)) + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a mapping :math:`\mathbf{u}(\mathbf{m})` that computes the + natural logarithm for each parameter in the model :math:`\mathbf{m}`, + i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = log(\mathbf{m}) + + the derivative of the mapping with respect to the model is a diagonal + matrix of the form: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} + = \textrm{diag} \big ( \mathbf{m}^{-1} \big ) + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + mod = mkvc(m) + deriv = np.zeros(mod.shape) + tol = 1e-16 # zero + ind = np.greater_equal(np.abs(mod), tol) + deriv[ind] = 1.0 / mod[ind] + if v is not None: + return sdiag(deriv) * v + return sdiag(deriv) + + def inverse(self, m): + r"""Apply the inverse of the natural log mapping to an array. + + For the natural log mapping :math:`\mathbf{u}(\mathbf{m})`, + the inverse mapping on a variable :math:`\mathbf{x}` is performed by + taking the natural exponent of the elements, i.e.: + + .. math:: + \mathbf{m} = \mathbf{u}^{-1}(\mathbf{x}) = exp(\mathbf{x}) + + Parameters + ---------- + D : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + A :class:`numpy.ndarray` containing result of applying the + inverse mapping to the elements in *D*; which in this case + is the natural exponent. + """ + return np.exp(mkvc(m)) + + @property + def is_linear(self): + return False + + +class LogisticSigmoidMap(IdentityMap): + r"""Mapping that computes the logistic sigmoid of the model parameters. + + Where :math:`\mathbf{m}` is a set of model parameters, ``LogisticSigmoidMap`` creates + a mapping :math:`\mathbf{u}(\mathbf{m})` that computes the logistic sigmoid + of every element in :math:`\mathbf{m}`; i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = sigmoid(\mathbf{m}) = \frac{1}{1+\exp{-\mathbf{m}}} + + ``LogisticSigmoidMap`` transforms values onto the interval (0,1), but can optionally + be scaled and shifted to the interval (a,b). This can be useful for inversion + of data that varies over a log scale and bounded on some interval: + + .. math:: + \mathbf{u}(\mathbf{m}) = a + (b - a) \cdot sigmoid(\mathbf{m}) + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + lower_bound: float or (nP) numpy.ndarray + lower bound (a) for the transform. Default 0. Defined \in \mathbf{u} space. + upper_bound: float or (nP) numpy.ndarray + upper bound (b) for the transform. Default 1. Defined \in \mathbf{u} space. + + """ + + def __init__(self, mesh=None, nP=None, lower_bound=0, upper_bound=1, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + lower_bound = np.atleast_1d(lower_bound) + upper_bound = np.atleast_1d(upper_bound) + if self.nP != "*": + # check if lower bound and upper bound broadcast to nP + try: + np.broadcast_shapes(lower_bound.shape, (self.nP,)) + except ValueError as err: + raise ValueError( + f"Lower bound does not broadcast to the number of parameters. " + f"Lower bound shape is {lower_bound.shape} and tried against " + f"{self.nP} parameters." + ) from err + try: + np.broadcast_shapes(upper_bound.shape, (self.nP,)) + except ValueError as err: + raise ValueError( + f"Upper bound does not broadcast to the number of parameters. " + f"Upper bound shape is {upper_bound.shape} and tried against " + f"{self.nP} parameters." + ) from err + # make sure lower and upper bound broadcast to each other... + try: + np.broadcast_shapes(lower_bound.shape, upper_bound.shape) + except ValueError as err: + raise ValueError( + f"Upper bound does not broadcast to the lower bound. " + f"Shapes {upper_bound.shape} and {lower_bound.shape} " + f"are incompatible with each other." + ) from err + + if np.any(lower_bound >= upper_bound): + raise ValueError( + "A lower bound is greater than or equal to the upper bound." + ) + + self._lower_bound = lower_bound + self._upper_bound = upper_bound + + @property + def lower_bound(self): + """The lower bound + + Returns + ------- + numpy.ndarray + """ + return self._lower_bound + + @property + def upper_bound(self): + """The upper bound + + Returns + ------- + numpy.ndarray + """ + return self._upper_bound + + def _transform(self, m): + return self.lower_bound + (self.upper_bound - self.lower_bound) * expit(mkvc(m)) + + def inverse(self, m): + r"""Apply the inverse of the mapping to an array. + + For the logistic sigmoid mapping :math:`\mathbf{u}(\mathbf{m})`, the + inverse mapping on a variable :math:`\mathbf{x}` is performed by taking + the log-odds of elements, i.e.: + + .. math:: + \mathbf{m} = \mathbf{u}^{-1}(\mathbf{x}) = logit(\mathbf{x}) = \log \frac{\mathbf{x}}{1 - \mathbf{x}} + + or scaled and translated to interval (a,b): + .. math:: + \mathbf{m} = logit(\frac{(\mathbf{x} - a)}{b-a}) + + Parameters + ---------- + m : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + the inverse mapping to the elements in *m*; which in this case + is the log-odds function with scaled and shifted input. + """ + return logit( + (mkvc(m) - self.lower_bound) / (self.upper_bound - self.lower_bound) + ) + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a mapping :math:`\mathbf{u}(\mathbf{m})` the derivative of the mapping with + respect to the model is a diagonal matrix of the form: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} + = \textrm{diag} \big ( (b-a)\cdot sigmoid(\mathbf{m})\cdot(1-sigmoid(\mathbf{m})) \big ) + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + numpy.ndarray or scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + sigmoid = expit(mkvc(m)) + deriv = (self.upper_bound - self.lower_bound) * sigmoid * (1.0 - sigmoid) + if v is not None: + return deriv * v + return sdiag(deriv) + + @property + def is_linear(self): + return False + + +class ChiMap(IdentityMap): + r"""Mapping that computes the magnetic permeability given a set of magnetic susceptibilities. + + Where :math:`\boldsymbol{\chi}` is the input model parameters defining a set of magnetic + susceptibilities, ``ChiMap`` creates a mapping :math:`\boldsymbol{\mu}(\boldsymbol{\chi})` + that computes the corresponding magnetic permeabilities of every + element in :math:`\boldsymbol{\chi}`; i.e.: + + .. math:: + \boldsymbol{\mu}(\boldsymbol{\chi}) = \mu_0 \big (1 + \boldsymbol{\chi} \big ) + + where :math:`\mu_0` is the permeability of free space. + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + + def _transform(self, m): + return mu_0 * (1 + m) + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a mapping :math:`\boldsymbol{\mu}(\boldsymbol{\chi})` that transforms a + set of magnetic susceptibilities :math:`\boldsymbol{\chi}` to their corresponding + magnetic permeabilities, i.e.: + + .. math:: + \boldsymbol{\mu}(\boldsymbol{\chi}) = \mu_0 \big (1 + \boldsymbol{\chi} \big ), + + the derivative of the mapping with respect to the model is the identity + matrix scaled by the permeability of free-space. Thus: + + .. math:: + \frac{\partial \boldsymbol{\mu}}{\partial \boldsymbol{\chi}} = \mu_0 \mathbf{I} + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + if v is not None: + return mu_0 * v + return mu_0 * sp.eye(self.nP) + + def inverse(self, m): + r"""Apply the inverse mapping to an array. + + For the ``ChiMap`` class, the inverse mapping recoveres the set of + magnetic susceptibilities :math:`\boldsymbol{\chi}` from a set of + magnetic permeabilities :math:`\boldsymbol{\mu}`. Thus the inverse + mapping is defined as: + + .. math:: + \boldsymbol{\chi}(\boldsymbol{\mu}) = \frac{\boldsymbol{\mu}}{\mu_0} - 1 + + where :math:`\mu_0` is the permeability of free space. + + Parameters + ---------- + D : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + A :class:`numpy.ndarray` containing result of applying the + inverse mapping to the elements in *D*; which in this case + represents the conversion of magnetic permeabilities + to their corresponding magnetic susceptibility values. + """ + return m / mu_0 - 1 + + +class MuRelative(IdentityMap): + r"""Mapping that computes the magnetic permeability given a set of relative permeabilities. + + Where :math:`\boldsymbol{\mu_r}` defines a set of relative permeabilities, ``MuRelative`` + creates a mapping :math:`\boldsymbol{\mu}(\boldsymbol{\mu_r})` that computes the + corresponding magnetic permeabilities of every element in :math:`\boldsymbol{\mu_r}`; + i.e.: + + .. math:: + \boldsymbol{\mu}(\boldsymbol{\mu_r}) = \mu_0 \boldsymbol{\mu_r} + + where :math:`\mu_0` is the permeability of free space. + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + + def _transform(self, m): + return mu_0 * m + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a mapping that transforms a set of relative permeabilities + :math:`\boldsymbol{\mu_r}` to their corresponding magnetic permeabilities, i.e.: + + .. math:: + \boldsymbol{\mu}(\boldsymbol{\mu_r}) = \mu_0 \boldsymbol{\mu_r}, + + the derivative of the mapping with respect to the model is the identity + matrix scaled by the permeability of free-space. Thus: + + .. math:: + \frac{\partial \boldsymbol{\mu}}{\partial \boldsymbol{\mu_r}} = \mu_0 \mathbf{I} + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + if v is not None: + return mu_0 * v + return mu_0 * sp.eye(self.nP) + + def inverse(self, m): + r"""Apply the inverse mapping to an array. + + For the ``MuRelative`` class, the inverse mapping recoveres the set of + relative permeabilities :math:`\boldsymbol{\mu_r}` from a set of + magnetic permeabilities :math:`\boldsymbol{\mu}`. Thus the inverse + mapping is defined as: + + .. math:: + \boldsymbol{\mu_r}(\boldsymbol{\mu}) = \frac{\boldsymbol{\mu}}{\mu_0} + + where :math:`\mu_0` is the permeability of free space. + + Parameters + ---------- + D : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + A :class:`numpy.ndarray` containing result of applying the + inverse mapping to the elements in *D*; which in this case + represents the conversion of magnetic permeabilities + to their corresponding relative permeability values. + """ + return 1.0 / mu_0 * m + + +class Weighting(IdentityMap): + r"""Mapping that scales the elements of the model by a corresponding set of weights. + + Where :math:`\mathbf{m}` defines the set of input model parameters and + :math:`\mathbf{w}` represents a corresponding set of model weight, + ``Weighting`` constructs a mapping :math:`\mathbf{u}(\mathbf{m})` of the form: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{w} \odot \mathbf{m} + + where :math:`\odot` is the Hadamard product. The mapping may also be + defined using a linear operator as follows: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} \;\;\;\;\; \textrm{where} \;\;\;\;\; \mathbf{P} = diag(\mathbf{w}) + + Parameters + ---------- + mesh : discretize.BaseMesh + The number of parameters accepted by the mapping is set to equal the number + of mesh cells. + nP : int + Set the number of parameters accepted by the mapping directly. Used if the + number of parameters is known. Used generally when the number of parameters + is not equal to the number of cells in a mesh. + weights : (nP) numpy.ndarray + A set of independent model weights. If ``None``, all model weights are set + to *1*. + """ + + def __init__(self, mesh=None, nP=None, weights=None, **kwargs): + if "nC" in kwargs: + raise TypeError( + "`nC` has been removed. Use `nP` to set the number of model " + "parameters." + ) + + super(Weighting, self).__init__(mesh=mesh, nP=nP, **kwargs) + + if weights is None: + weights = np.ones(self.nP) + + self.weights = np.array(weights, dtype=float) + + @property + def shape(self): + """Dimensions of the mapping. + + Returns + ------- + tuple + Dimensions of the mapping. Where *nP* is the number of parameters + the mapping acts on, this method returns a tuple of the form + (*nP*, *nP*). + """ + return (self.nP, self.nP) + + @property + def P(self): + r"""The linear mapping operator + + This property returns the sparse matrix :math:`\mathbf{P}` that carries + out the weighting mapping via matrix-vector product, i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} \;\;\;\;\; \textrm{where} \;\;\;\;\; \mathbf{P} = diag(\mathbf{w}) + + Returns + ------- + scipy.sparse.csr_matrix + Sparse linear mapping operator + """ + return sdiag(self.weights) + + def _transform(self, m): + return self.weights * m + + def inverse(self, D): + r"""Apply the inverse of the weighting mapping to an array. + + For the weighting mapping :math:`\mathbf{u}(\mathbf{m})`, the inverse + mapping on a variable :math:`\mathbf{x}` is performed by multplying each element by + the reciprocal of its corresponding weighting value, i.e.: + + .. math:: + \mathbf{m} = \mathbf{u}^{-1}(\mathbf{x}) = \mathbf{w}^{-1} \odot \mathbf{x} + + where :math:`\odot` is the Hadamard product. The inverse mapping may also be defined + using a linear operator as follows: + + .. math:: + \mathbf{m} = \mathbf{u}^{-1}(\mathbf{x}) = \mathbf{P^{-1} m} + \;\;\;\;\; \textrm{where} \;\;\;\;\; \mathbf{P} = diag(\mathbf{w}) + + Parameters + ---------- + D : numpy.ndarray + A set of input values + + Returns + ------- + numpy.ndarray + A :class:`numpy.ndarray` containing result of applying the + inverse mapping to the elements in *D*; which in this case + is simply dividing each element by its corresponding + weight. + """ + return self.weights ** (-1.0) * D + + def deriv(self, m, v=None): + r"""Derivative of mapping with respect to the input parameters. + + For a weighting mapping :math:`\mathbf{u}(\mathbf{m})` that scales the + input parameters in the model :math:`\mathbf{m}` by their corresponding + weights :math:`\mathbf{w}`; i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{w} \dot \mathbf{m}, + + the derivative of the mapping with respect to the model is a diagonal + matrix of the form: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} + = diag (\mathbf{w}) + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + if v is not None: + return self.weights * v + return self.P + + +class ComplexMap(IdentityMap): + r"""Maps the real and imaginary component values stored in a model to complex values. + + Let :math:`\mathbf{m}` be a model which stores the real and imaginary components of + a set of complex values :math:`\mathbf{z}`. Where the model parameters are organized + into a vector of the form + :math:`\mathbf{m} = [\mathbf{z}^\prime , \mathbf{z}^{\prime\prime}]`, ``ComplexMap`` + constructs the following mapping: + + .. math:: + \mathbf{z}(\mathbf{m}) = \mathbf{z}^\prime + j \mathbf{z}^{\prime\prime} + + Note that the mapping is :math:`\mathbb{R}^{2n} \rightarrow \mathbb{C}^n`. + + Parameters + ---------- + mesh : discretize.BaseMesh + If a mesh is used to construct the mapping, the number of input model + parameters is *2\*mesh.nC* and the number of complex values output from + the mapping is equal to *mesh.nC*. If *mesh* is ``None``, the dimensions + of the mapping are set using the *nP* input argument. + nP : int + Defines the number of input model parameters directly. Must be an even number!!! + In this case, the number of complex values output from the mapping is *nP/2*. + If *nP* = ``None``, the dimensions of the mapping are set using the *mesh* + input argument. + + Examples + -------- + Here we construct a complex mapping on a 1D mesh comprised + of 4 cells. The input model is real-valued array of length 8 + (4 real and 4 imaginary values). The output of the mapping + is a complex array with 4 values. + + >>> from simpeg.maps import ComplexMap + >>> from discretize import TensorMesh + >>> import numpy as np + + >>> nC = 4 + >>> mesh = TensorMesh([np.ones(nC)]) + + >>> z_real = np.ones(nC) + >>> z_imag = 2*np.ones(nC) + >>> m = np.r_[z_real, z_imag] + >>> m + array([1., 1., 1., 1., 2., 2., 2., 2.]) + + >>> mapping = ComplexMap(mesh=mesh) + >>> z = mapping * m + >>> z + array([1.+2.j, 1.+2.j, 1.+2.j, 1.+2.j]) + + """ + + def __init__(self, mesh=None, nP=None, **kwargs): + super().__init__(mesh=mesh, nP=nP, **kwargs) + if nP is not None and mesh is not None: + assert ( + 2 * mesh.nC == nP + ), "Number parameters must be 2 X number of mesh cells." + if nP is not None: + assert nP % 2 == 0, "nP must be even." + self._nP = nP or int(self.mesh.nC * 2) + + @property + def nP(self): + r"""Number of parameters the mapping acts on. + + Returns + ------- + int or '*' + Number of parameters that the mapping acts on. + """ + return self._nP + + @property + def shape(self): + """Dimensions of the mapping + + Returns + ------- + tuple + The dimensions of the mapping. Where *nP* is the number + of input parameters, this property returns a tuple + (*nP/2*, *nP*). + """ + return (int(self.nP / 2), self.nP) + + def _transform(self, m): + nC = int(self.nP / 2) + return m[:nC] + m[nC:] * 1j + + def deriv(self, m, v=None): + r"""Derivative of the complex mapping with respect to the input parameters. + + The complex mapping maps the real and imaginary components stored in a model + of the form :math:`\mathbf{m} = [\mathbf{z}^\prime , \mathbf{z}^{\prime\prime}]` + to their corresponding complex values :math:`\mathbf{z}`, i.e. + + .. math:: + \mathbf{z}(\mathbf{m}) = \mathbf{z}^\prime + j \mathbf{z}^{\prime\prime} + + The derivative of the mapping with respect to the model is block + matrix of the form: + + .. math:: + \frac{\partial \mathbf{z}}{\partial \mathbf{m}} = \big ( \mathbf{I} \;\;\; j\mathbf{I} \big ) + + where :math:`\mathbf{I}` is the identity matrix of shape (*nP/2*, *nP/2*) and + :math:`j = \sqrt{-1}`. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + + Examples + -------- + Here we construct the derivative operator for the complex mapping on a 1D + mesh comprised of 4 cells. We then demonstrate how the derivative of the + mapping and its adjoint can be applied to a vector. + + >>> from simpeg.maps import ComplexMap + >>> from discretize import TensorMesh + >>> import numpy as np + + >>> nC = 4 + >>> mesh = TensorMesh([np.ones(nC)]) + + >>> m = np.random.rand(2*nC) + >>> mapping = ComplexMap(mesh=mesh) + >>> M = mapping.deriv(m) + + When applying the derivative operator to a vector, it will convert + the real and imaginary values stored in the vector to + complex values; essentially applying the mapping. + + >>> v1 = np.arange(0, 2*nC, 1) + >>> u1 = M * v1 + >>> u1 + array([0.+4.j, 1.+5.j, 2.+6.j, 3.+7.j]) + + When applying the adjoint of the derivative operator to a set of + complex values, the operator will decompose these values into + their real and imaginary components. + + >>> v2 = np.arange(0, nC, 1) + 1j*np.arange(nC, 2*nC, 1) + >>> u2 = M.adjoint() * v2 + >>> u2 + array([0., 1., 2., 3., 4., 5., 6., 7.]) + + """ + nC = self.shape[0] + shp = (nC, nC * 2) + + def fwd(v): + return v[:nC] + v[nC:] * 1j + + def adj(v): + return np.r_[v.real, v.imag] + + if v is not None: + return LinearOperator(shp, matvec=fwd, rmatvec=adj) * v + return LinearOperator(shp, matvec=fwd, rmatvec=adj) + + +class SelfConsistentEffectiveMedium(IdentityMap): + r""" + Two phase self-consistent effective medium theory mapping for + ellipsoidal inclusions. The inversion model is the concentration + (volume fraction) of the phase 2 material. + + The inversion model is :math:`\varphi`. We solve for :math:`\sigma` + given :math:`\sigma_0`, :math:`\sigma_1` and :math:`\varphi` . Each of + the following are implicit expressions of the effective conductivity. + They are solved using a fixed point iteration. + + **Spherical Inclusions** + + If the shape of the inclusions are spheres, we use + + .. math:: + + \sum_{j=1}^N (\sigma^* - \sigma_j)R^{j} = 0 + + where :math:`j=[1,N]` is the each material phase, and N is the number + of phases. Currently, the implementation is only set up for 2 phase + materials, so we solve + + .. math:: + + (1-\\varphi)(\sigma - \sigma_0)R^{(0)} + \varphi(\sigma - \sigma_1)R^{(1)} = 0. + + Where :math:`R^{(j)}` is given by + + .. math:: + + R^{(j)} = \left[1 + \frac{1}{3}\frac{\sigma_j - \sigma}{\sigma} \right]^{-1}. + + **Ellipsoids** + + .. todo:: + + Aligned Ellipsoids have not yet been implemented, only randomly + oriented ellipsoids + + If the inclusions are aligned ellipsoids, we solve + + .. math:: + + \sum_{j=1}^N \varphi_j (\Sigma^* - \sigma_j\mathbf{I}) \mathbf{R}^{j, *} = 0 + + where + + .. math:: + + \mathbf{R}^{(j, *)} = \left[ \mathbf{I} + \mathbf{A}_j {\Sigma^{*}}^{-1}(\sigma_j \mathbf{I} - \Sigma^*) \\right]^{-1} + + and the depolarization tensor :math:`\mathbf{A}_j` is given by + + .. math:: + + \mathbf{A}^* = \left[\begin{array}{ccc} + Q & 0 & 0 \\ + 0 & Q & 0 \\ + 0 & 0 & 1-2Q + \end{array}\right] + + for a spheroid aligned along the z-axis. For an oblate spheroid + (:math:`\alpha < 1`, pancake-like) + + .. math:: + + Q = \frac{1}{2}\left( + 1 + \frac{1}{\alpha^2 - 1} \left[ + 1 - \frac{1}{\chi}\tan^{-1}(\chi) + \right] + \right) + + where + + .. math:: + + \chi = \sqrt{\frac{1}{\alpha^2} - 1} + + + For reference, see + `Torquato (2002), Random Heterogeneous Materials `_ + + + """ + + def __init__( + self, + mesh=None, + nP=None, + sigma0=None, + sigma1=None, + alpha0=1.0, + alpha1=1.0, + orientation0="z", + orientation1="z", + random=True, + rel_tol=1e-3, + maxIter=50, + **kwargs, + ): + self._sigstart = None + self.sigma0 = sigma0 + self.sigma1 = sigma1 + self.alpha0 = alpha0 + self.alpha1 = alpha1 + self.orientation0 = orientation0 + self.orientation1 = orientation1 + self.random = random + self.rel_tol = rel_tol + self.maxIter = maxIter + super(SelfConsistentEffectiveMedium, self).__init__(mesh, nP, **kwargs) + + @property + def sigma0(self): + """Physical property value for phase-0 material. + + Returns + ------- + float + """ + return self._sigma0 + + @sigma0.setter + def sigma0(self, value): + self._sigma0 = validate_float("sigma0", value, min_val=0.0) + + @property + def sigma1(self): + """Physical property value for phase-1 material. + + Returns + ------- + float + """ + return self._sigma1 + + @sigma1.setter + def sigma1(self, value): + self._sigma1 = validate_float("sigma1", value, min_val=0.0) + + @property + def alpha0(self): + """Aspect ratio of the phase-0 ellipsoids. + + Returns + ------- + float + """ + return self._alpha0 + + @alpha0.setter + def alpha0(self, value): + self._alpha0 = validate_float("alpha0", value, min_val=0.0) + + @property + def alpha1(self): + """Aspect ratio of the phase-1 ellipsoids. + + Returns + ------- + float + """ + return self._alpha1 + + @alpha1.setter + def alpha1(self, value): + self._alpha1 = validate_float("alpha1", value, min_val=0.0) + + @property + def orientation0(self): + """Orientation of the phase-0 inclusions. + + Returns + ------- + numpy.ndarray + """ + return self._orientation0 + + @orientation0.setter + def orientation0(self, value): + self._orientation0 = validate_direction("orientation0", value, dim=3) + + @property + def orientation1(self): + """Orientation of the phase-0 inclusions. + + Returns + ------- + numpy.ndarray + """ + return self._orientation1 + + @orientation1.setter + def orientation1(self, value): + self._orientation1 = validate_direction("orientation1", value, dim=3) + + @property + def random(self): + """Are the inclusions randomly oriented (True) or preferentially aligned (False)? + + Returns + ------- + bool + """ + return self._random + + @random.setter + def random(self, value): + self._random = validate_type("random", value, bool) + + @property + def rel_tol(self): + """relative tolerance for convergence for the fixed-point iteration. + + Returns + ------- + float + """ + return self._rel_tol + + @rel_tol.setter + def rel_tol(self, value): + self._rel_tol = validate_float( + "rel_tol", value, min_val=0.0, inclusive_min=False + ) + + @property + def maxIter(self): + """Maximum number of iterations for the fixed point iteration calculation. + + Returns + ------- + int + """ + return self._maxIter + + @maxIter.setter + def maxIter(self, value): + self._maxIter = validate_integer("maxIter", value, min_val=0) + + @property + def tol(self): + """ + absolute tolerance for the convergence of the fixed point iteration + calc + """ + if getattr(self, "_tol", None) is None: + self._tol = self.rel_tol * min(self.sigma0, self.sigma1) + return self._tol + + @property + def sigstart(self): + """ + first guess for sigma + """ + return self._sigstart + + @sigstart.setter + def sigstart(self, value): + if value is not None: + value = validate_float("sigstart", value) + self._sigstart = value + + def wiener_bounds(self, phi1): + """Define Wenner Conductivity Bounds + + See Torquato, 2002 + """ + phi0 = 1.0 - phi1 + sigWup = phi0 * self.sigma0 + phi1 * self.sigma1 + sigWlo = 1.0 / (phi0 / self.sigma0 + phi1 / self.sigma1) + W = np.array([sigWlo, sigWup]) + + return W + + def hashin_shtrikman_bounds(self, phi1): + """Hashin Shtrikman bounds + + See Torquato, 2002 + """ + # TODO: this should probably exsist on its own as a util + + phi0 = 1.0 - phi1 + sigWu = self.wiener_bounds(phi1)[1] + sig_tilde = phi0 * self.sigma1 + phi1 * self.sigma0 + + sigma_min = np.min([self.sigma0, self.sigma1]) + sigma_max = np.max([self.sigma0, self.sigma1]) + + sigHSlo = sigWu - ( + (phi0 * phi1 * (self.sigma0 - self.sigma1) ** 2) + / (sig_tilde + 2 * sigma_max) + ) + sigHSup = sigWu - ( + (phi0 * phi1 * (self.sigma0 - self.sigma1) ** 2) + / (sig_tilde + 2 * sigma_min) + ) + + return np.array([sigHSlo, sigHSup]) + + def hashin_shtrikman_bounds_anisotropic(self, phi1): + """Hashin Shtrikman bounds for anisotropic media + + See Torquato, 2002 + """ + phi0 = 1.0 - phi1 + sigWu = self.wiener_bounds(phi1)[1] + + sigma_min = np.min([self.sigma0, self.sigma1]) + sigma_max = np.max([self.sigma0, self.sigma1]) + + phi_min = phi0 if self.sigma1 > self.sigma0 else phi1 + phi_max = phi1 if self.sigma1 > self.sigma0 else phi0 + + amax = ( + -phi0 + * phi1 + * self.getA( + self.alpha1 if self.sigma1 > self.sigma0 else self.alpha0, + self.orientation1 if self.sigma1 > self.sigma0 else self.orientation0, + ) + ) + I = np.eye(3) + + sigHSlo = sigWu * I + ( + (sigma_min - sigma_max) ** 2 + * amax + * np.linalg.inv(sigma_min * I + (sigma_min - sigma_max) / phi_max * amax) + ) + sigHSup = sigWu * I + ( + (sigma_max - sigma_min) ** 2 + * amax + * np.linalg.inv(sigma_max * I + (sigma_max - sigma_min) / phi_min * amax) + ) + + return [sigHSlo, sigHSup] + + def getQ(self, alpha): + """Geometric factor in the depolarization tensor""" + if alpha < 1.0: # oblate spheroid + chi = np.sqrt((1.0 / alpha**2.0) - 1) + return ( + 1.0 / 2.0 * (1 + 1.0 / (alpha**2.0 - 1) * (1.0 - np.arctan(chi) / chi)) + ) + elif alpha > 1.0: # prolate spheroid + chi = np.sqrt(1 - (1.0 / alpha**2.0)) + return ( + 1.0 + / 2.0 + * ( + 1 + + 1.0 + / (alpha**2.0 - 1) + * (1.0 - 1.0 / (2.0 * chi) * np.log((1 + chi) / (1 - chi))) + ) + ) + elif alpha == 1: # sphere + return 1.0 / 3.0 + + def getA(self, alpha, orientation): + """Depolarization tensor""" + Q = self.getQ(alpha) + A = np.diag([Q, Q, 1 - 2 * Q]) + R = rotation_matrix_from_normals(np.r_[0.0, 0.0, 1.0], orientation) + return (R.T).dot(A).dot(R) + + def getR(self, sj, se, alpha, orientation=None): + """Electric field concentration tensor""" + if self.random is True: # isotropic + if alpha == 1.0: + return 3.0 * se / (2.0 * se + sj) + Q = self.getQ(alpha) + return ( + se + / 3.0 + * (2.0 / (se + Q * (sj - se)) + 1.0 / (sj - 2.0 * Q * (sj - se))) + ) + else: # anisotropic + if orientation is None: + raise Exception("orientation must be provided if random=False") + I = np.eye(3) + seinv = np.linalg.inv(se) + Rinv = I + self.getA(alpha, orientation) * seinv * (sj * I - se) + return np.linalg.inv(Rinv) + + def getdR(self, sj, se, alpha, orientation=None): + """ + Derivative of the electric field concentration tensor with respect + to the concentration of the second phase material. + """ + if self.random is True: + if alpha == 1.0: + return 3.0 / (2.0 * se + sj) - 6.0 * se / (2.0 * se + sj) ** 2 + Q = self.getQ(alpha) + return ( + 1 + / 3 + * ( + 2.0 / (se + Q * (sj - se)) + + 1.0 / (sj - 2.0 * Q * (sj - se)) + + se + * ( + -2 * (1 - Q) / (se + Q * (sj - se)) ** 2 + - 2 * Q / (sj - 2.0 * Q * (sj - se)) ** 2 + ) + ) + ) + else: + if orientation is None: + raise Exception("orientation must be provided if random=False") + raise NotImplementedError + + def _sc2phaseEMTSpheroidstransform(self, phi1): + """ + Self Consistent Effective Medium Theory Model Transform, + alpha = aspect ratio (c/a <= 1) + """ + + if not (np.all(0 <= phi1) and np.all(phi1 <= 1)): + warnings.warn("there are phis outside bounds of 0 and 1", stacklevel=2) + phi1 = np.median(np.c_[phi1 * 0, phi1, phi1 * 0 + 1.0]) + + phi0 = 1.0 - phi1 + + # starting guess + if self.sigstart is None: + sige1 = np.mean(self.wiener_bounds(phi1)) + else: + sige1 = self.sigstart + + if self.random is False: + sige1 = sige1 * np.eye(3) + + for _ in range(self.maxIter): + R0 = self.getR(self.sigma0, sige1, self.alpha0, self.orientation0) + R1 = self.getR(self.sigma1, sige1, self.alpha1, self.orientation1) + + den = phi0 * R0 + phi1 * R1 + num = phi0 * self.sigma0 * R0 + phi1 * self.sigma1 * R1 + + if self.random is True: + sige2 = num / den + relerr = np.abs(sige2 - sige1) + else: + sige2 = num * np.linalg.inv(den) + relerr = np.linalg.norm(np.abs(sige2 - sige1).flatten(), np.inf) + + if np.all(relerr <= self.tol): + if self.sigstart is None: + self._sigstart = ( + sige2 # store as a starting point for the next time around + ) + return sige2 + + sige1 = sige2 + # TODO: make this a proper warning, and output relevant info (sigma0, sigma1, phi, sigstart, and relerr) + warnings.warn("Maximum number of iterations reached", stacklevel=2) + + return sige2 + + def _sc2phaseEMTSpheroidsinversetransform(self, sige): + R0 = self.getR(self.sigma0, sige, self.alpha0, self.orientation0) + R1 = self.getR(self.sigma1, sige, self.alpha1, self.orientation1) + + num = -(self.sigma0 - sige) * R0 + den = (self.sigma1 - sige) * R1 - (self.sigma0 - sige) * R0 + + return num / den + + def _sc2phaseEMTSpheroidstransformDeriv(self, sige, phi1): + phi0 = 1.0 - phi1 + + R0 = self.getR(self.sigma0, sige, self.alpha0, self.orientation0) + R1 = self.getR(self.sigma1, sige, self.alpha1, self.orientation1) + + dR0 = self.getdR(self.sigma0, sige, self.alpha0, self.orientation0) + dR1 = self.getdR(self.sigma1, sige, self.alpha1, self.orientation1) + + num = (sige - self.sigma0) * R0 - (sige - self.sigma1) * R1 + den = phi0 * (R0 + (sige - self.sigma0) * dR0) + phi1 * ( + R1 + (sige - self.sigma1) * dR1 + ) + + return sdiag(num / den) + + def _transform(self, m): + return self._sc2phaseEMTSpheroidstransform(m) + + def deriv(self, m): + """ + Derivative of the effective conductivity with respect to the + volume fraction of phase 2 material + """ + sige = self._transform(m) + return self._sc2phaseEMTSpheroidstransformDeriv(sige, m) + + def inverse(self, sige): + """ + Compute the concentration given the effective conductivity + """ + return self._sc2phaseEMTSpheroidsinversetransform(sige) + + @property + def is_linear(self): + return False diff --git a/simpeg/maps/_surjection.py b/simpeg/maps/_surjection.py new file mode 100644 index 0000000000..edcfa1f420 --- /dev/null +++ b/simpeg/maps/_surjection.py @@ -0,0 +1,568 @@ +""" +Surjection map classes. +""" + +import discretize +import numpy as np +import scipy.sparse as sp +from discretize import TensorMesh, CylindricalMesh +from discretize.utils import mkvc + +from ..utils import ( + validate_type, + validate_ndarray_with_shape, + validate_string, + validate_active_indices, +) +from ._base import IdentityMap + + +class SurjectFull(IdentityMap): + r"""Mapping a single property value to all mesh cells. + + Let :math:`m` be a model defined by a single physical property value + ``SurjectFull`` construct a surjective mapping that projects :math:`m` + to the set of voxel cells defining a mesh. The mapping + :math:`\mathbf{u(m)}` is a matrix of 1s of shape (*mesh.nC* , 1) that + projects the model to all mesh cells, i.e.: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + + Parameters + ---------- + mesh : discretize.BaseMesh + A discretize mesh + + """ + + def __init__(self, mesh, **kwargs): + super().__init__(mesh=mesh, **kwargs) + + @property + def nP(self): + r"""Number of parameters the mapping acts on; i.e. 1. + + Returns + ------- + int + Returns an integer value of 1 + """ + return 1 + + def _transform(self, m): + """ + :param m: model (scalar) + :rtype: numpy.ndarray + :return: transformed model + """ + return np.ones(self.mesh.nC) * m + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + Let :math:`m` be the single parameter that the mapping acts on. The + ``SurjectFull`` class constructs a mapping that can be defined as + a projection matrix :math:`\mathbf{P}`; i.e.: + + .. math:: + \mathbf{u} = \mathbf{P m}, + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{P} + + Note that in this case, **deriv** simply returns the original operator + :math:`\mathbf{P}`; a (*mesh.nC* , 1) numpy.ndarray of 1s. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + """ + deriv = sp.csr_matrix(np.ones([self.mesh.nC, 1])) + if v is not None: + return deriv * v + return deriv + + +class SurjectVertical1D(IdentityMap): + r"""Map 1D layered Earth model to 2D or 3D tensor mesh. + + Let :math:`m` be a 1D model that defines the property values along + the last dimension of a tensor mesh; i.e. the y-direction for 2D + meshes and the z-direction for 3D meshes. ``SurjectVertical1D`` + construct a surjective mapping from the 1D model to all voxel cells + in the 2D or 3D tensor mesh provided. + + Mathematically, the mapping :math:`\mathbf{u}(\mathbf{m})` can be + represented by a projection matrix: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + + Parameters + ---------- + mesh : discretize.TensorMesh + A 2D or 3D tensor mesh + + Examples + -------- + Here we define a 1D layered Earth model comprised of 3 layers + on a 1D tensor mesh. We then use ``SurjectVertical1D`` to + construct a mapping which projects the 1D model onto a 2D + tensor mesh. + + >>> from simpeg.maps import SurjectVertical1D + >>> from simpeg.utils import plot_1d_layer_model + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib as mpl + >>> import matplotlib.pyplot as plt + + >>> dh = np.ones(20) + >>> mesh1D = TensorMesh([dh], 'C') + >>> mesh2D = TensorMesh([dh, dh], 'CC') + + >>> m = np.zeros(mesh1D.nC) + >>> m[mesh1D.cell_centers < 0] = 10. + >>> m[mesh1D.cell_centers < -5] = 5. + + >>> fig1 = plt.figure(figsize=(5,5)) + >>> ax1 = fig1.add_subplot(111) + >>> plot_1d_layer_model( + >>> mesh1D.h[0], np.flip(m), ax=ax1, z0=0, + >>> scale='linear', show_layers=True, plot_elevation=True + >>> ) + >>> ax1.set_xlim([-0.1, 11]) + >>> ax1.set_title('1D Model') + + >>> mapping = SurjectVertical1D(mesh2D) + >>> u = mapping * m + + >>> fig2 = plt.figure(figsize=(6, 5)) + >>> ax2a = fig2.add_axes([0.1, 0.15, 0.7, 0.8]) + >>> mesh2D.plot_image(u, ax=ax2a, grid=True) + >>> ax2a.set_title('Projected to 2D Mesh') + >>> ax2b = fig2.add_axes([0.83, 0.15, 0.05, 0.8]) + >>> norm = mpl.colors.Normalize(vmin=np.min(m), vmax=np.max(m)) + >>> cbar = mpl.colorbar.ColorbarBase(ax2b, norm=norm, orientation="vertical") + + """ + + def __init__(self, mesh, **kwargs): + assert isinstance( + mesh, (TensorMesh, CylindricalMesh) + ), "Only implemented for tensor meshes" + super().__init__(mesh=mesh, **kwargs) + + @property + def nP(self): + r"""Number of parameters the mapping acts on. + + Returns + ------- + int + Number of parameters the mapping acts on. Should equal the + number of cells along the last dimension of the tensor mesh + supplied when defining the mapping. + """ + return int(self.mesh.vnC[self.mesh.dim - 1]) + + def _transform(self, m): + repNum = np.prod(self.mesh.vnC[: self.mesh.dim - 1]) + return mkvc(m).repeat(repNum) + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the model paramters. + + Let :math:`\mathbf{m}` be a set of parameter values for the 1D model + and let :math:`\mathbf{P}` be a projection matrix that maps the 1D + model the 2D/3D tensor mesh. The forward mapping :math:`\mathbf{u}(\mathbf{m})` + is given by: + + .. math:: + \mathbf{u} = \mathbf{P m}, + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{P} + + Note that in this case, **deriv** simply returns the projection matrix. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + repNum = np.prod(self.mesh.vnC[: self.mesh.dim - 1]) + repVec = sp.csr_matrix( + (np.ones(repNum), (range(repNum), np.zeros(repNum))), shape=(repNum, 1) + ) + deriv = sp.kron(sp.identity(self.nP), repVec) + if v is not None: + return deriv * v + return deriv + + +class Surject2Dto3D(IdentityMap): + r"""Map 2D tensor model to 3D tensor mesh. + + Let :math:`m` define the parameters for a 2D tensor model. + ``Surject2Dto3D`` constructs a surjective mapping that projects + the 2D tensor model to a 3D tensor mesh. + + Mathematically, the mapping :math:`\mathbf{u}(\mathbf{m})` can be + represented by a projection matrix: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + + Parameters + ---------- + mesh : discretize.TensorMesh + A 3D tensor mesh + normal : {'y', 'x', 'z'} + Define the projection axis. + + Examples + -------- + Here we project a 3 layered Earth model defined on a 2D tensor mesh + to a 3D tensor mesh. We assume that at for some y-location, we + have a 2D tensor model which defines the physical property distribution + as a function of the *x* and *z* location. Using ``Surject2Dto3D``, + we project the model along the y-axis to obtain a 3D distribution + for the physical property (i.e. a 3D tensor model). + + >>> from simpeg.maps import Surject2Dto3D + >>> from discretize import TensorMesh + >>> import numpy as np + >>> import matplotlib as mpl + >>> import matplotlib.pyplot as plt + + >>> dh = np.ones(20) + >>> mesh2D = TensorMesh([dh, dh], 'CC') + >>> mesh3D = TensorMesh([dh, dh, dh], 'CCC') + + Here, we define the 2D tensor model. + + >>> m = np.zeros(mesh2D.nC) + >>> m[mesh2D.cell_centers[:, 1] < 0] = 10. + >>> m[mesh2D.cell_centers[:, 1] < -5] = 5. + + We then plot the 2D tensor model; which is defined along the + x and z axes. + + >>> fig1 = plt.figure(figsize=(6, 5)) + >>> ax11 = fig1.add_axes([0.1, 0.15, 0.7, 0.8]) + >>> mesh2D.plot_image(m, ax=ax11, grid=True) + >>> ax11.set_ylabel('z') + >>> ax11.set_title('2D Tensor Model') + >>> ax12 = fig1.add_axes([0.83, 0.15, 0.05, 0.8]) + >>> norm1 = mpl.colors.Normalize(vmin=np.min(m), vmax=np.max(m)) + >>> cbar1 = mpl.colorbar.ColorbarBase(ax12, norm=norm1, orientation="vertical") + + By setting *normal = 'Y'* we are projecting along the y-axis. + + >>> mapping = Surject2Dto3D(mesh3D, normal='Y') + >>> u = mapping * m + + Finally we plot a slice of the resulting 3D tensor model. + + >>> fig2 = plt.figure(figsize=(6, 5)) + >>> ax21 = fig2.add_axes([0.1, 0.15, 0.7, 0.8]) + >>> mesh3D.plot_slice(u, ax=ax21, ind=10, normal='Y', grid=True) + >>> ax21.set_ylabel('z') + >>> ax21.set_title('Projected to 3D Mesh (y=0)') + >>> ax22 = fig2.add_axes([0.83, 0.15, 0.05, 0.8]) + >>> norm2 = mpl.colors.Normalize(vmin=np.min(m), vmax=np.max(m)) + >>> cbar2 = mpl.colorbar.ColorbarBase(ax22, norm=norm2, orientation="vertical") + + """ + + def __init__(self, mesh, normal="y", **kwargs): + self.normal = normal + super().__init__(mesh=mesh, **kwargs) + + @IdentityMap.mesh.setter + def mesh(self, value): + value = validate_type("mesh", value, discretize.TensorMesh, cast=False) + if value.dim != 3: + raise ValueError("Surject2Dto3D Only works for a 3D Mesh") + self._mesh = value + + @property + def normal(self): + """The projection axis. + + Returns + ------- + str + """ + return self._normal + + @normal.setter + def normal(self, value): + self._normal = validate_string("normal", value, ("x", "y", "z")) + + @property + def nP(self): + """Number of model properties. + + The number of cells in the + last dimension of the mesh.""" + if self.normal == "z": + return self.mesh.shape_cells[0] * self.mesh.shape_cells[1] + elif self.normal == "y": + return self.mesh.shape_cells[0] * self.mesh.shape_cells[2] + elif self.normal == "x": + return self.mesh.shape_cells[1] * self.mesh.shape_cells[2] + + def _transform(self, m): + m = mkvc(m) + if self.normal == "z": + return mkvc( + m.reshape(self.mesh.vnC[:2], order="F")[:, :, np.newaxis].repeat( + self.mesh.shape_cells[2], axis=2 + ) + ) + elif self.normal == "y": + return mkvc( + m.reshape(self.mesh.vnC[::2], order="F")[:, np.newaxis, :].repeat( + self.mesh.shape_cells[1], axis=1 + ) + ) + elif self.normal == "x": + return mkvc( + m.reshape(self.mesh.vnC[1:], order="F")[np.newaxis, :, :].repeat( + self.mesh.shape_cells[0], axis=0 + ) + ) + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the model paramters. + + Let :math:`\mathbf{m}` be a set of parameter values for the 2D tensor model + and let :math:`\mathbf{P}` be a projection matrix that maps the 2D tensor model + to the 3D tensor mesh. The forward mapping :math:`\mathbf{u}(\mathbf{m})` + is given by: + + .. math:: + \mathbf{u} = \mathbf{P m}, + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{P} + + Note that in this case, **deriv** simply returns the projection matrix. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. If the + input argument *v* is not ``None``, the method returns the derivative times + the vector *v*. + """ + inds = self * np.arange(self.nP) + nC, nP = self.mesh.nC, self.nP + P = sp.csr_matrix((np.ones(nC), (range(nC), inds)), shape=(nC, nP)) + if v is not None: + return P * v + return P + + +class SurjectUnits(IdentityMap): + r"""Surjective mapping to all mesh cells. + + Let :math:`\mathbf{m}` be a model that contains a physical property value + for *nP* geological units. ``SurjectUnits`` is used to construct a surjective + mapping that projects :math:`\mathbf{m}` to the set of voxel cells defining a mesh. + As a result, the mapping :math:`\mathbf{u(\mathbf{m})}` is defined as + a projection matrix :math:`\mathbf{P}` acting on the model. Thus: + + .. math:: + \mathbf{u}(\mathbf{m}) = \mathbf{Pm} + + + The mapping therefore has dimensions (*mesh.nC*, *nP*). + + Parameters + ---------- + indices : (nP) list of (mesh.nC) numpy.ndarray + Each entry in the :class:`list` is a boolean :class:`numpy.ndarray` of length + *mesh.nC* that assigns the corresponding physical property value to the + appropriate mesh cells. + + Examples + -------- + For this example, we have a model that defines the property values + for two units. Using ``SurjectUnit``, we construct the mapping from + the model to a 1D mesh where the 1st unit's value is assigned to + all cells whose centers are located at *x < 0* and the 2nd unit's value + is assigned to all cells whose centers are located at *x > 0*. + + >>> from simpeg.maps import SurjectUnits + >>> from discretize import TensorMesh + >>> import numpy as np + + >>> nP = 8 + >>> mesh = TensorMesh([np.ones(nP)], 'C') + >>> unit_1_ind = mesh.cell_centers < 0 + + >>> indices_list = [unit_1_ind, ~unit_1_ind] + >>> mapping = SurjectUnits(indices_list, nP=nP) + + >>> m = np.r_[0.01, 0.05] + >>> mapping * m + array([0.01, 0.01, 0.01, 0.01, 0.05, 0.05, 0.05, 0.05]) + + """ + + def __init__(self, indices, **kwargs): + super().__init__(**kwargs) + self.indices = indices + + @property + def indices(self): + """List assigning a given physical property to specific model cells. + + Each entry in the :class:`list` is a boolean :class:`numpy.ndarray` of length + *mesh.nC* that assigns the corresponding physical property value to the + appropriate mesh cells. + + Returns + ------- + (nP) list of (mesh.n_cells) numpy.ndarray + """ + return self._indices + + @indices.setter + def indices(self, values): + values = validate_type("indices", values, list) + mesh = self.mesh + last_shape = None + for i in range(len(values)): + if mesh is not None: + values[i] = validate_active_indices( + "indices", values[i], self.mesh.n_cells + ) + else: + values[i] = validate_ndarray_with_shape( + "indices", values[i], shape=("*",), dtype=int + ) + if last_shape is not None and last_shape != values[i].shape: + raise ValueError("all indicies must have the same shape.") + last_shape = values[i].shape + self._indices = values + + @property + def P(self): + """ + Projection matrix from model parameters to mesh cells. + """ + if getattr(self, "_P", None) is None: + # sparse projection matrix + row = [] + col = [] + val = [] + for ii, ind in enumerate(self.indices): + col += [ii] * ind.sum() + row += np.where(ind)[0].tolist() + val += [1] * ind.sum() + + self._P = sp.csr_matrix( + (val, (row, col)), shape=(len(self.indices[0]), self.nP) + ) + + # self._P = sp.block_diag([P for ii in range(self.nBlock)]) + + return self._P + + def _transform(self, m): + return self.P * m + + @property + def nP(self): + r"""Number of parameters the mapping acts on. + + Returns + ------- + int + Number of parameters that the mapping acts on. + """ + return len(self.indices) + + @property + def shape(self): + """Dimensions of the mapping + + Returns + ------- + tuple + Dimensions of the mapping. Where *nP* is the number of parameters the + mapping acts on and *mesh.nC* is the number of cells the corresponding + mesh, the return is a tuple of the form (*mesh.nC*, *nP*). + """ + # return self.n_block*len(self.indices[0]), self.n_block*len(self.indices) + return (len(self.indices[0]), self.nP) + + def deriv(self, m, v=None): + r"""Derivative of the mapping with respect to the input parameters. + + Let :math:`\mathbf{m}` be a set of model parameters. The surjective mapping + can be defined as a sparse projection matrix :math:`\mathbf{P}`. Therefore + we can define the surjective mapping acting on the model parameters as: + + .. math:: + \mathbf{u} = \mathbf{P m}, + + the **deriv** method returns the derivative of :math:`\mathbf{u}` with respect + to the model parameters; i.e.: + + .. math:: + \frac{\partial \mathbf{u}}{\partial \mathbf{m}} = \mathbf{P} + + Note that in this case, **deriv** simply returns a sparse projection matrix. + + Parameters + ---------- + m : (nP) numpy.ndarray + A vector representing a set of model parameters + v : (nP) numpy.ndarray + If not ``None``, the method returns the derivative times the vector *v* + + Returns + ------- + scipy.sparse.csr_matrix + Derivative of the mapping with respect to the model parameters. + If the input argument *v* is not ``None``, the method returns + the derivative times the vector *v*. + """ + + if v is not None: + return self.P * v + return self.P diff --git a/simpeg/meta/dask_sim.py b/simpeg/meta/dask_sim.py index df3a714db1..3cd456fd54 100644 --- a/simpeg/meta/dask_sim.py +++ b/simpeg/meta/dask_sim.py @@ -15,6 +15,18 @@ from operator import add import warnings +from dask.base import normalize_token + + +@normalize_token.register(IdentityMap) +def _normalize_map(mapping): + return mapping._uuid.hex + + +@normalize_token.register(BaseSimulation) +def _normalize_simulation(sim): + return sim._uuid.hex + def _store_model(mapping, sim, model): sim.model = mapping * model @@ -61,13 +73,17 @@ def _get_jtj_diag(mapping, sim, model, field, w, apply_map=False): return np.asarray((sim_jtj @ m_deriv).power(2).sum(axis=0)).flatten() -def _reduce(client, operation, items): +def _reduce(client, operation, items, workers): + # first sort by workers so items on the same workers are mapped together. + items = [val for (_, val) in sorted(zip(workers, items), key=lambda x: x[0])] while len(items) > 1: - new_reduce = client.map(operation, items[::2], items[1::2]) + new_reduce = client.map(operation, items[::2], items[1::2], pure=False) if len(items) % 2 == 1: - new_reduce[-1] = client.submit(operation, new_reduce[-1], items[-1]) + new_reduce[-1] = client.submit( + operation, new_reduce[-1], items[-1], pure=False + ) items = new_reduce - return client.gather(items[0]) + return items[0].result() def _validate_type_or_future_of_type( @@ -87,9 +103,11 @@ def _validate_type_or_future_of_type( if workers is None: objects = client.scatter(objects) else: + # If workers are already set, move the object to the respective worker. tmp = [] for obj, worker in zip(objects, workers): - tmp.append(client.scatter([obj], workers=worker)[0]) + future = client.scatter(obj, workers=worker) + tmp.append(future) objects = tmp except TypeError: pass @@ -102,14 +120,43 @@ def _validate_type_or_future_of_type( # Figure out where everything lives who = client.who_has(objects) if workers is None: - workers = [] + # Because we only ever want to allow execution on a single consistent + # worker for each simulation-mapping pair, we need to do a bit of sanity + # checking to choose which worker if the object exists on multiple + # workers. + + # find out how objects have been assigned to each worker. + workers_assign_count = {} for obj in objects: - workers.append(who[obj.key]) + workers = who[obj.key] + for worker in workers: + workers_assign_count[worker] = workers_assign_count.get(worker, 0) + 1 + + # then loop through and if they exist on multiple workers, + # choose the worker with the fewest assignments. + # then decrement any other workers + worker_assignments = [] + for obj in objects: + workers = who[obj.key] + n_assigned = len(objects) + assigned = None + for worker in workers: + n_test = workers_assign_count[worker] + # choose the worker with the least assigned tasks: + if n_test < n_assigned: + assigned = worker + n_assigned = n_test + # discount workers who had this object but were not chosen: + for worker in workers: + if worker != assigned: + workers_assign_count[worker] -= 1 + worker_assignments.append(assigned) + workers = worker_assignments else: # Issue a warning if the future is not on the expected worker for i, (obj, worker) in enumerate(zip(objects, workers)): - obj_owner = client.who_has(obj)[obj.key] - if obj_owner != worker: + obj_owners = client.who_has(obj)[obj.key] + if worker not in obj_owners: warnings.warn( f"{property_name} {i} is not on the expected worker.", stacklevel=2 ) @@ -119,7 +166,9 @@ def _validate_type_or_future_of_type( futures = [] for obj, worker in zip(objects, workers): futures.append( - client.submit(lambda v: not isinstance(v, obj_type), obj, workers=worker) + client.submit( + lambda v: not isinstance(v, obj_type), obj, workers=worker, pure=False + ) ) is_not_obj = np.array(client.gather(futures)) if np.any(is_not_obj): @@ -154,7 +203,7 @@ class DaskMetaSimulation(MetaSimulation): The dask client to use for communication. """ - clean_on_model_update = ["_jtjdiag", "_stashed_fields"] + _delete_on_model_update = ["_jtjdiag", "_stashed_fields"] def __init__(self, simulations, mappings, client): self._client = validate_type("client", client, Client, cast=False) @@ -166,7 +215,9 @@ def _make_survey(self): vnD = [] client = self.client for sim, worker in zip(self.simulations, self._workers): - vnD.append(client.submit(lambda s: s.survey.nD, sim, workers=worker)) + vnD.append( + client.submit(lambda s: s.survey.nD, sim, workers=worker, pure=False) + ) vnD = client.gather(vnD) survey._vnD = vnD return survey @@ -222,7 +273,9 @@ def mappings(self, value): ) # validate mapping shapes and simulation shapes - model_len = client.submit(lambda v: v.shape[1], mappings[0]).result() + model_len = client.submit( + lambda v: v.shape[1], mappings[0], pure=False + ).result() def check_mapping(mapping, sim, model_len): if mapping.shape[1] != model_len: @@ -244,10 +297,12 @@ def check_mapping(mapping, sim, model_len): error_checks = [] for mapping, sim, worker in zip(mappings, self.simulations, workers): - # if it was a repeat sim, this should cause the simulation to be transfered - # to each worker. + # if it was a repeat sim, this should cause the simulation to be transferred + # to each worker if it was originally passed as a future. error_checks.append( - client.submit(check_mapping, mapping, sim, model_len, workers=worker) + client.submit( + check_mapping, mapping, sim, model_len, workers=worker, pure=False + ) ) error_checks = np.asarray(client.gather(error_checks)) @@ -274,6 +329,7 @@ def _model_map(self): lambda v: v.shape[1], self.mappings[0], workers=self._workers[0], + pure=False, ) n_m = client.gather(n_m) self.__model_map = IdentityMap(nP=n_m) @@ -299,7 +355,7 @@ def model(self, value): # Only send the model to the internal simulations if it was updated. if updated: client = self.client - [self._m_as_future] = client.scatter([self._model], broadcast=True) + self._m_as_future = client.scatter(self._model, broadcast=True, hash=False) if not self._repeat_sim: futures = [] for mapping, sim, worker in zip( @@ -312,6 +368,7 @@ def model(self, value): sim, self._m_as_future, workers=worker, + pure=False, ) ) self.client.gather( @@ -335,6 +392,7 @@ def fields(self, m): m_future, self._repeat_sim, workers=worker, + pure=False, ) ) self._stashed_fields = f @@ -360,6 +418,7 @@ def dpred(self, m=None, f=None): field, self._repeat_sim, workers=worker, + pure=False, ) ) return np.concatenate(client.gather(dpred)) @@ -370,7 +429,7 @@ def Jvec(self, m, v, f=None): if f is None: f = self.fields(m) client = self.client - [v_future] = client.scatter([v], broadcast=True) + v_future = client.scatter(v, broadcast=True, hash=False) j_vec = [] for mapping, sim, worker, field in zip( self.mappings, self.simulations, self._workers, f @@ -385,6 +444,7 @@ def Jvec(self, m, v, f=None): v_future, self._repeat_sim, workers=worker, + pure=False, ) ) return np.concatenate(self.client.gather(j_vec)) @@ -409,11 +469,12 @@ def Jtvec(self, m, v, f=None): v[self._data_offsets[i] : self._data_offsets[i + 1]], self._repeat_sim, workers=worker, + pure=False, ) ) # Do the sum by a reduction operation to avoid gathering a vector # of size n_simulations by n_model parameters on the head. - return _reduce(client, add, jt_vec) + return _reduce(client, add, jt_vec, workers=self._workers) def getJtJdiag(self, m, W=None, f=None): self.model = m @@ -441,9 +502,10 @@ def getJtJdiag(self, m, W=None, f=None): sim_w, self._repeat_sim, workers=worker, + pure=False, ) ) - self._jtjdiag = _reduce(client, add, jtj_diag) + self._jtjdiag = _reduce(client, add, jtj_diag, workers=self._workers) return self._jtjdiag @@ -472,7 +534,9 @@ def __init__(self, simulations, mappings, client): def _make_survey(self): survey = BaseSurvey([]) client = self.client - n_d = client.submit(lambda s: s.survey.nD, self.simulations[0]).result() + n_d = client.submit( + lambda s: s.survey.nD, self.simulations[0], pure=False + ).result() survey._vnD = [ n_d, ] @@ -484,11 +548,15 @@ def simulations(self, value): simulations, workers = _validate_type_or_future_of_type( "simulations", value, BaseSimulation, client, return_workers=True ) - n_d = client.submit(lambda s: s.survey.nD, simulations[0], workers=workers[0]) + n_d = client.submit( + lambda s: s.survey.nD, simulations[0], workers=workers[0], pure=False + ) sim_check = [] for sim, worker in zip(simulations, workers): sim_check.append( - client.submit(lambda s, n: s.survey.nD != n, sim, n_d, workers=worker) + client.submit( + lambda s, n: s.survey.nD != n, sim, n_d, workers=worker, pure=False + ) ) if np.any(client.gather(sim_check)): raise ValueError("All simulations must have the same number of data.") @@ -504,16 +572,18 @@ def dpred(self, m=None, f=None): dpred = [] for sim, worker, field in zip(self.simulations, self._workers, f): dpred.append( - client.submit(_calc_dpred, None, sim, None, field, workers=worker) + client.submit( + _calc_dpred, None, sim, None, field, workers=worker, pure=False + ) ) - return _reduce(client, add, dpred) + return _reduce(client, add, dpred, workers=self._workers) def Jvec(self, m, v, f=None): self.model = m if f is None: f = self.fields(m) client = self.client - [v_future] = client.scatter([v], broadcast=True) + v_future = client.scatter(v, broadcast=True, hash=False) j_vec = [] for mapping, sim, worker, field in zip( self.mappings, self._simulations, self._workers, f @@ -527,9 +597,10 @@ def Jvec(self, m, v, f=None): field, v_future, workers=worker, + pure=False, ) ) - return _reduce(client, add, j_vec) + return _reduce(client, add, j_vec, workers=self._workers) def Jtvec(self, m, v, f=None): self.model = m @@ -549,11 +620,12 @@ def Jtvec(self, m, v, f=None): field, v, workers=worker, + pure=False, ) ) # Do the sum by a reduction operation to avoid gathering a vector # of size n_simulations by n_model parameters on the head. - return _reduce(client, add, jt_vec) + return _reduce(client, add, jt_vec, workers=self._workers) def getJtJdiag(self, m, W=None, f=None): self.model = m @@ -578,9 +650,10 @@ def getJtJdiag(self, m, W=None, f=None): field, W, workers=worker, + pure=False, ) ) - self._jtjdiag = _reduce(client, add, jtj_diag) + self._jtjdiag = _reduce(client, add, jtj_diag, workers=self._workers) return self._jtjdiag @@ -618,7 +691,9 @@ def __init__(self, simulation, mappings, client): def _make_survey(self): survey = BaseSurvey([]) - nD = self.client.submit(lambda s: s.survey.nD, self.simulation).result() + nD = self.client.submit( + lambda s: s.survey.nD, self.simulation, pure=False + ).result() survey._vnD = len(self.mappings) * [nD] return survey @@ -641,12 +716,12 @@ def simulation(self, value): client = self.client if isinstance(value, BaseSimulation): # Scatter sim to every client - [ - value, - ] = client.scatter([value], broadcast=True) + value = client.scatter(value, broadcast=True) if not ( isinstance(value, Future) - and client.submit(lambda s: isinstance(s, BaseSimulation), value).result() + and client.submit( + lambda s: isinstance(s, BaseSimulation), value, pure=False + ).result() ): raise TypeError( "simulation must be an instance of BaseSimulation or a Future that returns" diff --git a/simpeg/meta/multiprocessing.py b/simpeg/meta/multiprocessing.py index f5aceceda6..05edf03469 100644 --- a/simpeg/meta/multiprocessing.py +++ b/simpeg/meta/multiprocessing.py @@ -8,10 +8,9 @@ class SimpleFuture: """Represents an object stored on a seperate simulation process.""" - def __init__(self, item_id, t_queue, r_queue): + def __init__(self, item_id, sim_process): self.item_id = item_id - self.t_queue = t_queue - self.r_queue = r_queue + self.sim_process = sim_process # This doesn't quite work well yet, # Due to the fact that some fields objects from the PDE @@ -25,13 +24,8 @@ def __init__(self, item_id, t_queue, r_queue): # return item def __del__(self): - # Tell the child process that this object is no longer needed in its cache. - try: - self.t_queue.put(("del_item", (self.item_id,))) - except ValueError: - # if the queue was already closed it will throw a value error - # so catch it here gracefully and continue on. - pass + if self.sim_process.is_alive(): + self.sim_process.task_queue.put(("del_item", (self.item_id,))) class _SimulationProcess(Process): @@ -124,7 +118,7 @@ def set_sim(self, sim): self._check_closed() self.task_queue.put(("set_sim", (sim,))) key = self.result_queue.get() - future = SimpleFuture(key, self.task_queue, self.result_queue) + future = SimpleFuture(key, self) self._my_sim = future return future @@ -138,7 +132,7 @@ def get_fields(self): sim = self._my_sim self.task_queue.put((1, (sim.item_id,))) key = self.result_queue.get() - future = SimpleFuture(key, self.task_queue, self.result_queue) + future = SimpleFuture(key, self) return future def start_dpred(self, f_future): @@ -227,12 +221,6 @@ class MultiprocessingMetaSimulation(MetaSimulation): to `multiprocessing.cpu_count()`. The number of processes spawned will be the minimum of this number and the number of simulations. - Notes - ----- - On Unix systems with python version 3.8 the default `fork` method of starting the - processes has lead to program stalls in certain cases. If you encounter this - try setting the start method to `spawn'. - >>> import multiprocessing as mp >>> mp.set_start_method("spawn") """ diff --git a/simpeg/meta/simulation.py b/simpeg/meta/simulation.py index 5ede0799c5..2649c0e39f 100644 --- a/simpeg/meta/simulation.py +++ b/simpeg/meta/simulation.py @@ -323,8 +323,8 @@ def getJtJdiag(self, m, W=None, f=None): return self._jtjdiag @property - def deleteTheseOnModelUpdate(self): - return super().deleteTheseOnModelUpdate + ["_jtjdiag"] + def _delete_on_model_update(self): + return super()._delete_on_model_update + ["_jtjdiag"] class SumMetaSimulation(MetaSimulation): diff --git a/simpeg/objective_function.py b/simpeg/objective_function.py index e28bec0c90..f5afd55bc8 100644 --- a/simpeg/objective_function.py +++ b/simpeg/objective_function.py @@ -1,5 +1,3 @@ -from __future__ import annotations - import numbers import numpy as np import scipy.sparse as sp @@ -204,12 +202,17 @@ def _test_deriv( **kwargs, ): print("Testing {0!s} Deriv".format(self.__class__.__name__)) + rng = np.random.default_rng(seed=random_seed) if x is None: - rng = np.random.default_rng(seed=random_seed) n_params = rng.integers(low=100, high=1_000) if self.nP == "*" else self.nP x = rng.standard_normal(size=n_params) return check_derivative( - lambda m: [self(m), self.deriv(m)], x, num=num, plotIt=plotIt, **kwargs + lambda m: [self(m), self.deriv(m)], + x, + num=num, + plotIt=plotIt, + random_seed=rng, + **kwargs, ) def _test_deriv2( @@ -234,6 +237,7 @@ def _test_deriv2( num=num, expectedOrder=expectedOrder, plotIt=plotIt, + random_seed=rng, **kwargs, ) diff --git a/simpeg/optimization.py b/simpeg/optimization.py index 3009387844..f7b47e70d5 100644 --- a/simpeg/optimization.py +++ b/simpeg/optimization.py @@ -1,7 +1,8 @@ import numpy as np +import scipy import scipy.sparse as sp -from .utils.solver_utils import SolverWrapI, Solver, SolverDiag +from pymatsolver import Solver, Diagonal, SolverCG from .utils import ( call_hooks, check_stoppers, @@ -17,6 +18,23 @@ norm = np.linalg.norm +# Create a flag if the installed version of SciPy is newer or equal to 1.12.0 +# (Used to choose whether to pass `tol` or `rtol` to the solvers. See #1516). +class Version: + def __init__(self, version): + self.version = version + + def as_tuple(self) -> tuple[int, int]: + major, minor = tuple(int(p) for p in self.version.split(".")[:2]) + return (major, minor) + + def __ge__(self, other): + return self.as_tuple() >= other.as_tuple() + + +SCIPY_1_12 = Version(scipy.__version__) >= Version("1.12.0") + + __all__ = [ "Minimize", "Remember", @@ -30,8 +48,6 @@ "IterationPrinters", ] -SolverICG = SolverWrapI(sp.linalg.cg, checkAccuracy=False) - class StoppingCriteria(object): """docstring for StoppingCriteria""" @@ -189,38 +205,38 @@ class IterationPrinters(object): } phi_d = { "title": "phi_d", - "value": lambda M: M.parent.phi_d * M.parent.opt.factor, + "value": lambda M: M.parent.phi_d, "width": 10, "format": "%1.2e", } phi_m = { "title": "phi_m", - "value": lambda M: M.parent.phi_m * M.parent.opt.factor, + "value": lambda M: M.parent.phi_m, "width": 10, "format": "%1.2e", } phi_s = { "title": "phi_s", - "value": lambda M: M.parent.phi_s * M.parent.opt.factor, + "value": lambda M: M.parent.phi_s, "width": 10, "format": "%1.2e", } phi_x = { "title": "phi_x", - "value": lambda M: M.parent.phi_x * M.parent.opt.factor, + "value": lambda M: M.parent.phi_x, "width": 10, "format": "%1.2e", } phi_y = { "title": "phi_y", - "value": lambda M: M.parent.phi_y * M.parent.opt.factor, + "value": lambda M: M.parent.phi_y, "width": 10, "format": "%1.2e", } phi_z = { "title": "phi_z", - "value": lambda M: M.parent.phi_z * M.parent.opt.factor, + "value": lambda M: M.parent.phi_z, "width": 10, "format": "%1.2e", } @@ -266,7 +282,6 @@ class Minimize(object): parent = None #: This is the parent of the optimization routine. print_type = None - factor = 1.0 def __init__(self, **kwargs): set_kwargs(self, **kwargs) @@ -287,7 +302,6 @@ def __init__(self, **kwargs): ] if self.print_type == "ubc": - self.factor = 2.0 self.stoppers = [StoppingCriteria.iteration] self.printers = [ IterationPrinters.iteration, @@ -893,9 +907,12 @@ def reduceHess(v): operator = sp.linalg.LinearOperator( (shape[1], shape[1]), reduceHess, dtype=self.xc.dtype ) - p, info = sp.linalg.cg( - operator, -Z.T * self.g, tol=self.tolCG, maxiter=self.maxIterCG - ) + + # Choose `rtol` or `tol` argument based on installed scipy version + tol_key = "rtol" if SCIPY_1_12 else "tol" + + inp = {tol_key: self.tolCG, "maxiter": self.maxIterCG} + p, info = sp.linalg.cg(operator, -Z.T * self.g, **inp) p = Z * p # bring up to full size # aSet_after = self.activeSet(self.xc+p) return p @@ -951,10 +968,10 @@ def bfgsH0(self): if getattr(self, "_bfgsH0", None) is None: print( """ - Default solver: SolverDiag is being used in bfgsH0 + Default solver: Diagonal is being used in bfgsH0 """ ) - self._bfgsH0 = SolverDiag(sp.identity(self.xc.size)) + self._bfgsH0 = Diagonal(sp.identity(self.xc.size)) return self._bfgsH0 @bfgsH0.setter @@ -1070,9 +1087,10 @@ def approxHinv(self, value): @timeIt def findSearchDirection(self): - Hinv = SolverICG( - self.H, M=self.approxHinv, tol=self.tolCG, maxiter=self.maxIterCG - ) + # Choose `rtol` or `tol` argument based on installed scipy version + tol_key = "rtol" if SCIPY_1_12 else "tol" + inp = {tol_key: self.tolCG, "maxiter": self.maxIterCG} + Hinv = SolverCG(self.H, M=self.approxHinv, **inp) p = Hinv * (-self.g) return p diff --git a/simpeg/potential_fields/_numba_utils.py b/simpeg/potential_fields/_numba_utils.py index 2bdea6da2a..331cbb9e9d 100644 --- a/simpeg/potential_fields/_numba_utils.py +++ b/simpeg/potential_fields/_numba_utils.py @@ -5,6 +5,8 @@ magnetic simulations. """ +import numpy as np + try: from numba import jit except ImportError: @@ -41,3 +43,109 @@ def kernels_in_nodes_to_cell(kernels, nodes_indices): + kernels[nodes_indices[7]] ) return result + + +@jit(nopython=True) +def evaluate_kernels_on_cell( + easting, + northing, + upward, + prism_west, + prism_east, + prism_south, + prism_north, + prism_bottom, + prism_top, + kernel_x, + kernel_y, + kernel_z, +): + r""" + Evaluate three kernel functions on every shifted vertex of a prism. + + .. note:: + + This function was inspired in the ``_evaluate_kernel`` function in + Choclo (released under BSD 3-clause Licence): + https://www.fatiando.org/choclo + + Parameters + ---------- + easting, northing, upward : float + Easting, northing and upward coordinates of the observation point. Must + be in meters. + prism_west, prism_east : floats + The West and East boundaries of the prism. Must be in meters. + prism_south, prism_north : floats + The South and North boundaries of the prism. Must be in meters. + prism_bottom, prism_top : floats + The bottom and top boundaries of the prism. Must be in meters. + kernel_x, kernel_y, kernel_z : callable + Kernel functions that will be evaluated on each one of the shifted + vertices of the prism. + + Returns + ------- + result_x, result_y, result_z : floats + Evaluation of the kernel functions on each one of the vertices of the + prism. + + Notes + ----- + This function evaluates each numerical kernel :math:`k(x, y, z)` on each one + of the vertices of the prism: + + .. math:: + + v(\mathbf{p}) = + \Bigg\lvert \Bigg\lvert \Bigg\lvert + k(x, y, z) + \Bigg\rvert_{X_1}^{X_2} + \Bigg\rvert_{Y_1}^{Y_2} + \Bigg\rvert_{Z_1}^{Z_2} + + where :math:`X_1`, :math:`X_2`, :math:`Y_1`, :math:`Y_2`, :math:`Z_1` and + :math:`Z_2` are boundaries of the rectangular prism in the *shifted + coordinates* defined by the Cartesian coordinate system with its origin + located on the observation point :math:`\mathbf{p}`. + """ + # Initialize result floats to zero + result_x, result_y, result_z = 0, 0, 0 + # Iterate over the vertices of the prism + for i in range(2): + # Compute shifted easting coordinate + if i == 0: + shift_east = prism_east - easting + else: + shift_east = prism_west - easting + shift_east_sq = shift_east**2 + for j in range(2): + # Compute shifted northing coordinate + if j == 0: + shift_north = prism_north - northing + else: + shift_north = prism_south - northing + shift_north_sq = shift_north**2 + for k in range(2): + # Compute shifted upward coordinate + if k == 0: + shift_upward = prism_top - upward + else: + shift_upward = prism_bottom - upward + shift_upward_sq = shift_upward**2 + # Compute the radius + radius = np.sqrt(shift_east_sq + shift_north_sq + shift_upward_sq) + # If i, j or k is 1, the corresponding shifted + # coordinate will refer to the lower boundary, + # meaning the corresponding term should have a minus + # sign. + result_x += (-1) ** (i + j + k) * kernel_x( + shift_east, shift_north, shift_upward, radius + ) + result_y += (-1) ** (i + j + k) * kernel_y( + shift_east, shift_north, shift_upward, radius + ) + result_z += (-1) ** (i + j + k) * kernel_z( + shift_east, shift_north, shift_upward, radius + ) + return result_x, result_y, result_z diff --git a/simpeg/potential_fields/base.py b/simpeg/potential_fields/base.py index c6da7258d0..aaeb6061fa 100644 --- a/simpeg/potential_fields/base.py +++ b/simpeg/potential_fields/base.py @@ -1,14 +1,17 @@ import os +import warnings from multiprocessing.pool import Pool import discretize import numpy as np +from discretize import TensorMesh, TreeMesh from scipy.sparse import csr_matrix as csr from simpeg.utils import mkvc from ..simulation import LinearSimulation from ..utils import validate_active_indices, validate_integer, validate_string +from ..utils.code_utils import deprecate_property, validate_type try: import choclo @@ -40,7 +43,7 @@ class BasePFSimulation(LinearSimulation): ---------- mesh : discretize.TensorMesh or discretize.TreeMesh A 3D tensor or tree mesh. - ind_active : np.ndarray of int or bool + active_cells : np.ndarray of int or bool Indices array denoting the active topography cells. n_processes : None or int, optional The number of processes to use in the internal multiprocessing pool for forward @@ -53,6 +56,12 @@ class BasePFSimulation(LinearSimulation): If True, the simulation will run in parallel. If False, it will run in serial. If ``engine`` is not ``"choclo"`` this argument will be ignored. + ind_active : np.ndarray of int or bool + + .. deprecated:: 0.23.0 + + Argument ``ind_active`` is deprecated in favor of + ``active_cells`` and will be removed in SimPEG v0.24.0. Notes ----- @@ -74,46 +83,58 @@ class BasePFSimulation(LinearSimulation): def __init__( self, mesh, - ind_active=None, + active_cells=None, + store_sensitivities="ram", n_processes=1, sensitivity_dtype=np.float32, engine="geoana", numba_parallel=True, + ind_active=None, **kwargs, ): - # If deprecated property set with kwargs - if "actInd" in kwargs: - raise AttributeError( - "actInd was removed in SimPEG 0.17.0, please use ind_active" + # Deprecate ind_active argument + if ind_active is not None: + if active_cells is not None: + raise TypeError( + "Cannot pass both 'active_cells' and 'ind_active'." + "'ind_active' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + ) + warnings.warn( + "'ind_active' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'active_cells' instead.", + FutureWarning, + stacklevel=2, ) + active_cells = ind_active if "forwardOnly" in kwargs: raise AttributeError( "forwardOnly was removed in SimPEG 0.17.0, please set store_sensitivities=None" ) + self.mesh = mesh + self.store_sensitivities = store_sensitivities self.sensitivity_dtype = sensitivity_dtype self.engine = engine self.numba_parallel = numba_parallel - super().__init__(mesh, **kwargs) + super().__init__(**kwargs) - self.solver = None self.n_processes = n_processes # Check sensitivity_path when engine is "choclo" self._check_engine_and_sensitivity_path() - # Check dimensions of the mesh when engine is "choclo" - self._check_engine_and_mesh_dimensions() - # Find non-zero cells indices - if ind_active is None: - ind_active = np.ones(mesh.n_cells, dtype=bool) + if active_cells is None: + active_cells = np.ones(mesh.n_cells, dtype=bool) else: - ind_active = validate_active_indices("ind_active", ind_active, mesh.n_cells) - self._ind_active = ind_active + active_cells = validate_active_indices( + "active_cells", active_cells, mesh.n_cells + ) + self._active_cells = active_cells - self.nC = int(sum(ind_active)) + self.nC = int(sum(active_cells)) if isinstance(mesh, discretize.TensorMesh): nodes = mesh.nodes @@ -136,16 +157,61 @@ def __init__( inds[:-1, 1:, 1:].reshape(-1, order="F"), inds[1:, 1:, 1:].reshape(-1, order="F"), ] - cell_nodes = np.stack(cell_nodes, axis=-1)[ind_active] + cell_nodes = np.stack(cell_nodes, axis=-1)[active_cells] elif isinstance(mesh, discretize.TreeMesh): nodes = np.r_[mesh.nodes, mesh.hanging_nodes] - cell_nodes = mesh.cell_nodes[ind_active] + cell_nodes = mesh.cell_nodes[active_cells] else: raise ValueError("Mesh must be 3D tensor or Octree.") unique, unique_inv = np.unique(cell_nodes.T, return_inverse=True) self._nodes = nodes[unique] # unique active nodes self._unique_inv = unique_inv.reshape(cell_nodes.T.shape) + @property + def mesh(self): + """Mesh for the integral potential field simulations. + + Returns + ------- + discretize.TensorMesh or discretize.TreeMesh + 3D Mesh on which the forward problem is discretized. + """ + return self._mesh + + @mesh.setter + def mesh(self, value): + value = validate_type("mesh", value, (TensorMesh, TreeMesh), cast=False) + if value.dim != 3: + raise ValueError( + f"{type(self).__name__} mesh must be 3D, received a {value.dim}D mesh." + ) + self._mesh = value + + @property + def store_sensitivities(self): + """Options for storing sensitivities. + + There are 3 options: + + - 'ram': sensitivity matrix stored in RAM + - 'disk': sensitivities written and stored to disk + - 'forward_only': sensitivities are not store (only use for forward simulation) + + Returns + ------- + {'disk', 'ram', 'forward_only'} + A string defining the model type for the simulation. + """ + if self._store_sensitivities is None: + self._store_sensitivities = "ram" + return self._store_sensitivities + + @store_sensitivities.setter + def store_sensitivities(self, value): + self._store_sensitivities = validate_string( + "store_sensitivities", value, ["disk", "ram", "forward_only"] + ) + @property def sensitivity_dtype(self): """dtype of the sensitivity matrix. @@ -169,6 +235,11 @@ def sensitivity_dtype(self, value): @property def n_processes(self): + """ + Number of processes to use for forward modeling. + + If ``engine`` is ``"choclo"``, then this property will be ignored. + """ return self._n_processes @n_processes.setter @@ -226,15 +297,24 @@ def numba_parallel(self, value: bool): self._numba_parallel = value @property - def ind_active(self): - """Active topography cells. + def active_cells(self): + """Active cells in the mesh. Returns ------- (n_cell) numpy.ndarray of bool - Returns the active topography cells + Returns the active cells in the mesh. """ - return self._ind_active + return self._active_cells + + ind_active = deprecate_property( + active_cells, + "ind_active", + "active_cells", + removal_version="0.24.0", + future_warn=True, + error=False, + ) def linear_operator(self): """Return linear operator. @@ -309,16 +389,6 @@ def _check_engine_and_sensitivity_path(self): "should be the path to a new or existing file." ) - def _check_engine_and_mesh_dimensions(self): - """ - Check dimensions of the mesh when using choclo as engine - """ - if self.engine == "choclo" and self.mesh.dim != 3: - raise ValueError( - f"Invalid mesh with {self.mesh.dim} dimensions. " - "Only 3D meshes are supported when using 'choclo' as engine." - ) - def _get_active_nodes(self): """ Return locations of nodes only for active cells @@ -333,13 +403,13 @@ def _get_active_nodes(self): nodes = self.mesh.nodes else: raise TypeError(f"Invalid mesh of type {self.mesh.__class__.__name__}.") - # Get original cell_nodes but only for active cells + # Get original cell_nodes cell_nodes = self.mesh.cell_nodes # If all cells in the mesh are active, return nodes and cell_nodes if self.nC == self.mesh.n_cells: return nodes, cell_nodes # Keep only the cell_nodes for active cells - cell_nodes = cell_nodes[self.ind_active] + cell_nodes = cell_nodes[self.active_cells] # Get the unique indices of the nodes that belong to every active cell # (these indices correspond to the original `nodes` array) unique_nodes, active_cell_nodes = np.unique(cell_nodes, return_inverse=True) @@ -375,10 +445,7 @@ class BaseEquivalentSourceLayerSimulation(BasePFSimulation): """ def __init__(self, mesh, cell_z_top, cell_z_bottom, **kwargs): - if mesh.dim != 2: - raise AttributeError("Mesh to equivalent source layer must be 2D.") - - super().__init__(mesh, **kwargs) + super().__init__(mesh=mesh, **kwargs) if isinstance(cell_z_top, (int, float)): cell_z_top = float(cell_z_top) * np.ones(self.nC) @@ -392,6 +459,8 @@ def __init__(self, mesh, cell_z_top, cell_z_bottom, **kwargs): "cells, and match the number of active cells.", ) + self._cell_z_top, self._cell_z_bottom = cell_z_top, cell_z_bottom + all_nodes = self._nodes[self._unique_inv] all_nodes = [ np.c_[all_nodes[0], cell_z_bottom], @@ -406,6 +475,29 @@ def __init__(self, mesh, cell_z_top, cell_z_bottom, **kwargs): self._nodes = np.stack(all_nodes, axis=0) self._unique_inv = None + @property + def cell_z_top(self) -> np.ndarray: + """ + Elevations for the top face of all cells in the layer. + """ + return self._cell_z_top + + @property + def cell_z_bottom(self) -> np.ndarray: + """ + Elevations for the bottom face of all cells in the layer. + """ + return self._cell_z_bottom + + @BasePFSimulation.mesh.setter + def mesh(self, value): + value = validate_type("mesh", value, (TensorMesh, TreeMesh), cast=False) + if value.dim != 2: + raise ValueError( + f"{type(self).__name__} mesh must be 2D, received a {value.dim}D mesh." + ) + self._mesh = value + def progress(iteration, prog, final): """Progress (% complete) for constructing sensitivity matrix. @@ -454,6 +546,12 @@ def get_dist_wgt(mesh, receiver_locations, actv, R, R0): wr : (n_cell) numpy.ndarray Distance weighting model; 0 for all inactive cells """ + warnings.warn( + "The get_dist_wgt function has been deprecated, please import " + "simpeg.utils.distance_weighting. This will be removed in SimPEG 0.24.0", + FutureWarning, + stacklevel=2, + ) # Find non-zero cells if actv.dtype == "bool": inds = ( diff --git a/simpeg/potential_fields/gravity/_numba_functions.py b/simpeg/potential_fields/gravity/_numba_functions.py index 3eb6ae9bf1..fe2e69e202 100644 --- a/simpeg/potential_fields/gravity/_numba_functions.py +++ b/simpeg/potential_fields/gravity/_numba_functions.py @@ -192,8 +192,161 @@ def _evaluate_kernel( return kernel_func(dx, dy, dz, distance) +def _forward_gravity_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + densities, + fields, + forward_func, + constant_factor, +): + """ + Forward gravity fields of 2D meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_function = jit(nopython=True, parallel=True)(_forward_gravity_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + densities : (n_active_cells) numpy.ndarray + Array with densities of each active cell in the mesh. + fields : (n_receivers) numpy.ndarray + Array full of zeros where the gravity fields on each receiver will be + stored. This could be a preallocated array or a slice of it. + forward_func : callable + Forward function that will be evaluated on each node of the mesh. Choose + one of the forward functions in ``choclo.prism``. + constant_factor : float + Constant factor that will be used to multiply each element of the + ``fields`` array. + + Notes + ----- + The constant factor is applied here to each element of fields because + it's more efficient than doing it afterwards: it would require to + index the elements that corresponds to each component. + """ + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + # Forward model the gravity field of each cell on each receiver location + for i in prange(n_receivers): + for j in range(n_cells): + fields[i] += constant_factor * forward_func( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + densities[j], + ) + + +def _sensitivity_gravity_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + sensitivity_matrix, + forward_func, + constant_factor, +): + """ + Fill the sensitivity matrix + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_function = jit(nopython=True, parallel=True)(_sensitivity_gravity_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + sensitivity_matrix : (n_receivers, n_active_nodes) array + Empty 2d array where the sensitivity matrix elements will be filled. + This could be a preallocated empty array or a slice of it. + forward_func : callable + Forward function that will be evaluated on each node of the mesh. Choose + one of the forward functions in ``choclo.prism``. + constant_factor : float + Constant factor that will be used to multiply each element of the + sensitivity matrix. + + Notes + ----- + The constant factor is applied here to each row of the sensitivity matrix + because it's more efficient than doing it afterwards: it would require to + index the rows that corresponds to each component. + """ + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + # Evaluate kernel function on each node, for each receiver location + for i in prange(n_receivers): + for j in range(n_cells): + sensitivity_matrix[i, j] = constant_factor * forward_func( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + 1.0, # use unitary density to get sensitivities + ) + + # Define decorated versions of these functions _sensitivity_gravity_parallel = jit(nopython=True, parallel=True)(_sensitivity_gravity) _sensitivity_gravity_serial = jit(nopython=True, parallel=False)(_sensitivity_gravity) _forward_gravity_parallel = jit(nopython=True, parallel=True)(_forward_gravity) _forward_gravity_serial = jit(nopython=True, parallel=False)(_forward_gravity) +_forward_gravity_2d_mesh_serial = jit(nopython=True, parallel=False)( + _forward_gravity_2d_mesh +) +_forward_gravity_2d_mesh_parallel = jit(nopython=True, parallel=True)( + _forward_gravity_2d_mesh +) +_sensitivity_gravity_2d_mesh_serial = jit(nopython=True, parallel=False)( + _sensitivity_gravity_2d_mesh +) +_sensitivity_gravity_2d_mesh_parallel = jit(nopython=True, parallel=True)( + _sensitivity_gravity_2d_mesh +) diff --git a/simpeg/potential_fields/gravity/simulation.py b/simpeg/potential_fields/gravity/simulation.py index 7fcf032cd1..7c03c00319 100644 --- a/simpeg/potential_fields/gravity/simulation.py +++ b/simpeg/potential_fields/gravity/simulation.py @@ -1,3 +1,4 @@ +from __future__ import annotations import warnings import numpy as np import scipy.constants as constants @@ -16,6 +17,10 @@ _sensitivity_gravity_parallel, _forward_gravity_serial, _forward_gravity_parallel, + _forward_gravity_2d_mesh_serial, + _forward_gravity_2d_mesh_parallel, + _sensitivity_gravity_2d_mesh_serial, + _sensitivity_gravity_2d_mesh_parallel, ) if choclo is not None: @@ -30,6 +35,48 @@ def kernel_uv(easting, northing, upward, radius): ) return result + @jit(nopython=True) + def gravity_uv( + easting, + northing, + upward, + prism_west, + prism_east, + prism_south, + prism_north, + prism_bottom, + prism_top, + density, + ): + """Forward model the Guv gradiometry component.""" + result = 0.5 * ( + choclo.prism.gravity_nn( + easting, + northing, + upward, + prism_west, + prism_east, + prism_south, + prism_north, + prism_bottom, + prism_top, + density, + ) + - choclo.prism.gravity_ee( + easting, + northing, + upward, + prism_west, + prism_east, + prism_south, + prism_north, + prism_bottom, + prism_top, + density, + ) + ) + return result + CHOCLO_KERNELS = { "gx": choclo.prism.kernel_e, "gy": choclo.prism.kernel_n, @@ -43,6 +90,19 @@ def kernel_uv(easting, northing, upward, radius): "guv": kernel_uv, } + CHOCLO_FORWARD_FUNCS = { + "gx": choclo.prism.gravity_e, + "gy": choclo.prism.gravity_n, + "gz": choclo.prism.gravity_u, + "gxx": choclo.prism.gravity_ee, + "gyy": choclo.prism.gravity_nn, + "gzz": choclo.prism.gravity_uu, + "gxy": choclo.prism.gravity_en, + "gxz": choclo.prism.gravity_eu, + "gyz": choclo.prism.gravity_nu, + "guv": gravity_uv, + } + def _get_conversion_factor(component): """ @@ -81,7 +141,7 @@ class Simulation3DIntegral(BasePFSimulation): Mesh use to run the gravity simulation. survey : simpeg.potential_fields.gravity.Survey Gravity survey with information of the receivers. - ind_active : (n_cells) numpy.ndarray, optional + active_cells : (n_cells) numpy.ndarray, optional Array that indicates which cells in ``mesh`` are active cells. rho : numpy.ndarray, optional Density array for the active cells in the mesh. @@ -106,6 +166,12 @@ class Simulation3DIntegral(BasePFSimulation): If True, the simulation will run in parallel. If False, it will run in serial. If ``engine`` is not ``"choclo"`` this argument will be ignored. + ind_active : np.ndarray of int or bool + + .. deprecated:: 0.23.0 + + Argument ``ind_active`` is deprecated in favor of + ``active_cells`` and will be removed in SimPEG v0.24.0. """ rho, rhoMap, rhoDeriv = props.Invertible("Density") @@ -428,13 +494,133 @@ class SimulationEquivalentSourceLayer( mesh : discretize.BaseMesh A 2D tensor or tree mesh defining discretization along the x and y directions cell_z_top : numpy.ndarray or float - Define the elevations for the top face of all cells in the layer. If an array it should be the same size as - the active cell set. + Define the elevations for the top face of all cells in the layer. + If an array it should be the same size as the active cell set. cell_z_bottom : numpy.ndarray or float - Define the elevations for the bottom face of all cells in the layer. If an array it should be the same size as - the active cell set. + Define the elevations for the bottom face of all cells in the layer. + If an array it should be the same size as the active cell set. + engine : {"geoana", "choclo"}, optional + Choose which engine should be used to run the forward model. + numba_parallel : bool, optional + If True, the simulation will run in parallel. If False, it will + run in serial. If ``engine`` is not ``"choclo"`` this argument will be + ignored. """ + def __init__( + self, + mesh, + cell_z_top, + cell_z_bottom, + engine="geoana", + numba_parallel=True, + **kwargs, + ): + super().__init__( + mesh, + cell_z_top, + cell_z_bottom, + engine=engine, + numba_parallel=numba_parallel, + **kwargs, + ) + + if self.engine == "choclo": + if self.numba_parallel: + self._sensitivity_gravity = _sensitivity_gravity_2d_mesh_parallel + self._forward_gravity = _forward_gravity_2d_mesh_parallel + else: + self._sensitivity_gravity = _sensitivity_gravity_2d_mesh_serial + self._forward_gravity = _forward_gravity_2d_mesh_serial + + def _forward(self, densities): + """ + Forward model the fields of active cells in the mesh on receivers. + + Parameters + ---------- + densities : (n_active_cells) numpy.ndarray + Array containing the densities of the active cells in the mesh, in + g/cc. + + Returns + ------- + (nD,) numpy.ndarray + Always return a ``np.float64`` array. + """ + # Get cells in the 2D mesh and keep only active cells + cells_bounds_active = self.mesh.cell_bounds[self.active_cells] + # Allocate fields array + fields = np.zeros(self.survey.nD, dtype=self.sensitivity_dtype) + # Compute fields + index_offset = 0 + for components, receivers in self._get_components_and_receivers(): + n_components = len(components) + n_elements = n_components * receivers.shape[0] + for i, component in enumerate(components): + forward_func = CHOCLO_FORWARD_FUNCS[component] + conversion_factor = _get_conversion_factor(component) + vector_slice = slice( + index_offset + i, index_offset + n_elements, n_components + ) + self._forward_gravity( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + densities, + fields[vector_slice], + forward_func, + conversion_factor, + ) + index_offset += n_elements + return fields + + def _sensitivity_matrix(self): + """ + Compute the sensitivity matrix G + + Returns + ------- + (nD, n_active_cells) numpy.ndarray + """ + # Get cells in the 2D mesh and keep only active cells + cells_bounds_active = self.mesh.cell_bounds[self.active_cells] + # Allocate sensitivity matrix + shape = (self.survey.nD, self.nC) + if self.store_sensitivities == "disk": + sensitivity_matrix = np.memmap( + self.sensitivity_path, + shape=shape, + dtype=self.sensitivity_dtype, + order="C", # it's more efficient to write in row major + mode="w+", + ) + else: + sensitivity_matrix = np.empty(shape, dtype=self.sensitivity_dtype) + # Start filling the sensitivity matrix + index_offset = 0 + for components, receivers in self._get_components_and_receivers(): + n_components = len(components) + n_rows = n_components * receivers.shape[0] + for i, component in enumerate(components): + forward_func = CHOCLO_FORWARD_FUNCS[component] + conversion_factor = _get_conversion_factor(component) + matrix_slice = slice( + index_offset + i, index_offset + n_rows, n_components + ) + self._sensitivity_gravity( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + sensitivity_matrix[matrix_slice, :], + forward_func, + conversion_factor, + ) + index_offset += n_rows + return sensitivity_matrix + class Simulation3DDifferential(BasePDESimulation): r"""Finite volume simulation class for gravity. diff --git a/simpeg/potential_fields/magnetics/_numba_functions.py b/simpeg/potential_fields/magnetics/_numba_functions.py index 92a5d2eacd..dfda671459 100644 --- a/simpeg/potential_fields/magnetics/_numba_functions.py +++ b/simpeg/potential_fields/magnetics/_numba_functions.py @@ -15,7 +15,7 @@ def jit(*args, **kwargs): else: from numba import jit, prange -from .._numba_utils import kernels_in_nodes_to_cell +from .._numba_utils import kernels_in_nodes_to_cell, evaluate_kernels_on_cell def _sensitivity_mag( @@ -368,6 +368,191 @@ def _sensitivity_tmi( ) +def _sensitivity_tmi_derivative( + receivers, + nodes, + sensitivity_matrix, + cell_nodes, + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + constant_factor, + scalar_model, +): + r""" + Fill the sensitivity matrix for a TMI derivative. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_sens = jit(nopython=True, parallel=True)(_sensitivity_tmi_derivative) + + Parameters + ---------- + receivers : (n_receivers, 3) array + Array with the locations of the receivers + nodes : (n_active_nodes, 3) array + Array with the location of the mesh nodes. + sensitivity_matrix : array + Empty 2d array where the sensitivity matrix elements will be filled. + This could be a preallocated empty array or a slice of it. + The array should have a shape of ``(n_receivers, n_active_nodes)`` + if ``scalar_model`` is True. + The array should have a shape of ``(n_receivers, 3 * n_active_nodes)`` + if ``scalar_model`` is False. + cell_nodes : (n_active_cells, 8) array + Array of integers, where each row contains the indices of the nodes for + each active cell in the mesh. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz : callables + Kernel functions used for computing the desired TMI derivative. + constant_factor : float + Constant factor that will be used to multiply each element of the + sensitivity matrix. + scalar_model : bool + If True, the sensitivity matrix is build to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is build to work with vector models + (effective susceptibilities). + + Notes + ----- + + About the kernel functions + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + To compute the :math:`\alpha` derivative of the TMI :math:`\Delta T` (with + :math:`\alpha \in \{x, y, z\}` we need to evaluate third order kernels + functions for the prism. The kernels we need to evaluate can be obtained by + fixing one of the subindices to the direction of the derivative + (:math:`\alpha`) and cycle through combinations of the other two. + + For ``tmi_x`` we need to pass: + + .. code:: + + kernel_xx=kernel_eee, kernel_yy=kernel_enn, kernel_zz=kernel_euu, + kernel_xy=kernel_een, kernel_xz=kernel_eeu, kernel_yz=kernel_enu + + For ``tmi_y`` we need to pass: + + .. code:: + + kernel_xx=kernel_een, kernel_yy=kernel_nnn, kernel_zz=kernel_nuu, + kernel_xy=kernel_enn, kernel_xz=kernel_enu, kernel_yz=kernel_nnu + + For ``tmi_z`` we need to pass: + + .. code:: + + kernel_xx=kernel_eeu, kernel_yy=kernel_nnu, kernel_zz=kernel_uuu, + kernel_xy=kernel_enu, kernel_xz=kernel_euu, kernel_yz=kernel_nuu + + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + About the sensitivity matrix + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Each row of the sensitivity matrix corresponds to a single receiver + location. + + If ``scalar_model`` is True, then each element of the row will + correspond to the partial derivative of the tmi derivative (spatial) + with respect to the susceptibility of each cell in the mesh. + + If ``scalar_model`` is False, then each row can be split in three sections + containing: + + * the partial derivatives of the tmi derivative with respect + to the _x_ component of the effective susceptibility of each cell; then + * the partial derivatives of the tmi derivative with respect + to the _y_ component of the effective susceptibility of each cell; and then + * the partial derivatives of the tmi derivative with respect + to the _z_ component of the effective susceptibility of each cell. + """ + n_receivers = receivers.shape[0] + n_nodes = nodes.shape[0] + n_cells = cell_nodes.shape[0] + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + # Evaluate kernel function on each node, for each receiver location + for i in prange(n_receivers): + # Allocate vectors for kernels evaluated on mesh nodes + kxx, kyy, kzz = np.empty(n_nodes), np.empty(n_nodes), np.empty(n_nodes) + kxy, kxz, kyz = np.empty(n_nodes), np.empty(n_nodes), np.empty(n_nodes) + # Allocate small vector for the nodes indices for a given cell + nodes_indices = np.empty(8, dtype=cell_nodes.dtype) + for j in range(n_nodes): + dx = nodes[j, 0] - receivers[i, 0] + dy = nodes[j, 1] - receivers[i, 1] + dz = nodes[j, 2] - receivers[i, 2] + distance = np.sqrt(dx**2 + dy**2 + dz**2) + kxx[j] = kernel_xx(dx, dy, dz, distance) + kyy[j] = kernel_yy(dx, dy, dz, distance) + kzz[j] = kernel_zz(dx, dy, dz, distance) + kxy[j] = kernel_xy(dx, dy, dz, distance) + kxz[j] = kernel_xz(dx, dy, dz, distance) + kyz[j] = kernel_yz(dx, dy, dz, distance) + # Compute sensitivity matrix elements from the kernel values + for k in range(n_cells): + nodes_indices = cell_nodes[k, :] + uxx = kernels_in_nodes_to_cell(kxx, nodes_indices) + uyy = kernels_in_nodes_to_cell(kyy, nodes_indices) + uzz = kernels_in_nodes_to_cell(kzz, nodes_indices) + uxy = kernels_in_nodes_to_cell(kxy, nodes_indices) + uxz = kernels_in_nodes_to_cell(kxz, nodes_indices) + uyz = kernels_in_nodes_to_cell(kyz, nodes_indices) + bx = uxx * fx + uxy * fy + uxz * fz + by = uxy * fx + uyy * fy + uyz * fz + bz = uxz * fx + uyz * fy + uzz * fz + # Fill the sensitivity matrix element(s) that correspond to the + # current active cell + if scalar_model: + sensitivity_matrix[i, k] = ( + constant_factor + * regional_field_amplitude + * (bx * fx + by * fy + bz * fz) + ) + else: + sensitivity_matrix[i, k] = ( + constant_factor * regional_field_amplitude * bx + ) + sensitivity_matrix[i, k + n_cells] = ( + constant_factor * regional_field_amplitude * by + ) + sensitivity_matrix[i, k + 2 * n_cells] = ( + constant_factor * regional_field_amplitude * bz + ) + + def _forward_mag( receivers, nodes, @@ -649,6 +834,1103 @@ def _forward_tmi( ) +def _forward_tmi_derivative( + receivers, + nodes, + model, + fields, + cell_nodes, + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + constant_factor, + scalar_model, +): + r""" + Forward model a TMI derivative. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_forward = jit(nopython=True, parallel=True)(_forward_tmi_derivative) + + Parameters + ---------- + receivers : (n_receivers, 3) array + Array with the locations of the receivers + nodes : (n_active_nodes, 3) array + Array with the location of the mesh nodes. + model : (n_active_cells) or (3 * n_active_cells) + Array with the susceptibility (scalar model) or the effective + susceptibility (vector model) of each active cell in the mesh. + If the model is scalar, the ``model`` array should have + ``n_active_cells`` elements and ``scalar_model`` should be True. + If the model is vector, the ``model`` array should have + ``3 * n_active_cells`` elements and ``scalar_model`` should be False. + fields : (n_receivers) array + Array full of zeros where the TMI derivative on each receiver will be + stored. This could be a preallocated array or a slice of it. + cell_nodes : (n_active_cells, 8) array + Array of integers, where each row contains the indices of the nodes for + each active cell in the mesh. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz : callables + Kernel functions used for computing the desired TMI derivative. + constant_factor : float + Constant factor that will be used to multiply each element of the + sensitivity matrix. + scalar_model : bool + If True, the sensitivity matrix is build to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is build to work with vector models + (effective susceptibilities). + + Notes + ----- + + About the kernel functions + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + To compute the :math:`\alpha` derivative of the TMI :math:`\Delta T` (with + :math:`\alpha \in \{x, y, z\}` we need to evaluate third order kernels + functions for the prism. The kernels we need to evaluate can be obtained by + fixing one of the subindices to the direction of the derivative + (:math:`\alpha`) and cycle through combinations of the other two. + + For ``tmi_x`` we need to pass: + + .. code:: + + kernel_xx=kernel_eee, kernel_yy=kernel_enn, kernel_zz=kernel_euu, + kernel_xy=kernel_een, kernel_xz=kernel_eeu, kernel_yz=kernel_enu + + For ``tmi_y`` we need to pass: + + .. code:: + + kernel_xx=kernel_een, kernel_yy=kernel_nnn, kernel_zz=kernel_nuu, + kernel_xy=kernel_enn, kernel_xz=kernel_enu, kernel_yz=kernel_nnu + + For ``tmi_z`` we need to pass: + + .. code:: + + kernel_xx=kernel_eeu, kernel_yy=kernel_nnu, kernel_zz=kernel_uuu, + kernel_xy=kernel_enu, kernel_xz=kernel_euu, kernel_yz=kernel_nuu + + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + """ + n_receivers = receivers.shape[0] + n_nodes = nodes.shape[0] + n_cells = cell_nodes.shape[0] + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + # Evaluate kernel function on each node, for each receiver location + for i in prange(n_receivers): + # Allocate vectors for kernels evaluated on mesh nodes + kxx, kyy, kzz = np.empty(n_nodes), np.empty(n_nodes), np.empty(n_nodes) + kxy, kxz, kyz = np.empty(n_nodes), np.empty(n_nodes), np.empty(n_nodes) + # Allocate small vector for the nodes indices for a given cell + nodes_indices = np.empty(8, dtype=cell_nodes.dtype) + for j in range(n_nodes): + dx = nodes[j, 0] - receivers[i, 0] + dy = nodes[j, 1] - receivers[i, 1] + dz = nodes[j, 2] - receivers[i, 2] + distance = np.sqrt(dx**2 + dy**2 + dz**2) + kxx[j] = kernel_xx(dx, dy, dz, distance) + kyy[j] = kernel_yy(dx, dy, dz, distance) + kzz[j] = kernel_zz(dx, dy, dz, distance) + kxy[j] = kernel_xy(dx, dy, dz, distance) + kxz[j] = kernel_xz(dx, dy, dz, distance) + kyz[j] = kernel_yz(dx, dy, dz, distance) + # Compute sensitivity matrix elements from the kernel values + for k in range(n_cells): + nodes_indices = cell_nodes[k, :] + uxx = kernels_in_nodes_to_cell(kxx, nodes_indices) + uyy = kernels_in_nodes_to_cell(kyy, nodes_indices) + uzz = kernels_in_nodes_to_cell(kzz, nodes_indices) + uxy = kernels_in_nodes_to_cell(kxy, nodes_indices) + uxz = kernels_in_nodes_to_cell(kxz, nodes_indices) + uyz = kernels_in_nodes_to_cell(kyz, nodes_indices) + bx = uxx * fx + uxy * fy + uxz * fz + by = uxy * fx + uyy * fy + uyz * fz + bz = uxz * fx + uyz * fy + uzz * fz + if scalar_model: + fields[i] += ( + constant_factor + * model[k] + * regional_field_amplitude + * (bx * fx + by * fy + bz * fz) + ) + else: + fields[i] += ( + constant_factor + * regional_field_amplitude + * ( + bx * model[k] + + by * model[k + n_cells] + + bz * model[k + 2 * n_cells] + ) + ) + + +def _forward_mag_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + model, + fields, + regional_field, + forward_func, + scalar_model, +): + """ + Forward model single magnetic component for 2D meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_forward = jit(nopython=True, parallel=True)(_forward_mag_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + model : (n_active_cells) or (3 * n_active_cells) array + Array containing the susceptibilities (scalar) or effective + susceptibilities (vector) of the active cells in the mesh, in SI + units. + Susceptibilities are expected if ``scalar_model`` is True, + and the array should have ``n_active_cells`` elements. + Effective susceptibilities are expected if ``scalar_model`` is False, + and the array should have ``3 * n_active_cells`` elements. + fields : (n_receivers) array + Array full of zeros where the magnetic component on each receiver will + be stored. This could be a preallocated array or a slice of it. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + forward_func : callable + Forward function that will be evaluated on each node of the mesh. Choose + one of the forward functions in ``choclo.prism``. + scalar_model : bool + If True, the forward will be computing assuming that the ``model`` has + susceptibilities (scalar model) for each active cell. + If False, the forward will be computing assuming that the ``model`` has + effective susceptibilities (vector model) for each active cell. + + Notes + ----- + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + """ + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + # Forward model the magnetic component of each cell on each receiver location + for i in prange(n_receivers): + for j in range(n_cells): + # Define magnetization vector of the cell + # (we we'll divide by mu_0 when adding the forward modelled field) + if scalar_model: + # model is susceptibility, so the vector is parallel to the + # regional field + magnetization_x = model[j] * fx + magnetization_y = model[j] * fy + magnetization_z = model[j] * fz + else: + # model is effective susceptibility (vector) + magnetization_x = model[j] + magnetization_y = model[j + n_cells] + magnetization_z = model[j + 2 * n_cells] + # Forward the magnetic component + fields[i] += ( + regional_field_amplitude + * forward_func( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + magnetization_x, + magnetization_y, + magnetization_z, + ) + / choclo.constants.VACUUM_MAGNETIC_PERMEABILITY + ) + + +def _forward_tmi_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + model, + fields, + regional_field, + scalar_model, +): + """ + Forward model the TMI for 2D meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_forward = jit(nopython=True, parallel=True)(_forward_tmi_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + model : (n_active_cells) or (3 * n_active_cells) + Array with the susceptibility (scalar model) or the effective + susceptibility (vector model) of each active cell in the mesh. + If the model is scalar, the ``model`` array should have + ``n_active_cells`` elements and ``scalar_model`` should be True. + If the model is vector, the ``model`` array should have + ``3 * n_active_cells`` elements and ``scalar_model`` should be False. + fields : (n_receivers) array + Array full of zeros where the TMI on each receiver will be stored. This + could be a preallocated array or a slice of it. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + scalar_model : bool + If True, the sensitivity matrix is build to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is build to work with vector models + (effective susceptibilities). + + Notes + ----- + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + """ + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + # Forward model the magnetic component of each cell on each receiver location + for i in prange(n_receivers): + for j in range(n_cells): + # Define magnetization vector of the cell + # (we we'll divide by mu_0 when adding the forward modelled field) + if scalar_model: + # model is susceptibility, so the vector is parallel to the + # regional field + magnetization_x = model[j] * fx + magnetization_y = model[j] * fy + magnetization_z = model[j] * fz + else: + # model is effective susceptibility (vector) + magnetization_x = model[j] + magnetization_y = model[j + n_cells] + magnetization_z = model[j + 2 * n_cells] + # Forward the magnetic field vector and compute tmi + bx, by, bz = choclo.prism.magnetic_field( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + magnetization_x, + magnetization_y, + magnetization_z, + ) + fields[i] += ( + regional_field_amplitude + * (bx * fx + by * fy + bz * fz) + / choclo.constants.VACUUM_MAGNETIC_PERMEABILITY + ) + + +def _forward_tmi_derivative_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + model, + fields, + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + scalar_model, +): + r""" + Forward model a TMI derivative for 2D meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_forward = jit(nopython=True, parallel=True)(_forward_tmi_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + model : (n_active_cells) or (3 * n_active_cells) + Array with the susceptibility (scalar model) or the effective + susceptibility (vector model) of each active cell in the mesh. + If the model is scalar, the ``model`` array should have + ``n_active_cells`` elements and ``scalar_model`` should be True. + If the model is vector, the ``model`` array should have + ``3 * n_active_cells`` elements and ``scalar_model`` should be False. + fields : (n_receivers) array + Array full of zeros where the TMI on each receiver will be stored. This + could be a preallocated array or a slice of it. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz : callables + Kernel functions used for computing the desired TMI derivative. + scalar_model : bool + If True, the sensitivity matrix is build to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is build to work with vector models + (effective susceptibilities). + + Notes + ----- + + About the kernel functions + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + To compute the :math:`\alpha` derivative of the TMI :math:`\Delta T` (with + :math:`\alpha \in \{x, y, z\}` we need to evaluate third order kernels + functions for the prism. The kernels we need to evaluate can be obtained by + fixing one of the subindices to the direction of the derivative + (:math:`\alpha`) and cycle through combinations of the other two. + + For ``tmi_x`` we need to pass: + + .. code:: + + kernel_xx=kernel_eee, kernel_yy=kernel_enn, kernel_zz=kernel_euu, + kernel_xy=kernel_een, kernel_xz=kernel_eeu, kernel_yz=kernel_enu + + For ``tmi_y`` we need to pass: + + .. code:: + + kernel_xx=kernel_een, kernel_yy=kernel_nnn, kernel_zz=kernel_nuu, + kernel_xy=kernel_enn, kernel_xz=kernel_enu, kernel_yz=kernel_nnu + + For ``tmi_z`` we need to pass: + + .. code:: + + kernel_xx=kernel_eeu, kernel_yy=kernel_nnu, kernel_zz=kernel_uuu, + kernel_xy=kernel_enu, kernel_xz=kernel_euu, kernel_yz=kernel_nuu + + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + """ + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + # Forward model the magnetic component of each cell on each receiver location + for i in prange(n_receivers): + for j in range(n_cells): + uxx, uyy, uzz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + kernel_xx, + kernel_yy, + kernel_zz, + ) + uxy, uxz, uyz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + kernel_xy, + kernel_xz, + kernel_yz, + ) + if scalar_model: + bx = uxx * fx + uxy * fy + uxz * fz + by = uxy * fx + uyy * fy + uyz * fz + bz = uxz * fx + uyz * fy + uzz * fz + fields[i] += ( + model[j] + * regional_field_amplitude + * (fx * bx + fy * by + fz * bz) + / (4 * np.pi) + ) + else: + model_x = model[j] + model_y = model[j + n_cells] + model_z = model[j + 2 * n_cells] + bx = uxx * model_x + uxy * model_y + uxz * model_z + by = uxy * model_x + uyy * model_y + uyz * model_z + bz = uxz * model_x + uyz * model_y + uzz * model_z + fields[i] += ( + regional_field_amplitude * (bx * fx + by * fy + bz * fz) / 4 / np.pi + ) + + +def _sensitivity_mag_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + sensitivity_matrix, + regional_field, + kernel_x, + kernel_y, + kernel_z, + scalar_model, +): + r""" + Fill the sensitivity matrix for single mag component for 2d meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_sensitivity = jit(nopython=True, parallel=True)(_sensitivity_mag_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + sensitivity_matrix : (n_receivers, n_active_nodes) array + Empty 2d array where the sensitivity matrix elements will be filled. + This could be a preallocated empty array or a slice of it. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + kernel_x, kernel_y, kernel_z : callable + Kernels used to compute the desired magnetic component. For example, + for computing bx we need to use ``kernel_x=kernel_ee``, + ``kernel_y=kernel_en``, ``kernel_z=kernel_eu``. + scalar_model : bool + If True, the sensitivity matrix is built to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is built to work with vector models + (effective susceptibilities). + + Notes + ----- + + About the kernel functions + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + + For computing the ``bx`` component of the magnetic field we need to use the + following kernels: + + .. code:: + + kernel_x=kernel_ee, kernel_y=kernel_en, kernel_z=kernel_eu + + + For computing the ``by`` component of the magnetic field we need to use the + following kernels: + + .. code:: + + kernel_x=kernel_en, kernel_y=kernel_nn, kernel_z=kernel_nu + + For computing the ``bz`` component of the magnetic field we need to use the + following kernels: + + .. code:: + + kernel_x=kernel_eu, kernel_y=kernel_nu, kernel_z=kernel_uu + + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + About the sensitivity matrix + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Each row of the sensitivity matrix corresponds to a single receiver + location. + + If ``scalar_model`` is True, then each element of the row will + correspond to the partial derivative of the selected magnetic component + with respect to the susceptibility of each cell in the mesh. + + If ``scalar_model`` is False, then each row can be split in three sections + containing: + + * the partial derivatives of the selected magnetic component with respect + to the _x_ component of the effective susceptibility of each cell; then + * the partial derivatives of the selected magnetic component with respect + to the _y_ component of the effective susceptibility of each cell; and then + * the partial derivatives of the selected magnetic component with respect + to the _z_ component of the effective susceptibility of each cell. + + So, if we call :math:`B_j` the magnetic field component on the receiver + :math:`j`, and :math:`\bar{\chi}^{(i)} = (\chi_x^{(i)}, \chi_y^{(i)}, + \chi_z^{(i)})` the effective susceptibility of the active cell :math:`i`, + then each row of the sensitivity matrix will be: + + .. math:: + + \left[ + \frac{\partial B_j}{\partial \chi_x^{(1)}}, + \dots, + \frac{\partial B_j}{\partial \chi_x^{(N)}}, + \frac{\partial B_j}{\partial \chi_y^{(1)}}, + \dots, + \frac{\partial B_j}{\partial \chi_y^{(N)}}, + \frac{\partial B_j}{\partial \chi_z^{(1)}}, + \dots, + \frac{\partial B_j}{\partial \chi_z^{(N)}} + \right] + + where :math:`N` is the total number of active cells. + """ + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + + constant_factor = 1 / 4 / np.pi + + # Fill the sensitivity matrix + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + for i in prange(n_receivers): + for j in range(n_cells): + # Evaluate kernels for the current cell and receiver + ux, uy, uz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + kernel_x, + kernel_y, + kernel_z, + ) + if scalar_model: + sensitivity_matrix[i, j] = ( + constant_factor + * regional_field_amplitude + * (ux * fx + uy * fy + uz * fz) + ) + else: + sensitivity_matrix[i, j] = ( + constant_factor * regional_field_amplitude * ux + ) + sensitivity_matrix[i, j + n_cells] = ( + constant_factor * regional_field_amplitude * uy + ) + sensitivity_matrix[i, j + 2 * n_cells] = ( + constant_factor * regional_field_amplitude * uz + ) + + +def _sensitivity_tmi_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + sensitivity_matrix, + regional_field, + scalar_model, +): + r""" + Fill the sensitivity matrix TMI for 2d meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_tmi = jit(nopython=True, parallel=True)(_sensitivity_tmi_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + sensitivity_matrix : array + Empty 2d array where the sensitivity matrix elements will be filled. + This could be a preallocated empty array or a slice of it. + The array should have a shape of ``(n_receivers, n_active_nodes)`` + if ``scalar_model`` is True. + The array should have a shape of ``(n_receivers, 3 * n_active_nodes)`` + if ``scalar_model`` is False. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + scalar_model : bool + If True, the sensitivity matrix is build to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is build to work with vector models + (effective susceptibilities). + + Notes + ----- + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + + About the sensitivity matrix + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + Each row of the sensitivity matrix corresponds to a single receiver + location. + + If ``scalar_model`` is True, then each element of the row will + correspond to the partial derivative of the tmi + with respect to the susceptibility of each cell in the mesh. + + If ``scalar_model`` is False, then each row can be split in three sections + containing: + + * the partial derivatives of the tmi with respect + to the _x_ component of the effective susceptibility of each cell; then + * the partial derivatives of the tmi with respect + to the _y_ component of the effective susceptibility of each cell; and then + * the partial derivatives of the tmi with respect + to the _z_ component of the effective susceptibility of each cell. + + So, if we call :math:`T_j` the tmi on the receiver + :math:`j`, and :math:`\bar{\chi}^{(i)} = (\chi_x^{(i)}, \chi_y^{(i)}, + \chi_z^{(i)})` the effective susceptibility of the active cell :math:`i`, + then each row of the sensitivity matrix will be: + + .. math:: + + \left[ + \frac{\partial T_j}{\partial \chi_x^{(1)}}, + \dots, + \frac{\partial T_j}{\partial \chi_x^{(N)}}, + \frac{\partial T_j}{\partial \chi_y^{(1)}}, + \dots, + \frac{\partial T_j}{\partial \chi_y^{(N)}}, + \frac{\partial T_j}{\partial \chi_z^{(1)}}, + \dots, + \frac{\partial T_j}{\partial \chi_z^{(N)}} + \right] + + where :math:`N` is the total number of active cells. + """ + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + + constant_factor = 1 / 4 / np.pi + + # Fill the sensitivity matrix + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + for i in prange(n_receivers): + for j in range(n_cells): + # Evaluate kernels for the current cell and receiver + uxx, uyy, uzz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + choclo.prism.kernel_ee, + choclo.prism.kernel_nn, + choclo.prism.kernel_uu, + ) + uxy, uxz, uyz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + choclo.prism.kernel_en, + choclo.prism.kernel_eu, + choclo.prism.kernel_nu, + ) + bx = uxx * fx + uxy * fy + uxz * fz + by = uxy * fx + uyy * fy + uyz * fz + bz = uxz * fx + uyz * fy + uzz * fz + if scalar_model: + sensitivity_matrix[i, j] = ( + constant_factor + * regional_field_amplitude + * (bx * fx + by * fy + bz * fz) + ) + else: + sensitivity_matrix[i, j] = ( + constant_factor * regional_field_amplitude * bx + ) + sensitivity_matrix[i, j + n_cells] = ( + constant_factor * regional_field_amplitude * by + ) + sensitivity_matrix[i, j + 2 * n_cells] = ( + constant_factor * regional_field_amplitude * bz + ) + + +def _sensitivity_tmi_derivative_2d_mesh( + receivers, + cells_bounds, + top, + bottom, + sensitivity_matrix, + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + scalar_model, +): + r""" + Fill the sensitivity matrix TMI for 2d meshes. + + This function is designed to be used with equivalent sources, where the + mesh is a 2D mesh (prism layer). The top and bottom boundaries of each cell + are passed through the ``top`` and ``bottom`` arrays. + + This function should be used with a `numba.jit` decorator, for example: + + .. code:: + + from numba import jit + + jit_tmi = jit(nopython=True, parallel=True)(_sensitivity_tmi_2d_mesh) + + Parameters + ---------- + receivers : (n_receivers, 3) numpy.ndarray + Array with the locations of the receivers + cells_bounds : (n_active_cells, 4) numpy.ndarray + Array with the bounds of each active cell in the 2D mesh. For each row, the + bounds should be passed in the following order: ``x_min``, ``x_max``, + ``y_min``, ``y_max``. + top : (n_active_cells) np.ndarray + Array with the top boundaries of each active cell in the 2D mesh. + bottom : (n_active_cells) np.ndarray + Array with the bottom boundaries of each active cell in the 2D mesh. + sensitivity_matrix : array + Empty 2d array where the sensitivity matrix elements will be filled. + This could be a preallocated empty array or a slice of it. + The array should have a shape of ``(n_receivers, n_active_nodes)`` + if ``scalar_model`` is True. + The array should have a shape of ``(n_receivers, 3 * n_active_nodes)`` + if ``scalar_model`` is False. + regional_field : (3,) array + Array containing the x, y and z components of the regional magnetic + field (uniform background field). + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz : callables + Kernel functions used for computing the desired TMI derivative. + scalar_model : bool + If True, the sensitivity matrix is build to work with scalar models + (susceptibilities). + If False, the sensitivity matrix is build to work with vector models + (effective susceptibilities). + + Notes + ----- + + About the model array + ^^^^^^^^^^^^^^^^^^^^^ + + The ``model`` must always be a 1d array: + + * If ``scalar_model`` is ``True``, then ``model`` should be a 1d array with + the same number of elements as active cells in the mesh. It should store + the magnetic susceptibilities of each active cell in SI units. + * If ``scalar_model`` is ``False``, then ``model`` should be a 1d array + with a number of elements equal to three times the active cells in the + mesh. It should store the components of the magnetization vector of each + active cell in :math:`Am^{-1}`. The order in which the components should + be passed are: + * every _easting_ component of each active cell, + * then every _northing_ component of each active cell, + * and finally every _upward_ component of each active cell. + """ + fx, fy, fz = regional_field + regional_field_amplitude = np.sqrt(fx**2 + fy**2 + fz**2) + fx /= regional_field_amplitude + fy /= regional_field_amplitude + fz /= regional_field_amplitude + + constant_factor = 1 / 4 / np.pi + + # Fill the sensitivity matrix + n_receivers = receivers.shape[0] + n_cells = cells_bounds.shape[0] + for i in prange(n_receivers): + for j in range(n_cells): + # Evaluate kernels for the current cell and receiver + uxx, uyy, uzz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + kernel_xx, + kernel_yy, + kernel_zz, + ) + uxy, uxz, uyz = evaluate_kernels_on_cell( + receivers[i, 0], + receivers[i, 1], + receivers[i, 2], + cells_bounds[j, 0], + cells_bounds[j, 1], + cells_bounds[j, 2], + cells_bounds[j, 3], + bottom[j], + top[j], + kernel_xy, + kernel_xz, + kernel_yz, + ) + bx = uxx * fx + uxy * fy + uxz * fz + by = uxy * fx + uyy * fy + uyz * fz + bz = uxz * fx + uyz * fy + uzz * fz + if scalar_model: + sensitivity_matrix[i, j] = ( + constant_factor + * regional_field_amplitude + * (bx * fx + by * fy + bz * fz) + ) + else: + sensitivity_matrix[i, j] = ( + constant_factor * regional_field_amplitude * bx + ) + sensitivity_matrix[i, j + n_cells] = ( + constant_factor * regional_field_amplitude * by + ) + sensitivity_matrix[i, j + 2 * n_cells] = ( + constant_factor * regional_field_amplitude * bz + ) + + _sensitivity_tmi_serial = jit(nopython=True, parallel=False)(_sensitivity_tmi) _sensitivity_tmi_parallel = jit(nopython=True, parallel=True)(_sensitivity_tmi) _forward_tmi_serial = jit(nopython=True, parallel=False)(_forward_tmi) @@ -657,3 +1939,43 @@ def _forward_tmi( _forward_mag_parallel = jit(nopython=True, parallel=True)(_forward_mag) _sensitivity_mag_serial = jit(nopython=True, parallel=False)(_sensitivity_mag) _sensitivity_mag_parallel = jit(nopython=True, parallel=True)(_sensitivity_mag) +_forward_tmi_derivative_parallel = jit(nopython=True, parallel=True)( + _forward_tmi_derivative +) +_forward_tmi_derivative_serial = jit(nopython=True, parallel=False)( + _forward_tmi_derivative +) +_sensitivity_tmi_derivative_parallel = jit(nopython=True, parallel=True)( + _sensitivity_tmi_derivative +) +_sensitivity_tmi_derivative_serial = jit(nopython=True, parallel=False)( + _sensitivity_tmi_derivative +) +_forward_tmi_2d_mesh_serial = jit(nopython=True, parallel=False)(_forward_tmi_2d_mesh) +_forward_tmi_2d_mesh_parallel = jit(nopython=True, parallel=True)(_forward_tmi_2d_mesh) +_forward_mag_2d_mesh_serial = jit(nopython=True, parallel=False)(_forward_mag_2d_mesh) +_forward_mag_2d_mesh_parallel = jit(nopython=True, parallel=True)(_forward_mag_2d_mesh) +_forward_tmi_derivative_2d_mesh_serial = jit(nopython=True, parallel=False)( + _forward_tmi_derivative_2d_mesh +) +_forward_tmi_derivative_2d_mesh_parallel = jit(nopython=True, parallel=True)( + _forward_tmi_derivative_2d_mesh +) +_sensitivity_mag_2d_mesh_serial = jit(nopython=True, parallel=False)( + _sensitivity_mag_2d_mesh +) +_sensitivity_mag_2d_mesh_parallel = jit(nopython=True, parallel=True)( + _sensitivity_mag_2d_mesh +) +_sensitivity_tmi_2d_mesh_serial = jit(nopython=True, parallel=False)( + _sensitivity_tmi_2d_mesh +) +_sensitivity_tmi_2d_mesh_parallel = jit(nopython=True, parallel=True)( + _sensitivity_tmi_2d_mesh +) +_sensitivity_tmi_derivative_2d_mesh_serial = jit(nopython=True, parallel=False)( + _sensitivity_tmi_derivative_2d_mesh +) +_sensitivity_tmi_derivative_2d_mesh_parallel = jit(nopython=True, parallel=True)( + _sensitivity_tmi_derivative_2d_mesh +) diff --git a/simpeg/potential_fields/magnetics/simulation.py b/simpeg/potential_fields/magnetics/simulation.py index 228fc1de2e..02204b49e9 100644 --- a/simpeg/potential_fields/magnetics/simulation.py +++ b/simpeg/potential_fields/magnetics/simulation.py @@ -12,9 +12,10 @@ ) from scipy.constants import mu_0 -from simpeg import Solver, props, utils +from simpeg import props, utils from simpeg.utils import mat_utils, mkvc, sdiag from simpeg.utils.code_utils import deprecate_property, validate_string, validate_type +from simpeg.utils.solver_utils import get_default_solver from ...base import BaseMagneticPDESimulation from ..base import BaseEquivalentSourceLayerSimulation, BasePFSimulation @@ -31,14 +32,109 @@ _forward_tmi_serial, _forward_mag_parallel, _forward_mag_serial, + _forward_tmi_2d_mesh_serial, + _forward_tmi_2d_mesh_parallel, + _forward_mag_2d_mesh_serial, + _forward_mag_2d_mesh_parallel, + _forward_tmi_derivative_2d_mesh_serial, + _forward_tmi_derivative_2d_mesh_parallel, + _sensitivity_mag_2d_mesh_serial, + _sensitivity_mag_2d_mesh_parallel, + _sensitivity_tmi_2d_mesh_serial, + _sensitivity_tmi_2d_mesh_parallel, + _forward_tmi_derivative_parallel, + _forward_tmi_derivative_serial, + _sensitivity_tmi_derivative_parallel, + _sensitivity_tmi_derivative_serial, + _sensitivity_tmi_derivative_2d_mesh_serial, + _sensitivity_tmi_derivative_2d_mesh_parallel, ) if choclo is not None: - CHOCLO_SUPPORTED_COMPONENTS = {"tmi", "bx", "by", "bz"} + CHOCLO_SUPPORTED_COMPONENTS = { + "tmi", + "bx", + "by", + "bz", + "bxx", + "byy", + "bzz", + "bxy", + "bxz", + "byz", + "tmi_x", + "tmi_y", + "tmi_z", + } CHOCLO_KERNELS = { "bx": (choclo.prism.kernel_ee, choclo.prism.kernel_en, choclo.prism.kernel_eu), "by": (choclo.prism.kernel_en, choclo.prism.kernel_nn, choclo.prism.kernel_nu), "bz": (choclo.prism.kernel_eu, choclo.prism.kernel_nu, choclo.prism.kernel_uu), + "bxx": ( + choclo.prism.kernel_eee, + choclo.prism.kernel_een, + choclo.prism.kernel_eeu, + ), + "byy": ( + choclo.prism.kernel_enn, + choclo.prism.kernel_nnn, + choclo.prism.kernel_nnu, + ), + "bzz": ( + choclo.prism.kernel_euu, + choclo.prism.kernel_nuu, + choclo.prism.kernel_uuu, + ), + "bxy": ( + choclo.prism.kernel_een, + choclo.prism.kernel_enn, + choclo.prism.kernel_enu, + ), + "bxz": ( + choclo.prism.kernel_eeu, + choclo.prism.kernel_enu, + choclo.prism.kernel_euu, + ), + "byz": ( + choclo.prism.kernel_enu, + choclo.prism.kernel_nnu, + choclo.prism.kernel_nuu, + ), + "tmi_x": ( + choclo.prism.kernel_eee, + choclo.prism.kernel_enn, + choclo.prism.kernel_euu, + choclo.prism.kernel_een, + choclo.prism.kernel_eeu, + choclo.prism.kernel_enu, + ), + "tmi_y": ( + choclo.prism.kernel_een, + choclo.prism.kernel_nnn, + choclo.prism.kernel_nuu, + choclo.prism.kernel_enn, + choclo.prism.kernel_enu, + choclo.prism.kernel_nnu, + ), + "tmi_z": ( + choclo.prism.kernel_eeu, + choclo.prism.kernel_nnu, + choclo.prism.kernel_uuu, + choclo.prism.kernel_enu, + choclo.prism.kernel_euu, + choclo.prism.kernel_nuu, + ), + } + CHOCLO_FORWARD_FUNCS = { + "bx": choclo.prism.magnetic_e, + "by": choclo.prism.magnetic_n, + "bz": choclo.prism.magnetic_u, + "bxx": choclo.prism.magnetic_ee, + "byy": choclo.prism.magnetic_nn, + "bzz": choclo.prism.magnetic_uu, + "bxy": choclo.prism.magnetic_en, + "bxz": choclo.prism.magnetic_eu, + "byz": choclo.prism.magnetic_nu, } @@ -52,7 +148,7 @@ class Simulation3DIntegral(BasePFSimulation): Mesh use to run the magnetic simulation. survey : simpeg.potential_fields.magnetics.Survey Magnetic survey with information of the receivers. - ind_active : (n_cells) numpy.ndarray, optional + active_cells : (n_cells) numpy.ndarray, optional Array that indicates which cells in ``mesh`` are active cells. chi : numpy.ndarray, optional Susceptibility array for the active cells in the mesh. @@ -83,6 +179,12 @@ class Simulation3DIntegral(BasePFSimulation): If True, the simulation will run in parallel. If False, it will run in serial. If ``engine`` is not ``"choclo"`` this argument will be ignored. + ind_active : np.ndarray of int or bool + + .. deprecated:: 0.23.0 + + Argument ``ind_active`` is deprecated in favor of + ``active_cells`` and will be removed in SimPEG v0.24.0. """ chi, chiMap, chiDeriv = props.Invertible("Magnetic Susceptibility (SI)") @@ -122,11 +224,15 @@ def __init__( self._sensitivity_mag = _sensitivity_mag_parallel self._forward_tmi = _forward_tmi_parallel self._forward_mag = _forward_mag_parallel + self._forward_tmi_derivative = _forward_tmi_derivative_parallel + self._sensitivity_tmi_derivative = _sensitivity_tmi_derivative_parallel else: self._sensitivity_tmi = _sensitivity_tmi_serial self._sensitivity_mag = _sensitivity_mag_serial self._forward_tmi = _forward_tmi_serial self._forward_mag = _forward_mag_serial + self._forward_tmi_derivative = _forward_tmi_derivative_serial + self._sensitivity_tmi_derivative = _sensitivity_tmi_derivative_serial @property def model_type(self): @@ -578,8 +684,8 @@ def evaluate_integral(self, receiver_location, components): ) @property - def deleteTheseOnModelUpdate(self): - deletes = super().deleteTheseOnModelUpdate + def _delete_on_model_update(self): + deletes = super()._delete_on_model_update if self.is_amplitude_data: deletes = deletes + ["_gtg_diagonal", "_ampDeriv"] return deletes @@ -639,6 +745,26 @@ def _forward(self, model): constant_factor, scalar_model, ) + elif component in ("tmi_x", "tmi_y", "tmi_z"): + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz = ( + CHOCLO_KERNELS[component] + ) + self._forward_tmi_derivative( + receivers, + active_nodes, + model, + fields[vector_slice], + active_cell_nodes, + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + constant_factor, + scalar_model, + ) else: kernel_x, kernel_y, kernel_z = CHOCLO_KERNELS[component] self._forward_mag( @@ -712,6 +838,25 @@ def _sensitivity_matrix(self): constant_factor, scalar_model, ) + elif component in ("tmi_x", "tmi_y", "tmi_z"): + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz = ( + CHOCLO_KERNELS[component] + ) + self._sensitivity_tmi_derivative( + receivers, + active_nodes, + sensitivity_matrix[matrix_slice, :], + active_cell_nodes, + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + constant_factor, + scalar_model, + ) else: kernel_x, kernel_y, kernel_z = CHOCLO_KERNELS[component] self._sensitivity_mag( @@ -741,12 +886,236 @@ class SimulationEquivalentSourceLayer( mesh : discretize.BaseMesh A 2D tensor or tree mesh defining discretization along the x and y directions cell_z_top : numpy.ndarray or float - Define the elevations for the top face of all cells in the layer + Define the elevations for the top face of all cells in the layer. + If an array it should be the same size as the active cell set. cell_z_bottom : numpy.ndarray or float - Define the elevations for the bottom face of all cells in the layer + Define the elevations for the bottom face of all cells in the layer. + If an array it should be the same size as the active cell set. + engine : {"geoana", "choclo"}, optional + Choose which engine should be used to run the forward model. + numba_parallel : bool, optional + If True, the simulation will run in parallel. If False, it will + run in serial. If ``engine`` is not ``"choclo"`` this argument will be + ignored. """ + def __init__( + self, + mesh, + cell_z_top, + cell_z_bottom, + engine="geoana", + numba_parallel=True, + **kwargs, + ): + super().__init__( + mesh, + cell_z_top, + cell_z_bottom, + engine=engine, + numba_parallel=numba_parallel, + **kwargs, + ) + + if self.engine == "choclo": + if self.numba_parallel: + self._sensitivity_tmi = _sensitivity_tmi_2d_mesh_parallel + self._sensitivity_mag = _sensitivity_mag_2d_mesh_parallel + self._forward_tmi = _forward_tmi_2d_mesh_parallel + self._forward_mag = _forward_mag_2d_mesh_parallel + self._forward_tmi_derivative = _forward_tmi_derivative_2d_mesh_parallel + self._sensitivity_tmi_derivative = ( + _sensitivity_tmi_derivative_2d_mesh_parallel + ) + else: + self._sensitivity_tmi = _sensitivity_tmi_2d_mesh_serial + self._sensitivity_mag = _sensitivity_mag_2d_mesh_serial + self._forward_tmi = _forward_tmi_2d_mesh_serial + self._forward_mag = _forward_mag_2d_mesh_serial + self._forward_tmi_derivative = _forward_tmi_derivative_2d_mesh_serial + self._sensitivity_tmi_derivative = ( + _sensitivity_tmi_derivative_2d_mesh_serial + ) + + def _forward(self, model): + """ + Forward model the fields of active cells in the mesh on receivers. + + Parameters + ---------- + model : (n_active_cells) or (3 * n_active_cells) array + Array containing the susceptibilities (scalar) or effective + susceptibilities (vector) of the active cells in the mesh, in SI + units. + Susceptibilities are expected if ``model_type`` is ``"scalar"``, + and the array should have ``n_active_cells`` elements. + Effective susceptibilities are expected if ``model_type`` is + ``"vector"``, and the array should have ``3 * n_active_cells`` + elements. + + Returns + ------- + (nD, ) array + Always return a ``np.float64`` array. + """ + # Get cells in the 2D mesh and keep only active cells + cells_bounds_active = self.mesh.cell_bounds[self.active_cells] + # Get regional field + regional_field = self.survey.source_field.b0 + # Allocate fields array + fields = np.zeros(self.survey.nD, dtype=self.sensitivity_dtype) + # Start computing the fields + index_offset = 0 + scalar_model = self.model_type == "scalar" + for components, receivers in self._get_components_and_receivers(): + if not CHOCLO_SUPPORTED_COMPONENTS.issuperset(components): + raise NotImplementedError( + f"Other components besides {CHOCLO_SUPPORTED_COMPONENTS} " + "aren't implemented yet." + ) + n_components = len(components) + n_rows = n_components * receivers.shape[0] + for i, component in enumerate(components): + vector_slice = slice( + index_offset + i, index_offset + n_rows, n_components + ) + if component == "tmi": + self._forward_tmi( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + model, + fields[vector_slice], + regional_field, + scalar_model, + ) + elif component in ("tmi_x", "tmi_y", "tmi_z"): + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz = ( + CHOCLO_KERNELS[component] + ) + self._forward_tmi_derivative( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + model, + fields[vector_slice], + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + scalar_model, + ) + else: + forward_func = CHOCLO_FORWARD_FUNCS[component] + self._forward_mag( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + model, + fields[vector_slice], + regional_field, + forward_func, + scalar_model, + ) + index_offset += n_rows + return fields + + def _sensitivity_matrix(self): + """ + Compute the sensitivity matrix G + + Returns + ------- + (nD, n_active_cells) array + """ + # Get cells in the 2D mesh and keep only active cells + cells_bounds_active = self.mesh.cell_bounds[self.active_cells] + # Get regional field + regional_field = self.survey.source_field.b0 + # Allocate sensitivity matrix + if self.model_type == "scalar": + n_columns = self.nC + else: + n_columns = 3 * self.nC + shape = (self.survey.nD, n_columns) + if self.store_sensitivities == "disk": + sensitivity_matrix = np.memmap( + self.sensitivity_path, + shape=shape, + dtype=self.sensitivity_dtype, + order="C", # it's more efficient to write in row major + mode="w+", + ) + else: + sensitivity_matrix = np.empty(shape, dtype=self.sensitivity_dtype) + # Start filling the sensitivity matrix + index_offset = 0 + scalar_model = self.model_type == "scalar" + for components, receivers in self._get_components_and_receivers(): + if not CHOCLO_SUPPORTED_COMPONENTS.issuperset(components): + raise NotImplementedError( + f"Other components besides {CHOCLO_SUPPORTED_COMPONENTS} " + "aren't implemented yet." + ) + n_components = len(components) + n_rows = n_components * receivers.shape[0] + for i, component in enumerate(components): + matrix_slice = slice( + index_offset + i, index_offset + n_rows, n_components + ) + if component == "tmi": + self._sensitivity_tmi( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + sensitivity_matrix[matrix_slice, :], + regional_field, + scalar_model, + ) + elif component in ("tmi_x", "tmi_y", "tmi_z"): + kernel_xx, kernel_yy, kernel_zz, kernel_xy, kernel_xz, kernel_yz = ( + CHOCLO_KERNELS[component] + ) + self._sensitivity_tmi_derivative( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + sensitivity_matrix[matrix_slice, :], + regional_field, + kernel_xx, + kernel_yy, + kernel_zz, + kernel_xy, + kernel_xz, + kernel_yz, + scalar_model, + ) + else: + kernel_x, kernel_y, kernel_z = CHOCLO_KERNELS[component] + self._sensitivity_mag( + receivers, + cells_bounds_active, + self.cell_z_top, + self.cell_z_bottom, + sensitivity_matrix[matrix_slice, :], + regional_field, + kernel_x, + kernel_y, + kernel_z, + scalar_model, + ) + index_offset += n_rows + return sensitivity_matrix + class Simulation3DDifferential(BaseMagneticPDESimulation): """ @@ -1245,7 +1614,7 @@ def MagneticsDiffSecondaryInv(mesh, model, data, **kwargs): # Create an optimization program opt = optimization.InexactGaussNewton(maxIter=miter) - opt.bfgsH0 = Solver(sp.identity(model.nP), flag="D") + opt.bfgsH0 = get_default_solver(warn=True)(sp.identity(model.nP), flag="D") # Create a regularization program reg = regularization.WeightedLeastSquares(model) # Create an objective function diff --git a/simpeg/potential_fields/magnetics/sources.py b/simpeg/potential_fields/magnetics/sources.py index df9027f38a..d63797a99a 100644 --- a/simpeg/potential_fields/magnetics/sources.py +++ b/simpeg/potential_fields/magnetics/sources.py @@ -1,4 +1,3 @@ -from __future__ import annotations from ...survey import BaseSrc from ...utils.mat_utils import dip_azimuth2cartesian from ...utils.code_utils import deprecate_class, validate_float, validate_list_of_types @@ -44,7 +43,7 @@ def receiver_list(self): Returns ------- - list of SimPEG.potential_fields.magnetics.Point + list of simpeg.potential_fields.magnetics.Point List of magnetic receivers associated with the survey """ return self._receiver_list diff --git a/simpeg/props.py b/simpeg/props.py index 5dde99be1e..869af3af0f 100644 --- a/simpeg/props.py +++ b/simpeg/props.py @@ -1,5 +1,8 @@ +import warnings + import numpy as np +from simpeg.utils import deprecate_property from .maps import IdentityMap, ReciprocalMap from .utils import Zero, validate_type, validate_ndarray_with_shape @@ -363,7 +366,7 @@ def _has_nested_models(self): # TODO: rename to _delete_on_model_update @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): """A list of properties stored on this object to delete when the model is updated Returns @@ -373,6 +376,13 @@ def deleteTheseOnModelUpdate(self): """ return [] + deleteTheseOnModelUpdate = deprecate_property( + _delete_on_model_update, + "deleteTheseOnModelUpdate", + removal_version="0.25.0", + future_warn=True, + ) + #: List of matrix names to have their factors cleared on a model update @property def clean_on_model_update(self): @@ -382,6 +392,12 @@ def clean_on_model_update(self): ------- list of str """ + warnings.warn( + "clean_on_model_update has been deprecated due to repeated functionality encompassed" + " by the _delete_on_model_update method", + FutureWarning, + stacklevel=2, + ) return [] @property @@ -452,16 +468,10 @@ def model(self, value): and np.allclose(previous_value, value) ): # cached properties to delete - for prop in self.deleteTheseOnModelUpdate: - if getattr(self, prop, None) is not None: + for prop in self._delete_on_model_update: + if hasattr(self, prop): delattr(self, prop) - # matrix factors to clear - for mat in self.clean_on_model_update: - if getattr(self, mat, None) is not None: - if hasattr(getattr(self, mat), "clean"): - getattr(self, mat).clean() # clean factors - setattr(self, mat, None) # set to none updated = True self._model = value @@ -475,13 +485,6 @@ def model(self, value): def model(self): self._model = (None,) # cached properties to delete - for prop in self.deleteTheseOnModelUpdate: + for prop in self._delete_on_model_update: if hasattr(self, prop): delattr(self, prop) - - # matrix factors to clear - for mat in self.clean_on_model_update: - if getattr(self, mat, None) is not None: - if hasattr(getattr(self, mat), "clean"): - getattr(self, mat).clean() - setattr(self, mat, None) # set to none diff --git a/simpeg/regularization/_gradient.py b/simpeg/regularization/_gradient.py index 570e4727aa..f27da93ca5 100644 --- a/simpeg/regularization/_gradient.py +++ b/simpeg/regularization/_gradient.py @@ -18,15 +18,16 @@ class SmoothnessFullGradient(BaseRegularization): ---------- mesh : discretize.BaseMesh The mesh object to use for regularization. The mesh should either have - a `cell_gradient` or a `stencil_cell_gradient` defined. + a ``cell_gradient`` or a ``stencil_cell_gradient`` defined. alphas : (mesh.dim,) or (mesh.n_cells, mesh.dim) array_like of float, optional. - The weights of the regularization for each axis. This can be defined for each cell - in the mesh. Default is uniform weights equal to the smallest edge length squared. + The weights of the regularization for each axis. This can be defined + for each cell in the mesh. Default is uniform weights equal to the + smallest edge length squared. reg_dirs : (mesh.dim, mesh.dim) or (mesh.n_cells, mesh.dim, mesh.dim) array_like of float - Matrix or list of matrices whose columns represent the regularization directions. - Each matrix should be orthonormal. Default is Identity. + Matrix or list of matrices whose columns represent the regularization + directions. Each matrix should be orthonormal. Default is Identity. ortho_check : bool, optional - Whether to check `reg_dirs` for orthogonality. + Whether to check ``reg_dirs`` for orthogonality. **kwargs Keyword arguments passed to the parent class ``BaseRegularization``. @@ -41,19 +42,23 @@ class SmoothnessFullGradient(BaseRegularization): We can instead create a measure that smooths twice as much in the 1st dimension than it does in the second dimension. + >>> reg = SmoothnessFullGradient(mesh, [2, 1]) - The `alphas` parameter can also be indepenant for each cell. Here we set all cells - lower than 0.5 in the x2 to twice as much in the first dimension - otherwise it is uniform smoothing. + The ``alphas`` parameter can also be independent for each cell. Here we set + all cells lower than 0.5 in the ``x2`` to twice as much in the first + dimension otherwise it is uniform smoothing. + >>> alphas = np.ones((mesh.n_cells, mesh.dim)) >>> alphas[mesh.cell_centers[:, 1] < 0.5] = [2, 1] >>> reg = SmoothnessFullGradient(mesh, alphas) - We can also rotate the axis in which we want to preferentially smooth. Say we want to - smooth twice as much along the +x1,+x2 diagonal as we do along the -x1,+x2 diagonal, - effectively rotating our smoothing 45 degrees. Note and the columns of the matrix - represent the directional vectors (not the rows). + We can also rotate the axis in which we want to preferentially smooth. Say + we want to smooth twice as much along the +x1,+x2 diagonal as we do along + the -x1,+x2 diagonal, effectively rotating our smoothing 45 degrees. Note + and the columns of the matrix represent the directional vectors (not the + rows). + >>> sqrt2 = np.sqrt(2) >>> reg_dirs = np.array([ ... [sqrt2, -sqrt2], @@ -63,20 +68,25 @@ class SmoothnessFullGradient(BaseRegularization): Notes ----- - The regularization object is the discretized form of the continuous regularization + The regularization object is the discretized form of the continuous + regularization + + .. math:: + + f(m) = \int_V \nabla m \cdot \mathbf{a} \nabla m \, \text{d} V - ..math: - f(m) = \int_V \nabla m \cdot \mathbf{a} \nabla m \hspace{5pt} \partial V + The tensor quantity :math:`\mathbf{a}` is used to represent the potential + preferential directions of regularization. :math:`\mathbf{a}` must be + symmetric positive semi-definite with an eigendecomposition of: - The tensor quantity `a` is used to represent the potential preferential directions of - regularization. `a` must be symmetric positive semi-definite with an eigendecomposition of: + .. math:: - ..math: \mathbf{a} = \mathbf{Q}\mathbf{L}\mathbf{Q}^{-1} - `Q` is then the regularization directions ``reg_dirs``, and `L` is represents the weighting - along each direction, with ``alphas`` along its diagonal. These are multiplied to form the - anisotropic alpha used for rotated gradients. + :math:`\mathbf{Q}` is then the regularization directions ``reg_dirs``, and + :math:`\mathbf{L}` is represents the weighting + along each direction, with ``alphas`` along its diagonal. These are + multiplied to form the anisotropic alpha used for rotated gradients. """ def __init__(self, mesh, alphas=None, reg_dirs=None, ortho_check=True, **kwargs): diff --git a/simpeg/regularization/base.py b/simpeg/regularization/base.py index 3165244228..a5c59aee3f 100644 --- a/simpeg/regularization/base.py +++ b/simpeg/regularization/base.py @@ -1,8 +1,5 @@ -from __future__ import annotations - import numpy as np from discretize.base import BaseMesh -from typing import TYPE_CHECKING from .. import maps from ..objective_function import BaseObjectiveFunction, ComboObjectiveFunction from .. import utils @@ -10,8 +7,7 @@ from simpeg.utils.code_utils import deprecate_property, validate_ndarray_with_shape -if TYPE_CHECKING: - from scipy.sparse import csr_matrix +from scipy.sparse import csr_matrix class BaseRegularization(BaseObjectiveFunction): diff --git a/simpeg/regularization/pgi.py b/simpeg/regularization/pgi.py index 08a8f4ddef..dbc059eaa6 100644 --- a/simpeg/regularization/pgi.py +++ b/simpeg/regularization/pgi.py @@ -1,5 +1,3 @@ -from __future__ import annotations - import copy import warnings @@ -72,10 +70,10 @@ class PGIsmallness(Smallness): ``tensor``, ``QuadTree`` or ``Octree`` meshes. approx_gradient : bool If ``True``, use the L2-approximation of the gradient by assuming - physical property values of different types are uncorrelated. + the physical property distributions of each geologic units are distinct approx_eval : bool If ``True``, use the L2-approximation evaluation of the smallness term by assuming - physical property values of different types are uncorrelated. + the physical property distributions of each geologic units are distinct approx_hessian : bool Approximate the Hessian of the regularization function. non_linear_relationship : bool @@ -472,30 +470,22 @@ def __call__(self, m, external_weights=True): r0 = (W * mkvc(dmr)).reshape(dmr.shape, order="F") if self.gmm.covariance_type == "tied": - r1 = np.r_[ - [np.dot(self.gmm.precisions_, np.r_[r0[i]]) for i in range(len(r0))] - ] + r1 = mkvc(np.dot(self.gmm.precisions_, r0.T).T) elif ( self.gmm.covariance_type == "diag" or self.gmm.covariance_type == "spherical" ): - r1 = np.r_[ - [ - np.dot( - self.gmm.precisions_[membership[i]] - * np.eye(len(self.wiresmap.maps)), - np.r_[r0[i]], - ) - for i in range(len(r0)) - ] - ] + r1 = np.zeros_like(r0) + for i in range(self.gmm.n_components): + selection = membership == i + r1[selection] = r0[selection] * self.gmm.precisions_[i].T + r1 = mkvc(r1) else: - r1 = np.r_[ - [ - np.dot(self.gmm.precisions_[membership[i]], np.r_[r0[i]]) - for i in range(len(r0)) - ] - ] + r1 = np.zeros_like(r0) + for i in range(self.gmm.n_components): + selection = membership == i + r1[selection] = (self.gmm.precisions_[i] @ r0[selection].T).T + r1 = mkvc(r1) return mkvc(r0).dot(mkvc(r1)) @@ -569,25 +559,17 @@ def deriv(self, m): if self.non_linear_relationships: raise Exception("Not implemented") - r = mkvc( - np.r_[[np.dot(self.gmm.precisions_, r0[i]) for i in range(len(r0))]] - ) + r = mkvc(np.dot(self.gmm.precisions_, r0.T).T) elif ( self.gmm.covariance_type == "diag" or self.gmm.covariance_type == "spherical" ) and not self.non_linear_relationships: - r = mkvc( - np.r_[ - [ - np.dot( - self.gmm.precisions_[membership[i]] - * np.eye(len(self.wiresmap.maps)), - r0[i], - ) - for i in range(len(r0)) - ] - ] - ) + r = np.zeros_like(r0) + for i in range(self.gmm.n_components): + selection = membership == i + r[selection] = r0[selection] * self.gmm.precisions_[i].T + r = mkvc(r) + else: if self.non_linear_relationships: r = mkvc( @@ -608,14 +590,11 @@ def deriv(self, m): else: r0 = (self.W * (mkvc(dm))).reshape(dm.shape, order="F") - r = mkvc( - np.r_[ - [ - np.dot(self.gmm.precisions_[membership[i]], r0[i]) - for i in range(len(r0)) - ] - ] - ) + r = np.zeros_like(r0) + for i in range(self.gmm.n_components): + selection = membership == i + r[selection] = (self.gmm.precisions_[i] @ r0[selection].T).T + r = mkvc(r) return 2 * mkvc(mD.T * (self.W.T * r)) else: @@ -842,9 +821,7 @@ def deriv2(self, m, v=None): mDv = np.c_[mDv] r0 = (self.W * (mkvc(mDv))).reshape(mDv.shape, order="F") second_deriv_times_r0 = mkvc( - np.r_[ - [np.dot(self._r_second_deriv[i], r0[i]) for i in range(len(r0))] - ] + np.einsum("ijk,ik->ij", self._r_second_deriv, r0) ) return 2 * mkvc(mD.T * (self.W * second_deriv_times_r0)) else: diff --git a/simpeg/regularization/sparse.py b/simpeg/regularization/sparse.py index a917e7ecbd..b5ba938866 100644 --- a/simpeg/regularization/sparse.py +++ b/simpeg/regularization/sparse.py @@ -1,5 +1,3 @@ -from __future__ import annotations - import numpy as np from discretize.base import BaseMesh diff --git a/simpeg/regularization/vector.py b/simpeg/regularization/vector.py index cc2f628c44..579e57e9bb 100644 --- a/simpeg/regularization/vector.py +++ b/simpeg/regularization/vector.py @@ -1,15 +1,10 @@ -from __future__ import annotations -from typing import TYPE_CHECKING - import scipy.sparse as sp import numpy as np from .base import Smallness from discretize.base import BaseMesh from .base import RegularizationMesh, BaseRegularization from .sparse import Sparse, SparseSmallness, SparseSmoothness - -if TYPE_CHECKING: - from scipy.sparse import csr_matrix +from scipy.sparse import csr_matrix class BaseVectorRegularization(BaseRegularization): diff --git a/simpeg/seismic/straight_ray_tomography/simulation.py b/simpeg/seismic/straight_ray_tomography/simulation.py index 35916d2ab2..1070f1d544 100644 --- a/simpeg/seismic/straight_ray_tomography/simulation.py +++ b/simpeg/seismic/straight_ray_tomography/simulation.py @@ -1,9 +1,10 @@ +import discretize import numpy as np import scipy.sparse as sp import matplotlib.pyplot as plt from ...simulation import LinearSimulation -from ...utils import sub2ind +from ...utils import sub2ind, validate_type from ... import props @@ -77,13 +78,25 @@ def _lineintegral(M, Tx, Rx): class Simulation2DIntegral(LinearSimulation): slowness, slownessMap, slownessDeriv = props.Invertible("Slowness model (1/v)") - def __init__( - self, mesh=None, survey=None, slowness=None, slownessMap=None, **kwargs - ): - super().__init__(mesh=mesh, survey=survey, **kwargs) + def __init__(self, mesh, survey=None, slowness=None, slownessMap=None, **kwargs): + self.mesh = mesh + super().__init__(survey=survey, **kwargs) self.slowness = slowness self.slownessMap = slownessMap + @property + def mesh(self): + return self._mesh + + @mesh.setter + def mesh(self, value): + value = validate_type("mesh", value, discretize.TensorMesh, cast=False) + if value.dim != 2: + raise ValueError( + f"{type(self).__name__} mesh must be 2D, received a {value.dim}D mesh." + ) + self._mesh = value + @property def A(self): if getattr(self, "_A", None) is not None: diff --git a/simpeg/simulation.py b/simpeg/simulation.py index 0158205bb3..49e27949fc 100644 --- a/simpeg/simulation.py +++ b/simpeg/simulation.py @@ -2,15 +2,12 @@ Define simulation classes. """ -from __future__ import annotations # needed to use type operands in Python 3.8 import os -import inspect import numpy as np import warnings -from discretize.base import BaseMesh from discretize import TensorMesh -from discretize.utils import unpack_widths, sdiag +from discretize.utils import unpack_widths, sdiag, mkvc from . import props from .typing import RandomSeed @@ -20,18 +17,13 @@ Counter, timeIt, count, - mkvc, validate_ndarray_with_shape, validate_float, validate_type, validate_string, validate_integer, ) - -try: - from pymatsolver import Pardiso as DefaultSolver -except ImportError: - from .utils.solver_utils import SolverLU as DefaultSolver +import uuid __all__ = ["LinearSimulation", "ExponentialSinusoidSimulation"] @@ -55,19 +47,8 @@ class BaseSimulation(props.HasModel): Parameters ---------- - mesh : discretize.base.BaseMesh, optional - Mesh on which the forward problem is discretized. survey : simpeg.survey.BaseSurvey, optional The survey for the simulation. - solver : None or pymatsolver.base.Base, optional - Numerical solver used to solve the forward problem. If ``None``, - an appropriate solver specific to the simulation class is set by default. - solver_opts : dict, optional - Solver-specific parameters. If ``None``, default parameters are used for - the solver set by ``solver``. Otherwise, the ``dict`` must contain appropriate - pairs of keyword arguments and parameter values for the solver. Please visit - `pymatsolver `__ to learn more - about solvers and their parameters. sensitivity_path : str, optional Path to directory where sensitivity file is stored. counter : None or simpeg.utils.Counter @@ -80,50 +61,23 @@ class BaseSimulation(props.HasModel): def __init__( self, - mesh=None, survey=None, - solver=None, - solver_opts=None, sensitivity_path=None, counter=None, verbose=False, **kwargs, ): self._store_sensitivities: str | None = None - self.mesh = mesh self.survey = survey - if solver is None: - solver = DefaultSolver - self.solver = solver - if solver_opts is None: - solver_opts = {} - self.solver_opts = solver_opts if sensitivity_path is None: sensitivity_path = os.path.join(".", "sensitivity") self.sensitivity_path = sensitivity_path self.counter = counter self.verbose = verbose - super().__init__(**kwargs) - - @property - def mesh(self): - """Mesh for the simulation. - - For more on meshes, visit :py:class:`discretize.base.BaseMesh`. + self._uuid = uuid.uuid4() - Returns - ------- - discretize.base.BaseMesh - Mesh on which the forward problem is discretized. - """ - return self._mesh - - @mesh.setter - def mesh(self, value): - if value is not None: - value = validate_type("mesh", value, BaseMesh, cast=False) - self._mesh = value + super().__init__(**kwargs) @property def survey(self): @@ -174,60 +128,6 @@ def sensitivity_path(self): def sensitivity_path(self, value): self._sensitivity_path = validate_string("sensitivity_path", value) - @property - def solver(self): - r"""Numerical solver used in the forward simulation. - - Many forward simulations in SimPEG require solutions to discrete linear - systems of the form: - - .. math:: - \mathbf{A}(\mathbf{m}) \, \mathbf{u} = \mathbf{q} - - where :math:`\mathbf{A}` is an invertible matrix that depends on the - model :math:`\mathbf{m}`. The numerical solver can be set using the - ``solver`` property. In SimPEG, the - `pymatsolver `__ package - is used to create solver objects. Parameters specific to each solver - can be set manually using the ``solver_opts`` property. - - Returns - ------- - pymatsolver.base.Base - Numerical solver used to solve the forward problem. - """ - return self._solver - - @solver.setter - def solver(self, cls): - if cls is not None: - if not inspect.isclass(cls): - raise TypeError(f"solver must be a class, not a {type(cls)}") - if not hasattr(cls, "__mul__"): - raise TypeError("solver must support the multiplication operator, `*`.") - self._solver = cls - - @property - def solver_opts(self): - """Solver-specific parameters. - - The parameters specific to the solver set with the ``solver`` property are set - upon instantiation. The ``solver_opts`` property is used to set solver-specific properties. - This is done by providing a ``dict`` that contains appropriate pairs of keyword arguments - and parameter values. Please visit `pymatsolver `__ - to learn more about solvers and their parameters. - - Returns - ------- - dict - keyword arguments and parameters passed to the solver. - """ - return self._solver_opts - - @solver_opts.setter - def solver_opts(self, value): - self._solver_opts = validate_type("solver_opts", value, dict, cast=False) - @property def verbose(self): """Verbose progress printout. @@ -567,9 +467,6 @@ class BaseTimeSimulation(BaseSimulation): Parameters ---------- - mesh : discretize.base.BaseMesh, optional - Mesh on which the forward problem is discretized. This is not necessarily - the same as the mesh on which the simulation is defined. t0 : float, optional Initial time, in seconds, for the time-dependent forward simulation. time_steps : (n_steps, ) numpy.ndarray, optional @@ -598,10 +495,10 @@ class BaseTimeSimulation(BaseSimulation): representation. """ - def __init__(self, mesh=None, t0=0.0, time_steps=None, **kwargs): + def __init__(self, t0=0.0, time_steps=None, **kwargs): self.t0 = t0 self.time_steps = time_steps - super().__init__(mesh=mesh, **kwargs) + super().__init__(**kwargs) @property def time_steps(self): @@ -765,9 +662,6 @@ class LinearSimulation(BaseSimulation): Parameters ---------- - mesh : discretize.BaseMesh, optional - Mesh on which the forward problem is discretized. This is not necessarily - the same as the mesh on which the simulation is defined. model_map : simpeg.maps.BaseMap Mapping from the model parameters to vector that the linear operator acts on. G : (n_data, n_param) numpy.ndarray or scipy.sparse.csr_matrx @@ -780,11 +674,10 @@ class LinearSimulation(BaseSimulation): "The model for a linear problem" ) - def __init__(self, mesh=None, linear_model=None, model_map=None, G=None, **kwargs): - super().__init__(mesh=mesh, **kwargs) + def __init__(self, linear_model=None, model_map=None, G=None, **kwargs): + super().__init__(**kwargs) self.linear_model = linear_model self.model_map = model_map - self.solver = None if G is not None: self.G = G @@ -923,6 +816,8 @@ class ExponentialSinusoidSimulation(LinearSimulation): Parameters ---------- + mesh : discretize.TensorMesh + 1D TensorMesh defining the discretization of the model space. n_kernels : int The number of kernel factors for the linear problem; i.e. the number of :math:`j_i \in [j_0, ... , j_n]`. This sets the number of rows @@ -937,7 +832,8 @@ class ExponentialSinusoidSimulation(LinearSimulation): Maximum value for the spread of the kernel factors. """ - def __init__(self, n_kernels=20, p=-0.25, q=0.25, j0=0.0, jn=60.0, **kwargs): + def __init__(self, mesh, n_kernels=20, p=-0.25, q=0.25, j0=0.0, jn=60.0, **kwargs): + self.mesh = mesh self.n_kernels = n_kernels self.p = p self.q = q @@ -945,6 +841,26 @@ def __init__(self, n_kernels=20, p=-0.25, q=0.25, j0=0.0, jn=60.0, **kwargs): self.jn = jn super(ExponentialSinusoidSimulation, self).__init__(**kwargs) + @property + def mesh(self): + """Mesh for the simulation. + + Returns + ------- + discretize.TensorMesh + Mesh on which the forward problem is discretized. + """ + return self._mesh + + @mesh.setter + def mesh(self, value): + value = validate_type("mesh", value, TensorMesh, cast=False) + if value.dim != 1: + raise ValueError( + f"{type(self).__name__} mesh must be 1D, received a {value.dim}D mesh." + ) + self._mesh = value + @property def n_kernels(self): r"""The number of kernel factors for the linear problem. diff --git a/simpeg/typing/__init__.py b/simpeg/typing/__init__.py index 07975782bd..f0d4d57b78 100644 --- a/simpeg/typing/__init__.py +++ b/simpeg/typing/__init__.py @@ -16,30 +16,17 @@ """ -from __future__ import annotations import numpy as np import numpy.typing as npt -from typing import Union - -# Use try and except to support Python<3.10 -try: - from typing import TypeAlias - - RandomSeed: TypeAlias = Union[ - int, - npt.NDArray[np.int_], - np.random.SeedSequence, - np.random.BitGenerator, - np.random.Generator, - ] -except ImportError: - RandomSeed = Union[ - int, - npt.NDArray[np.int_], - np.random.SeedSequence, - np.random.BitGenerator, - np.random.Generator, - ] +from typing import Union, TypeAlias + +RandomSeed: TypeAlias = Union[ + int, + npt.NDArray[np.int_], + np.random.SeedSequence, + np.random.BitGenerator, + np.random.Generator, +] RandomSeed.__doc__ = """ A ``typing.Union`` for random seeds and Numpy's random number generators. diff --git a/simpeg/utils/__init__.py b/simpeg/utils/__init__.py index d5506d510c..6e0895fd45 100644 --- a/simpeg/utils/__init__.py +++ b/simpeg/utils/__init__.py @@ -76,6 +76,7 @@ :toctree: generated/ depth_weighting + distance_weighting model_builder.add_block model_builder.create_2_layer_model model_builder.create_block_in_wholespace @@ -141,6 +142,16 @@ validate_direction validate_active_indices +Solver utilities +---------------- +This module contains utilities to get and set the default solver +used by SimPEG simulations. + +.. autosummary:: + :toctree: generated/ + + solver_utils.get_default_solver + solver_utils.set_default_solver """ from discretize.utils.interpolation_utils import interpolation_matrix @@ -225,7 +236,7 @@ rotation_matrix_from_normals, rotate_points_from_normals, ) -from .model_utils import depth_weighting +from .model_utils import depth_weighting, distance_weighting from .plot_utils import plot2Ddata, plotLayer, plot_1d_layer_model from .io_utils import download from .pgi_utils import ( diff --git a/simpeg/utils/code_utils.py b/simpeg/utils/code_utils.py index 8c2014b216..e0aef08c5a 100644 --- a/simpeg/utils/code_utils.py +++ b/simpeg/utils/code_utils.py @@ -1,10 +1,10 @@ -from __future__ import annotations import types import numpy as np from functools import wraps import warnings from discretize.utils import as_array_n_by_dim # noqa: F401 +from discretize.utils import requires as module_requires # scooby is a soft dependency for simpeg try: @@ -20,6 +20,12 @@ def __init__(self, additional, core, optional, ncol, text_width, sort): ) +try: + import memory_profiler +except ImportError: + memory_profiler = False + + def requires(var): """Wrap a function to require a specfic attribute. @@ -80,7 +86,7 @@ def requiresVarWrapper(self, *args, **kwargs): return requiresVar -@requires("memory_profiler") +@module_requires({"memory_profiler": memory_profiler}) def mem_profile_class(input_class, *args): """Creates a new class from the target class with memory profiled methods. @@ -471,11 +477,9 @@ def __init__(self, add_pckg=None, ncol=3, text_width=80, sort=False): "pymatsolver", "numpy", "scipy", - "sklearn", "matplotlib", - "empymod", "geoana", - "pandas", + "libdlf", ] # Optional packages. @@ -484,6 +488,8 @@ def __init__(self, add_pckg=None, ncol=3, text_width=80, sort=False): "pydiso", "numba", "dask", + "sklearn", + "pandas", "sympy", "IPython", "ipywidgets", @@ -510,7 +516,11 @@ def __init__(self, add_pckg=None, ncol=3, text_width=80, sort=False): def deprecate_class( - removal_version=None, new_location=None, future_warn=False, error=False + removal_version=None, + new_location=None, + future_warn=False, + error=False, + replace_docstring=True, ): """Utility function to deprecate a class @@ -557,7 +567,8 @@ def __init__(self, *args, **kwargs): cls.__init__ = __init__ if new_location is not None: parent_name = f"{new_location}.{parent_name}" - cls.__doc__ = f""" This class has been deprecated, see `{parent_name}` for documentation""" + if replace_docstring: + cls.__doc__ = f""" This class has been deprecated, see `{parent_name}` for documentation""" return cls return decorator @@ -1028,7 +1039,10 @@ def validate_ndarray_with_shape(property_name, var, shape=None, dtype=float): dtypes = dtype for dtype in dtypes: try: - var = np.asarray(var, dtype=dtype) + if isinstance(var, np.ndarray): + var = var.astype(dtype, casting="safe", copy=False) + else: + var = np.asarray(var, dtype=dtype) bad_type = False break except (TypeError, ValueError) as err: @@ -1102,21 +1116,42 @@ def validate_type(property_name, obj, obj_type, cast=True, strict=False): obj_type Returns the object in the specified type when validated """ + if not isinstance(obj_type, tuple): + obj_type = (obj_type,) + + if len(obj_type) > 1: + type_name = ( + ", ".join(cls.__qualname__ for cls in obj_type[:-1]) + + " or " + + obj_type[-1].__qualname__ + ) + else: + type_name = obj_type[0].__qualname__ + if cast: - try: - obj = obj_type(obj) - except Exception as err: + good_cast = False + err = None + for cls in obj_type: + try: + new_obj = cls(obj) + good_cast = True + except Exception as trial_error: + err = trial_error + if good_cast: + obj = new_obj + break + if not good_cast: raise TypeError( - f"{type(obj).__name__} cannot be converted to type {obj_type.__name__} " + f"{type(obj).__qualname__} cannot be converted to {type_name} " f"required for {property_name}." ) from err - if strict and type(obj) is not obj_type: + if strict and type(obj) not in obj_type: raise TypeError( - f"Object must be exactly a {obj_type.__name__} for {property_name}" + f"{property_name} must be exactly a {type_name}, not {type(obj).__qualname__}" ) if not isinstance(obj, obj_type): raise TypeError( - f"Object must be an instance of {obj_type.__name__} for {property_name}" + f"{property_name} must be an instance of {type_name}, not {type(obj).__qualname__}" ) return obj diff --git a/simpeg/utils/mat_utils.py b/simpeg/utils/mat_utils.py index 346a999993..d47b7d3df6 100644 --- a/simpeg/utils/mat_utils.py +++ b/simpeg/utils/mat_utils.py @@ -1,4 +1,4 @@ -from __future__ import annotations # needed to use type operands in Python 3.8 +import warnings import numpy as np from .code_utils import deprecate_function from ..typing import RandomSeed @@ -123,11 +123,7 @@ def unique_rows(M): Indices to project from output array to input array """ - b = np.ascontiguousarray(M).view(np.dtype((np.void, M.dtype.itemsize * M.shape[1]))) - _, unqInd = np.unique(b, return_index=True) - _, invInd = np.unique(b, return_inverse=True) - unqM = M[unqInd] - return unqM, unqInd, invInd + return np.unique(M, return_index=True, return_inverse=True, axis=0) def eigenvalue_by_power_iteration( @@ -135,6 +131,7 @@ def eigenvalue_by_power_iteration( model, n_pw_iter=4, fields_list=None, + random_seed: RandomSeed | None = None, seed: RandomSeed | None = None, ): r"""Estimate largest eigenvalue in absolute value using power iteration. @@ -156,10 +153,16 @@ def eigenvalue_by_power_iteration( they will be evaluated within the function. If combo_objfct mixs data misfit and regularization terms, the list should contains simpeg.fields for the data misfit terms and None for the regularization term. - seed : None or :class:`~simpeg.typing.RandomSeed`, optional + random_seed : None or :class:`~simpeg.typing.RandomSeed`, optional Random seed for the initial random guess of eigenvector. It can either be an int, a predefined Numpy random number generator, or any valid input to ``numpy.random.default_rng``. + seed : None or :class:`~simpeg.typing.RandomSeed`, optional + + .. deprecated:: 0.23.0 + + Argument ``seed`` is deprecated in favor of ``random_seed`` and will + be removed in SimPEG v0.24.0. Returns ------- @@ -172,19 +175,36 @@ def eigenvalue_by_power_iteration( approximated by the Rayleigh quotient: .. math:: + \lambda_k = \frac{\mathbf{x_k^T A x_k}}{\mathbf{x_k^T x_k}} - where :math:`\mathfb{A}` is our matrix and :math:`\mathfb{x_k}` is computed + where :math:`\mathbf{A}` is our matrix and :math:`\mathbf{x_k}` is computed recursively according to: .. math:: + \mathbf{x_{k+1}} = \frac{\mathbf{A x_k}}{\| \mathbf{Ax_k} \|} The elements of the initial vector :math:`\mathbf{x_0}` are randomly selected from a uniform distribution. """ - rng = np.random.default_rng(seed=seed) + # Deprecate seed argument + if seed is not None: + if random_seed is not None: + raise TypeError( + "Cannot pass both 'random_seed' and 'seed'." + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + ) + warnings.warn( + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + FutureWarning, + stacklevel=2, + ) + random_seed = seed + rng = np.random.default_rng(seed=random_seed) # Initial guess for eigen-vector x0 = rng.random(size=model.shape) diff --git a/simpeg/utils/model_builder.py b/simpeg/utils/model_builder.py index c3a68abcec..285a440a8a 100644 --- a/simpeg/utils/model_builder.py +++ b/simpeg/utils/model_builder.py @@ -1,4 +1,4 @@ -from __future__ import annotations # needed to use type operands in Python 3.8 +import warnings import numpy as np import scipy.ndimage as ndi import scipy.sparse as sp @@ -419,10 +419,11 @@ def create_layers_model(cell_centers, layer_tops, layer_values): def create_random_model( shape, - seed: RandomSeed | None = 1000, + random_seed: RandomSeed | None = 1000, anisotropy=None, its=100, bounds=None, + **kwargs, ): """ Create random model by convolving a kernel with a uniformly distributed random model. @@ -430,8 +431,9 @@ def create_random_model( Parameters ---------- shape : int or tuple of int - Shape of the model. Can define a vector of size (n_cells) or define the dimensions of a tensor - seed : None or :class:`~simpeg.typing.RandomSeed`, optional + Shape of the model. Can define a vector of size (n_cells) or define the + dimensions of a tensor. + random_seed : None or :class:`~simpeg.typing.RandomSeed`, optional Random seed for random uniform model that is convolved with the kernel. It can either be an int, a predefined Numpy random number generator, or any valid input to ``numpy.random.default_rng``. @@ -441,6 +443,12 @@ def create_random_model( Number of smoothing iterations after convolutions bounds : list of float Lower and upper bound for the model values + seed : None or :class:`~simpeg.typing.RandomSeed`, optional + + .. deprecated:: 0.23.0 + + Argument ``seed`` is deprecated in favor of ``random_seed`` and will + be removed in SimPEG v0.24.0. Returns ------- @@ -459,13 +467,33 @@ def create_random_model( >>> plt.show() """ + # Deprecate seed argument + if "seed" in kwargs: + if random_seed != 1000: + raise TypeError( + "Cannot pass both 'random_seed' and 'seed'." + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + ) + warnings.warn( + "'seed' has been deprecated and will be removed in " + " SimPEG v0.24.0, please use 'random_seed' instead.", + FutureWarning, + stacklevel=2, + ) + random_seed = kwargs.pop("seed") + if kwargs: + args = ", ".join([f"'{key}'" for key in kwargs]) + raise TypeError(f"Invalid arguments {args}.") + # --- + if bounds is None: bounds = [0, 1] if isinstance(shape, int): shape = (shape,) # make it a tuple for consistency - rng = np.random.default_rng(seed=seed) + rng = np.random.default_rng(seed=random_seed) mr = rng.random(size=shape) if anisotropy is None: if len(shape) == 1: diff --git a/simpeg/utils/model_utils.py b/simpeg/utils/model_utils.py index 91df15da71..dc48a0e17c 100644 --- a/simpeg/utils/model_utils.py +++ b/simpeg/utils/model_utils.py @@ -1,8 +1,27 @@ -from .mat_utils import mkvc +import warnings +from typing import Literal, Optional + +import discretize import numpy as np +import scipy.sparse as sp from scipy.interpolate import griddata from scipy.spatial import cKDTree -import scipy.sparse as sp +from scipy.spatial.distance import cdist + +from .mat_utils import mkvc + +try: + import numba + from numba import njit, prange +except ImportError: + numba = None + + # Define dummy njit decorator + def njit(*args, **kwargs): + return lambda f: f + + # Define dummy prange function + prange = range def surface_layer_index(mesh, topo, index=0): @@ -150,3 +169,174 @@ def depth_weighting( wz = wz[active_cells] return wz / np.nanmax(wz) + + +@njit(parallel=True) +def _distance_weighting_numba( + cell_centers: np.ndarray, + reference_locs: np.ndarray, + threshold: float, + exponent: float = 2.0, +) -> np.ndarray: + r""" + distance weighting kernel in numba. + + If numba is not installed, this will work as a regular for loop. + + Parameters + ---------- + cell_centers : np.ndarray + cell centers of the mesh. + reference_locs : (n, ndim) numpy.ndarray + The coordinate of the reference location, usually the receiver locations, + for the distance weighting. + A 2d array, with multiple reference locations, where each row should + contain the coordinates of a single location point in the following + order: _x_, _y_, _z_ (for 3D meshes) or _x_, _z_ (for 2D meshes). + threshold : float + Threshold parameters used in the distance weighting. + exponent : float, optional + Exponent parameter for distance weighting. + The exponent should match the natural decay power of the potential + field. For example, for gravity acceleration, set it to 2; for magnetic + fields, to 3. + + Returns + ------- + (n_active) numpy.ndarray + Normalized distance weights for the mesh at every active cell as + a 1d-array. + """ + n_active_cells = cell_centers.shape[0] + n_reference_locs = len(reference_locs) + + distance_weights = np.zeros(n_active_cells) + for j in prange(n_active_cells): + cell_center = cell_centers[j] + for i in range(n_reference_locs): + reference_loc = reference_locs[i] + distance = np.sqrt(((cell_center - reference_loc) ** 2).sum()) + distance_weights[j] += (distance + threshold) ** (-2 * exponent) + + distance_weights = np.sqrt(distance_weights) + distance_weights /= np.nanmax(distance_weights) + return distance_weights + + +def distance_weighting( + mesh: discretize.base.BaseMesh, + reference_locs: np.ndarray, + active_cells: Optional[np.ndarray] = None, + exponent: Optional[float] = 2.0, + threshold: Optional[float] = None, + engine: Literal["numba", "scipy"] = "numba", + cdist_opts: Optional[dict] = None, +): + r""" + Construct diagonal elements of a distance weighting matrix + + Builds the model weights following the distance weighting strategy, a method + to generate weights based on the distance between mesh cell centers and some + reference location(s). + Use these weights in regularizations to counteract the natural decay of + potential field data with distance. + + Parameters + ---------- + mesh : discretize.base.BaseMesh + Discretized model space. + reference_locs : (n, ndim) numpy.ndarray + The coordinate of the reference location, usually the receiver locations, + for the distance weighting. + A 2d array, with multiple reference locations, where each row should + contain the coordinates of a single location point in the following + order: _x_, _y_, _z_ (for 3D meshes) or _x_, _z_ (for 2D meshes). + active_cells : (mesh.n_cells) numpy.ndarray of bool, optional + Index vector for the active cells on the mesh. + If ``None``, every cell will be assumed to be active. + exponent : float or None, optional + Exponent parameter for distance weighting. + The exponent should match the natural decay power of the potential + field. For example, for gravity acceleration, set it to 2; for magnetic + fields, to 3. + threshold : float or None, optional + Threshold parameters used in the distance weighting. + If ``None``, it will be set to half of the smallest cell width. + engine: str, 'numba' or 'scipy' + Pick between a ``scipy.spatial.distance.cdist`` computation (memory + intensive) or `for` loop implementation, parallelized with numba if + available. Default to ``"numba"``. + cdist_opts: dict, optional + Only valid with ``engine=="scipy"``. Options to pass to + ``scipy.spatial.distance.cdist``. Default to None. + + Returns + ------- + (n_active) numpy.ndarray + Normalized distance weights for the mesh at every active cell as + a 1d-array. + """ + + active_cells = ( + np.ones(mesh.n_cells, dtype=bool) if active_cells is None else active_cells + ) + + # Default threshold value + if threshold is None: + threshold = 0.5 * mesh.h_gridded.min() + + reference_locs = np.atleast_2d(reference_locs) + cell_centers = mesh.cell_centers[active_cells] + + # address 1D case + if mesh.dim == 1: + cell_centers = cell_centers.reshape(-1, 1) + reference_locs = reference_locs.reshape(-1, 1) + + if reference_locs.shape[1] != mesh.dim: + raise ValueError( + f"Invalid 'reference_locs' with shape '{reference_locs.shape}'. " + "The number of columns of the reference_locs array should match " + f"the dimensions of the mesh ({mesh.dim})." + ) + + if engine == "numba" and cdist_opts is not None: + raise TypeError( + "The `cdist_opts` is valid only when engine is 'scipy'." + "The current engine is 'numba'." + ) + + if engine == "numba": + if numba is None: + warnings.warn( + "Numba is not installed. Distance computations will be slower.", + stacklevel=2, + ) + distance_weights = _distance_weighting_numba( + cell_centers, + reference_locs, + exponent=exponent, + threshold=threshold, + ) + + elif engine == "scipy": + warnings.warn( + "``scipy.spatial.distance.cdist`` computations can be memory intensive. " + "Consider switching to `engine='numba'` " + "if you run into memory overflow issues.", + stacklevel=2, + ) + cdist_opts = cdist_opts or dict() + distance = cdist(cell_centers, reference_locs, **cdist_opts) + + distance_weights = (((distance + threshold) ** exponent) ** -2).sum(axis=1) + + distance_weights = distance_weights**0.5 + distance_weights /= np.nanmax(distance_weights) + + else: + raise ValueError( + f"Invalid engine '{engine}'. Engine should be either 'scipy' or 'numba'." + ) + + return distance_weights diff --git a/simpeg/utils/pgi_utils.py b/simpeg/utils/pgi_utils.py index 638b94cfb3..1c5c9c8f8a 100644 --- a/simpeg/utils/pgi_utils.py +++ b/simpeg/utils/pgi_utils.py @@ -3,35 +3,45 @@ from mpl_toolkits.axes_grid1.inset_locator import inset_axes from scipy import linalg from scipy.special import logsumexp -from sklearn.mixture import GaussianMixture -from sklearn.cluster import KMeans -from sklearn.utils import check_array -from sklearn.utils.validation import check_is_fitted -from sklearn.mixture._gaussian_mixture import ( - _compute_precision_cholesky, - _compute_log_det_cholesky, - _estimate_gaussian_covariances_full, - _estimate_gaussian_covariances_diag, - _estimate_gaussian_covariances_spherical, - _check_means, - _check_precisions, - _check_shape, -) -from sklearn.mixture._base import check_random_state, ConvergenceWarning import warnings from simpeg.maps import IdentityMap +from discretize.utils.code_utils import requires + +# sklearn is a soft dependency +try: + import sklearn + from sklearn.mixture import GaussianMixture + from sklearn.cluster import KMeans + from sklearn.utils import check_array + from sklearn.utils.validation import check_is_fitted + from sklearn.mixture._gaussian_mixture import ( + _compute_precision_cholesky, + _compute_log_det_cholesky, + _estimate_gaussian_covariances_full, + _estimate_gaussian_covariances_diag, + _estimate_gaussian_covariances_spherical, + _check_means, + _check_precisions, + _check_shape, + ) + from sklearn.mixture._base import check_random_state, ConvergenceWarning + +except ImportError: + GaussianMixture = None + sklearn = False + ############################################################################### # Disclaimer: the following classes built upon the GaussianMixture class # -# from Scikit-Learn. New functionalitie are added, as well as modifications to# -# existing functions, to serve the purposes pursued within SimPEG. # +# from Scikit-Learn. New functionalities are added, as well as modifications # +# to existing functions, to serve the purposes pursued within SimPEG. # # This use is allowed by the Scikit-Learn licensing (BSD-3-Clause License) # -# and we are grateful for their contributions to the open-source community. # # +# and we are grateful for their contributions to the open-source community. # ############################################################################### -class WeightedGaussianMixture(GaussianMixture): +class WeightedGaussianMixture(GaussianMixture if sklearn else object): """ Weighted Gaussian mixture class @@ -65,6 +75,7 @@ class WeightedGaussianMixture(GaussianMixture): Active indexes """ + @requires({"sklearn": sklearn}) def __init__( self, n_components, @@ -201,12 +212,14 @@ def _check_weights(self, weights, n_components, n_samples): The proportions of components of each mixture. n_components : int Number of components. + n_samples : int or None + Number of samples. Returns ------- - weights : array, shape (n_components,) + weights : (n_components,) or (n_samples, n_components) numpy.ndarray """ - + weights = np.asarray(weights) if len(weights.shape) == 2: weights = check_array( weights, dtype=[np.float64, np.float32], ensure_2d=True @@ -219,7 +232,7 @@ def _check_weights(self, weights, n_components, n_samples): _check_shape(weights, (n_components,), "weights") # check range - if any(np.less(weights, 0.0)) or any(np.greater(weights, 1.0)): + if (weights < 0.0).any() or (weights > 1.0).any(): raise ValueError( "The parameter 'weights' should be in the range " "[0, 1], but got max value %.5f, min value %.5f" @@ -841,6 +854,7 @@ class GaussianMixtureWithPrior(WeightedGaussianMixture): Shape is (index of the fixed cell, lithology index) fixed_membership: """ + @requires({"sklearn": sklearn}) def __init__( self, gmmref, @@ -1236,6 +1250,7 @@ class GaussianMixtureWithNonlinearRelationships(WeightedGaussianMixture): List of mapping describing a nonlinear relationships between physical properties; one per cluster/unit. """ + @requires({"sklearn": sklearn}) def __init__( self, mesh, @@ -1546,6 +1561,7 @@ class GaussianMixtureWithNonlinearRelationshipsWithPrior(GaussianMixtureWithPrio """ + @requires({"sklearn": sklearn}) def __init__( self, gmmref, diff --git a/simpeg/utils/solver_utils.py b/simpeg/utils/solver_utils.py index e5b4f343c4..55ffab0f1a 100644 --- a/simpeg/utils/solver_utils.py +++ b/simpeg/utils/solver_utils.py @@ -1,326 +1,114 @@ -import numpy as np -from scipy.sparse import linalg -from .mat_utils import mkvc +from pymatsolver import ( + AvailableSolvers, + Solver, + SolverLU, + SolverCG, + SolverBiCG, + Diagonal, + Pardiso, + Mumps, + wrap_direct, + wrap_iterative, +) +from pymatsolver.solvers import Base +from .code_utils import deprecate_function import warnings -import inspect - - -def _checkAccuracy(A, b, X, accuracyTol): - nrm = np.linalg.norm(mkvc(A * X - b), np.inf) - nrm_b = np.linalg.norm(mkvc(b), np.inf) - if nrm_b > 0: - nrm /= nrm_b - if nrm > accuracyTol: - msg = "### SolverWarning ###: Accuracy on solve is above tolerance: {0:e} > {1:e}".format( - nrm, accuracyTol - ) - print(msg) - warnings.warn(msg, RuntimeWarning, stacklevel=2) - - -def SolverWrapD(fun, factorize=True, checkAccuracy=True, accuracyTol=1e-6, name=None): - """Wraps a direct Solver.) - - Parameters - ---------- - fun : callable - A function handle that accepts a sparse matrix input. - factorize : bool, default: ``True`` - If True, `fun` returns a solver object that has `solve` and - `factorize` methods. - checkAccuracy : bool, default: ``True`` - If ``True``, verify the accuracy of the solve - accuracyTol : float, default: 1e-6 - Minimum accuracy of the solve - name : str, optional - A name for the function - - Returns - ------- - Solver - A new solver class created from a direct solver `fun`. - - Examples - -------- - A solver that does not have a factorize method. - - >>> from simpeg.utils.solver_utils import SolverWrapD - >>> import scipy.sparse as sp - >>> SpSolver = SolverWrapD(sp.linalg.spsolve, factorize=False) - >>> A = sp.diags([1, -1], [0, 1], shape=(10, 10)) - >>> b = np.arange(10) - >>> Ainv = SpSolver(A) - >>> x_solve = Ainv * b - >>> A @ x_solve - array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) - - Or one that has a factorize method (which can be re-used on multiple solves) - - >>> SolverLU = SolverWrapD(sp.linalg.splu, factorize=True) - >>> A = sp.diags([1, -1], [0, 1], shape=(10, 10)) - >>> b = np.arange(10) - >>> Ainv = SolverLU(A) - >>> x_solve = Ainv * b - >>> A @ x_solve - array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) - """ - - def __init__(self, A, **kwargs): - self.A = A.tocsc() - - self.checkAccuracy = kwargs.pop("checkAccuracy", checkAccuracy) - self.accuracyTol = kwargs.pop("accuracyTol", accuracyTol) - - func_params = inspect.signature(fun).parameters - # First test if function excepts **kwargs, - # in which case we do not need to cull the kwargs - do_cull = True - for param_name in func_params: - param = func_params[param_name] - if param.kind == inspect.Parameter.VAR_KEYWORD: - do_cull = False - if do_cull: - # build a dictionary of valid kwargs - culled_args = {} - for item in kwargs: - if item in func_params: - culled_args[item] = kwargs[item] - else: - warnings.warn( - f"{item} is not a valid keyword for {fun.__name__} and will be ignored", - stacklevel=2, - ) - kwargs = culled_args - - self.kwargs = kwargs - - if factorize: - self.solver = fun(self.A, **kwargs) - - def __mul__(self, b): - if not isinstance(b, np.ndarray): - raise TypeError("Can only multiply by a numpy array.") - - if len(b.shape) == 1 or b.shape[1] == 1: - b = b.flatten() - # Just one RHS - - if b.dtype is np.dtype("O"): - b = b.astype(type(b[0])) - - if factorize: - X = self.solver.solve(b, **self.kwargs) - else: - X = fun(self.A, b, **self.kwargs) - else: # Multiple RHSs - if b.dtype is np.dtype("O"): - b = b.astype(type(b[0, 0])) - - X = np.empty_like(b) - - for i in range(b.shape[1]): - if factorize: - X[:, i] = self.solver.solve(b[:, i]) - else: - X[:, i] = fun(self.A, b[:, i], **self.kwargs) - - if self.checkAccuracy: - _checkAccuracy(self.A, b, X, self.accuracyTol) - return X - - def __matmul__(self, other): - return self * other - - def clean(self): - if factorize and hasattr(self.solver, "clean"): - return self.solver.clean() - - return type( - name if name is not None else fun.__name__, - (object,), - { - "__init__": __init__, - "clean": clean, - "__mul__": __mul__, - "__matmul__": __matmul__, - }, - ) - - -def SolverWrapI(fun, checkAccuracy=True, accuracyTol=1e-5, name=None): - """Wraps an iterative Solver. +from typing import Type + +__all__ = [ + "Solver", + "SolverLU", + "SolverCG", + "SolverBiCG", + "Diagonal", + "Pardiso", + "Mumps", + "wrap_direct", + "wrap_iterative", + "get_default_solver", + "set_default_solver", + "SolverWrapD", + "SolverWrapI", + "SolverDiag", +] + +# The default direct solver priority is: +# Pardiso (optional, but available on intel systems) +# Mumps (optional, but available for all systems) +# Scipy's SuperLU (available for all scipy systems) +if AvailableSolvers["Pardiso"]: + _DEFAULT_SOLVER = Pardiso +elif AvailableSolvers["Mumps"]: + _DEFAULT_SOLVER = Mumps +else: + _DEFAULT_SOLVER = SolverLU + + +# Create a specific warning allowing users to silence this if they so choose. +class DefaultSolverWarning(UserWarning): + pass + + +def get_default_solver(warn=False) -> Type[Base]: + """Return the default solver used by simpeg. Parameters ---------- - fun : function - A function handle that accepts two arguments, a sparse matrix and a rhs array. - checkAccuracy : bool, default: ``True`` - If ``True``, verify the accuracy of the solve - accuracyTol : float, default: 1e-5 - Minimum accuracy of the solve - name : str, optional - A name for the function + warn : bool, optional + If True, a warning will be raised to let users know that the default + solver is being chosen depending on their system. Returns ------- - Solver - A new solver class created from the function. - - Examples - -------- - - >>> import scipy.sparse as sp - >>> from simpeg.utils.solver_utils import SolverWrapI - - >>> SolverCG = SolverWrapI(sp.linalg.cg) - >>> A = sp.diags([-1, 2, -1], [-1, 0, 1], shape=(10, 10)) - >>> b = np.arange(10) - >>> Ainv = SolverCG(A) - >>> x_solve = Ainv * b - >>> A @ x_solve - array([3.55271368e-15, 1.00000000e+00, 2.00000000e+00, 3.00000000e+00, - 4.00000000e+00, 5.00000000e+00, 6.00000000e+00, 7.00000000e+00, - 8.00000000e+00, 9.00000000e+00]) + solver + The default solver class used by simpeg's simulations. """ + if warn: + warnings.warn( + f"Using the default solver: {_DEFAULT_SOLVER.__name__}. \n\n" + f"If you would like to suppress this notification, add \n" + f"warnings.filterwarnings(" + "'ignore', simpeg.utils.solver_utils.DefaultSolverWarning)\n" + f" to your script.", + DefaultSolverWarning, + stacklevel=2, + ) + return _DEFAULT_SOLVER - def __init__(self, A, **kwargs): - self.A = A - - self.checkAccuracy = kwargs.pop("checkAccuracy", checkAccuracy) - self.accuracyTol = kwargs.pop("accuracyTol", accuracyTol) - - func_params = inspect.signature(fun).parameters - # First test if function excepts **kwargs, - # in which case we do not need to cull the kwargs - do_cull = True - for param_name in func_params: - param = func_params[param_name] - if param.kind == inspect.Parameter.VAR_KEYWORD: - do_cull = False - if do_cull: - # build a dictionary of valid kwargs - culled_args = {} - for item in kwargs: - if item in func_params: - culled_args[item] = kwargs[item] - else: - warnings.warn( - f"{item} is not a valid keyword for {fun.__name__} and will be ignored", - stacklevel=2, - ) - kwargs = culled_args - - self.kwargs = kwargs - - def __mul__(self, b): - if not isinstance(b, np.ndarray): - raise TypeError("Can only multiply by a numpy array.") - - if len(b.shape) == 1 or b.shape[1] == 1: - b = b.flatten() - # Just one RHS - out = fun(self.A, b, **self.kwargs) - if isinstance(out, tuple) and len(out) == 2: - # We are dealing with scipy output with an info! - X = out[0] - self.info = out[1] - else: - X = out - else: # Multiple RHSs - X = np.empty_like(b) - for i in range(b.shape[1]): - out = fun(self.A, b[:, i], **self.kwargs) - if isinstance(out, tuple) and len(out) == 2: - # We are dealing with scipy output with an info! - X[:, i] = out[0] - self.info = out[1] - else: - X[:, i] = out - - if self.checkAccuracy: - _checkAccuracy(self.A, b, X, self.accuracyTol) - return X - - def __matmul__(self, other): - return self * other - - def clean(self): - pass - - return type( - name if name is not None else fun.__name__, - (object,), - { - "__init__": __init__, - "clean": clean, - "__mul__": __mul__, - "__matmul__": __matmul__, - }, - ) - - -Solver = SolverWrapD(linalg.spsolve, factorize=False, name="Solver") -SolverLU = SolverWrapD(linalg.splu, factorize=True, name="SolverLU") -SolverCG = SolverWrapI(linalg.cg, name="SolverCG") -SolverBiCG = SolverWrapI(linalg.bicgstab, name="SolverBiCG") - - -class SolverDiag(object): - """Solver for a diagonal linear system - This is a simple solver used for diagonal matrices. +def set_default_solver(solver_class: Type[Base]): + """Set the default solver used by simpeg. Parameters ---------- - A : - A diagonal linear system - - Examples - -------- - >>> import scipy.sparse as sp - >>> from simpeg.utils.solver_utils import SolverDiag - >>> A = sp.diags(np.linspace(1, 2, 10)) - >>> b = np.arange(10) - >>> Ainv = SolverDiag(A) - >>> x_solve = Ainv * b - >>> A @ x_solve - array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) + solver_class + A ``pymatsolver.solvers.Base`` subclass used to construct an object + that acts os the inverse of a sparse matrix. """ - - def __init__(self, A, **kwargs): - self.A = A - self._diagonal = A.diagonal() - for kwarg in kwargs: - warnings.warn( - f"{kwarg} is not recognized and will be ignored", stacklevel=2 - ) - - def __mul__(self, rhs): - n = self.A.shape[0] - assert rhs.size % n == 0, "Incorrect shape of rhs." - nrhs = rhs.size // n - - if len(rhs.shape) == 1 or rhs.shape[1] == 1: - x = self._solve1(rhs) - else: - x = self._solveM(rhs) - - if nrhs == 1: - return x.flatten() - elif nrhs > 1: - return x.reshape((n, nrhs), order="F") - - def __matmul__(self, other): - return self * other - - def _solve1(self, rhs): - return rhs.flatten() / self._diagonal - - def _solveM(self, rhs): - n = self.A.shape[0] - nrhs = rhs.size // n - return rhs / self._diagonal.repeat(nrhs).reshape((n, nrhs)) - - def clean(self): - """Clean""" - pass + global _DEFAULT_SOLVER + if not issubclass(solver_class, Base): + raise TypeError( + "Default solver must be a subclass of pymatsolver.solvers.Base." + ) + _DEFAULT_SOLVER = solver_class + + +# should likely deprecate these classes in favor of the pymatsolver versions. +SolverWrapD = deprecate_function( + wrap_direct, + old_name="SolverWrapD", + removal_version="0.24.0", + new_location="pymatsolver", +) +SolverWrapI = deprecate_function( + wrap_iterative, + old_name="SolverWrapI", + removal_version="0.24.0", + new_location="pymatsolver", +) +SolverDiag = deprecate_function( + Diagonal, + old_name="SolverDiag", + removal_version="0.24.0", + new_location="pymatsolver", +) diff --git a/tests/base/props/test_has_model.py b/tests/base/props/test_has_model.py new file mode 100644 index 0000000000..5d7cc0d7db --- /dev/null +++ b/tests/base/props/test_has_model.py @@ -0,0 +1,115 @@ +import re + +import pytest +import numpy as np +import numpy.testing as npt +from simpeg import props, maps + + +@pytest.fixture(scope="module") +def mock_model_class(): + class MockModel(props.HasModel): + prop, prop_map, _prop_deriv = props.Invertible("test physical property") + other, other_map, _other_deriv = props.Invertible("another physical property") + + def __init__( + self, prop=None, prop_map=None, other=None, other_map=None, **kwargs + ): + self.prop = prop + self.prop_map = prop_map + self.other = other + self.other_map = other_map + super().__init__(**kwargs) + + @property + def prop_dependent_property(self): + if (thing := getattr(self, "_prop_dependent_property", None)) is None: + thing = 2 * self.prop + self._prop_dependent_property = thing + return thing + + @property + def _delete_on_model_update(self): + if self.prop_map is not None: + return ["_prop_dependent_property"] + return [] + + return MockModel + + +@pytest.fixture() +def modeler(mock_model_class): + prop_map = maps.ExpMap() + modeler = mock_model_class(prop_map=prop_map) + return modeler + + +def test_clear_on_model_change(modeler): + x = np.ones(10) + modeler.model = x + npt.assert_array_equal(np.exp(x), modeler.prop) + + item_1 = modeler.prop_dependent_property + assert item_1 is not None + + x2 = x + 1 + modeler.model = x2 + assert getattr(modeler, "_prop_dependent_property", None) is None + + item_2 = modeler.prop_dependent_property + assert item_2 is not None + assert item_1 is not item_2 + + +def test_no_clear_on_model_reassign(modeler): + x = np.ones(10) + + modeler.model = x + npt.assert_array_equal(np.exp(x), modeler.prop) + + item_1 = modeler.prop_dependent_property + assert item_1 is not None + + modeler.model = x.copy() + assert getattr(modeler, "_prop_dependent_property", None) is not None + + item_2 = modeler.prop_dependent_property + + assert item_1 is item_2 + + +def test_map_clearing(modeler): + modeler.prop = np.ones(10) + assert modeler.prop_map is None + + +def test_no_clear_without_mapping(modeler): + modeler.prop_map = None + modeler.other_map = maps.ExpMap() + modeler.prop = np.ones(10) + item1 = modeler.prop_dependent_property + assert item1 is not None + + modeler.model = np.zeros(10) + + assert getattr(modeler, "_prop_dependent_property", None) is not None + assert modeler.prop_dependent_property is item1 + + +def test_model_needed(modeler): + assert modeler.needs_model + + +def test_no_model_needed(modeler): + modeler.prop_map = None + assert not modeler.needs_model + + +def test_deletion_deprecation(modeler): + msg = re.escape("HasModel.deleteTheseOnModelUpdate has been deprecated") + ".*" + with pytest.warns(FutureWarning, match=msg): + modeler.deleteTheseOnModelUpdate + + msg = "clean_on_model_update has been deprecated due to repeated functionality.*" + with pytest.warns(FutureWarning, match=msg): + modeler.clean_on_model_update diff --git a/tests/base/test_Props.py b/tests/base/props/test_prop_relationships.py similarity index 100% rename from tests/base/test_Props.py rename to tests/base/props/test_prop_relationships.py diff --git a/tests/base/regularizations/test_full_gradient.py b/tests/base/regularizations/test_full_gradient.py index ae3b51e27f..4653793919 100644 --- a/tests/base/regularizations/test_full_gradient.py +++ b/tests/base/regularizations/test_full_gradient.py @@ -141,7 +141,7 @@ def test_first_derivatives(dim, alphas, reg_dirs): def func(x): return reg(x), reg.deriv(x) - check_derivative(func, np.ones(mesh.n_cells), plotIt=False) + check_derivative(func, np.ones(mesh.n_cells), plotIt=False, random_seed=7641) @pytest.mark.parametrize( @@ -156,7 +156,7 @@ def test_second_derivatives(dim, alphas, reg_dirs): def func(x): return reg.deriv(x), lambda v: reg.deriv2(x, v) - check_derivative(func, np.ones(mesh.n_cells), plotIt=False) + check_derivative(func, np.ones(mesh.n_cells), plotIt=False, random_seed=5876231) @pytest.mark.parametrize("with_active_cells", [True, False]) diff --git a/tests/base/regularizations/test_pgi_regularization.py b/tests/base/regularizations/test_pgi_regularization.py index b1f08e905f..c69bf9e051 100644 --- a/tests/base/regularizations/test_pgi_regularization.py +++ b/tests/base/regularizations/test_pgi_regularization.py @@ -3,12 +3,14 @@ import discretize import numpy as np -from pymatsolver import SolverLU from scipy.stats import multivariate_normal from simpeg import regularization from simpeg.maps import Wires from simpeg.utils import WeightedGaussianMixture, mkvc +from simpeg.utils.solver_utils import get_default_solver + +Solver = get_default_solver() class TestPGI(unittest.TestCase): @@ -104,7 +106,7 @@ def test_full_covariances(self): self.assertTrue(passed_deriv1) print("1st derivatives for PGI & Full Cov. are ok.") - Hinv = SolverLU(reg.deriv2(self.model)) + Hinv = Solver(reg.deriv2(self.model)) p = Hinv * deriv direction2 = np.c_[self.wires * p] passed_derivative = np.allclose( @@ -209,7 +211,7 @@ def test_tied_covariances(self): self.assertTrue(passed_deriv1) print("1st derivatives for PGI & tied Cov. are ok.") - Hinv = SolverLU(reg.deriv2(self.model)) + Hinv = Solver(reg.deriv2(self.model)) p = Hinv * deriv direction2 = np.c_[self.wires * p] passed_derivative = np.allclose( @@ -312,7 +314,7 @@ def test_diag_covariances(self): self.assertTrue(passed_deriv1) print("1st derivatives for PGI & diag Cov. are ok.") - Hinv = SolverLU(reg.deriv2(self.model)) + Hinv = Solver(reg.deriv2(self.model)) p = Hinv * deriv direction2 = np.c_[self.wires * p] passed_derivative = np.allclose( @@ -415,7 +417,7 @@ def test_spherical_covariances(self): self.assertTrue(passed_deriv1) print("1st derivatives for PGI & spherical Cov. are ok.") - Hinv = SolverLU(reg.deriv2(self.model)) + Hinv = Solver(reg.deriv2(self.model)) p = Hinv * deriv direction2 = np.c_[self.wires * p] passed_derivative = np.allclose( @@ -484,5 +486,85 @@ def test_removed_mref(): pgi.mref +class TestCheckWeights: + """Test the ``WeightedGaussianMixture._check_weights`` method.""" + + VALID_ARGS = { + "1d-array": (np.array([0.5, 0.2, 0.3]), 3, None), + "2d-array": (np.array([[0.5, 0.2, 0.3], [0.25, 0.70, 0.05]]), 3, 2), + "1d-list": ([0.5, 0.2, 0.3], 3, None), + "2d-list": ([[0.5, 0.2, 0.3], [0.25, 0.70, 0.05]], 3, 2), + } + INVALID_SHAPE = { + "1d-array": (np.array([0.5, 0.2, 0.3]), 5, None), + "2d-array": (np.array([[0.5, 0.2, 0.3], [0.25, 0.70, 0.05]]), 5, 13), + "1d-list": ([0.5, 0.2, 0.3], 5, None), + "2d-list": ([[0.5, 0.2, 0.3], [0.25, 0.70, 0.05]], 5, 13), + } + INVALID_RANGE = { + "1d-greater": (np.array([10.5, 0.2, 0.3]), 3, None), + "1d-lower": (np.array([-1.0, 0.2, 0.3]), 3, None), + "2d-greater": (np.array([[0.5, 0.2, 0.3], [10.25, 0.70, 0.05]]), 3, 2), + "2d-lower": (np.array([[0.5, 0.2, 0.3], [0.25, -0.70, 0.05]]), 3, 2), + } + INVALID_NORM = { + "1d-lower": (np.array([0.001, 0.2, 0.3]), 3, None), + "1d-greater": (np.array([0.99, 0.2, 0.3]), 3, None), + "2d-lower": (np.array([[0.001, 0.2, 0.3], [0.25, 0.70, 0.05]]), 3, 2), + "2d-greater": (np.array([[0.99, 0.2, 0.3], [0.25, 0.70, 0.05]]), 3, 2), + } + + @pytest.fixture + def mesh(self): + mesh = discretize.TensorMesh([2, 2, 2]) + return mesh + + @pytest.mark.parametrize("args", VALID_ARGS.values(), ids=VALID_ARGS.keys()) + def test_valid_arguments(self, mesh, args): + """ + Check if method doesn't fail if arguments are valid. + """ + weights, n_components, n_samples = args + WeightedGaussianMixture(n_components=1, mesh=mesh)._check_weights( + weights, n_components, n_samples + ) + + @pytest.mark.parametrize("args", INVALID_SHAPE.values(), ids=INVALID_SHAPE.keys()) + def test_invalid_shape(self, mesh, args): + """ + Check if method raise error upon weights with invalid shape. + """ + weights, n_components, n_samples = args + msg = "The parameter 'weights' should have the shape of" + with pytest.raises(ValueError, match=msg): + WeightedGaussianMixture(n_components=1, mesh=mesh)._check_weights( + weights, n_components, n_samples + ) + + @pytest.mark.parametrize("args", INVALID_RANGE.values(), ids=INVALID_RANGE.keys()) + def test_invalid_range(self, mesh, args): + """ + Check if method raise error upon weights with invalid range. + """ + weights, n_components, n_samples = args + msg = r"The parameter 'weights' should be in the range \[0, 1\]" + with pytest.raises(ValueError, match=msg): + WeightedGaussianMixture(n_components=1, mesh=mesh)._check_weights( + weights, n_components, n_samples + ) + + @pytest.mark.parametrize("args", INVALID_NORM.values(), ids=INVALID_NORM.keys()) + def test_non_normalized(self, mesh, args): + """ + Check if method raise error upon non-normalized weights. + """ + weights, n_components, n_samples = args + msg = r"The parameter 'weights' should be normalized" + with pytest.raises(ValueError, match=msg): + WeightedGaussianMixture(n_components=1, mesh=mesh)._check_weights( + weights, n_components, n_samples + ) + + if __name__ == "__main__": unittest.main() diff --git a/tests/base/regularizations/test_regularization.py b/tests/base/regularizations/test_regularization.py index 257dca9dba..776c07ed65 100644 --- a/tests/base/regularizations/test_regularization.py +++ b/tests/base/regularizations/test_regularization.py @@ -89,15 +89,16 @@ def test_regularization(self): print("--- Checking {} --- \n".format(reg.__class__.__name__)) + rng = np.random.default_rng(seed=639) if mapping.nP != "*": - m = np.random.rand(mapping.nP) + m = rng.random(mapping.nP) else: - m = np.random.rand(mesh.nC) + m = rng.random(mesh.nC) mref = np.ones_like(m) * np.mean(m) reg.reference_model = mref # test derivs - passed = reg.test(m, eps=TOL) + passed = reg.test(m, eps=TOL, random_seed=rng) self.assertTrue(passed) def test_regularization_ActiveCells(self): @@ -139,13 +140,14 @@ def test_regularization_ActiveCells(self): reg = r( mesh, active_cells=active_cells, mapping=maps.IdentityMap(nP=nP) ) - m = np.random.rand(mesh.nC)[active_cells] + rng = np.random.default_rng(seed=532) + m = rng.random(mesh.nC)[active_cells] mref = np.ones_like(m) * np.mean(m) reg.reference_model = mref print("--- Checking {} ---\n".format(reg.__class__.__name__)) - passed = reg.test(m, eps=TOL) + passed = reg.test(m, eps=TOL, random_seed=rng) self.assertTrue(passed) if testRegMesh: @@ -239,7 +241,8 @@ def test_property_mirroring(self): def test_addition(self): mesh = discretize.TensorMesh([8, 7, 6]) - m = np.random.rand(mesh.nC) + rng = np.random.default_rng(seed=523) + m = rng.random(mesh.nC) reg1 = regularization.WeightedLeastSquares(mesh) reg2 = regularization.WeightedLeastSquares(mesh) @@ -247,21 +250,22 @@ def test_addition(self): reg_a = reg1 + reg2 self.assertTrue(len(reg_a) == 2) self.assertTrue(reg1(m) + reg2(m) == reg_a(m)) - reg_a.test(eps=TOL) + reg_a.test(eps=TOL, random_seed=rng) reg_b = 2 * reg1 + reg2 self.assertTrue(len(reg_b) == 2) self.assertTrue(2 * reg1(m) + reg2(m) == reg_b(m)) - reg_b.test(eps=TOL) + reg_b.test(eps=TOL, random_seed=rng) reg_c = reg1 + reg2 / 2 self.assertTrue(len(reg_c) == 2) self.assertTrue(reg1(m) + 0.5 * reg2(m) == reg_c(m)) - reg_c.test(eps=TOL) + reg_c.test(eps=TOL, random_seed=rng) def test_mappings(self): mesh = discretize.TensorMesh([8, 7, 6]) - m = np.random.rand(2 * mesh.nC) + rng = np.random.default_rng(seed=123) + m = rng.random(2 * mesh.nC) wires = maps.Wires(("sigma", mesh.nC), ("mu", mesh.nC)) @@ -276,9 +280,9 @@ def test_mappings(self): self.assertTrue(reg3.nP == 2 * mesh.nC) self.assertTrue(reg3(m) == reg1(m) + reg2(m)) - reg1.test(eps=TOL) - reg2.test(eps=TOL) - reg3.test(eps=TOL) + reg1.test(eps=TOL, random_seed=rng) + reg2.test(eps=TOL, random_seed=rng) + reg3.test(eps=TOL, random_seed=rng) def test_mref_is_zero(self): mesh = discretize.TensorMesh([10, 5, 8]) @@ -469,7 +473,7 @@ def test_nC_residual(self): ) mapping = maps.ExpMap(mesh) * maps.SurjectVertical1D(mesh) * actMap - regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].indActive]]) + regMesh = discretize.TensorMesh([mesh.h[2][mapping.maps[-1].active_cells]]) reg = regularization.WeightedLeastSquares(regMesh) self.assertTrue(reg._nC_residual == regMesh.nC) @@ -577,7 +581,8 @@ def test_sparse_properties(self): def test_vector_amplitude(self): n_comp = 4 mesh = discretize.TensorMesh([8, 7]) - model = np.random.randn(mesh.nC, n_comp) + rng = np.random.default_rng(5412) + model = rng.random((mesh.nC, n_comp)) with pytest.raises(TypeError, match="'regularization_mesh' must be of type"): regularization.VectorAmplitude("abc") @@ -593,7 +598,7 @@ def test_vector_amplitude(self): reg.objfcts[0].f_m(model.flatten(order="F")), np.linalg.norm(model, axis=1) ) - reg.test(model.flatten(order="F")) + reg.test(model.flatten(order="F"), random_seed=rng) def test_WeightedLeastSquares(): @@ -615,6 +620,7 @@ def test_WeightedLeastSquares(): def test_cross_ref_reg(dim): mesh = discretize.TensorMesh([3, 4, 5][:dim]) actives = mesh.cell_centers[:, -1] < 0.6 + rng = np.random.default_rng(6634) n_active = actives.sum() ref_dir = dim * [1] @@ -627,8 +633,8 @@ def test_cross_ref_reg(dim): assert cross_reg._nC_residual == dim * n_active # give it some cell weights, and some cell vector weights to do something with - cell_weights = np.random.rand(n_active) - cell_vec_weights = np.random.rand(n_active, dim) + cell_weights = rng.random(n_active) + cell_vec_weights = rng.random((n_active, dim)) cross_reg.set_weights(cell_weights=cell_weights) cross_reg.set_weights(vec_weights=cell_vec_weights) @@ -637,8 +643,8 @@ def test_cross_ref_reg(dim): else: assert cross_reg.W.shape == (n_active, n_active) - m = np.random.rand(dim * n_active) - cross_reg.test(m) + m = rng.random(dim * n_active) + cross_reg.test(m, random_seed=rng) def test_cross_reg_reg_errors(): diff --git a/tests/base/test_Fields.py b/tests/base/test_Fields.py index b9450bfc5f..0f06c586bd 100644 --- a/tests/base/test_Fields.py +++ b/tests/base/test_Fields.py @@ -4,14 +4,9 @@ from simpeg import survey, simulation, utils, fields, data import numpy as np -import sys np.random.seed(32) - -if sys.version_info < (3,): - zero_types = [0, 0.0, np.r_[0], long(0)] -else: - zero_types = [0, 0.0, np.r_[0]] +zero_types = [0, 0.0, np.r_[0]] class FieldsTest(unittest.TestCase): @@ -40,7 +35,10 @@ def setUp(self): source_list = [Src0, Src1, Src2, Src3, Src4] mysurvey = survey.BaseSurvey(source_list=source_list) - sim = simulation.BaseSimulation(mesh=mesh, survey=mysurvey) + sim = simulation.BaseSimulation(survey=mysurvey) + # insert a mesh into the simulation (required for the Fields objects) + # This should likely be moved to a BasePDESimulation test. + sim.mesh = mesh self.D = data.Data(mysurvey) self.F = fields.Fields( sim, @@ -49,7 +47,6 @@ def setUp(self): ) self.Src0 = Src0 self.Src1 = Src1 - self.mesh = mesh self.XYZ = XYZ self.simulation = sim @@ -164,7 +161,10 @@ def setUp(self): source_list = [Src0, Src1, Src2, Src3, Src4] mysurvey = survey.BaseSurvey(source_list=source_list) - sim = simulation.BaseSimulation(mesh=mesh, survey=mysurvey) + sim = simulation.BaseSimulation(survey=mysurvey) + # insert a mesh into the simulation (required for the Fields objects) + # This should likely be moved to a BasePDESimulation test. + sim.mesh = mesh self.F = fields.Fields( sim, knownFields={"e": "E"}, @@ -172,7 +172,6 @@ def setUp(self): ) self.Src0 = Src0 self.Src1 = Src1 - self.mesh = mesh self.XYZ = XYZ self.simulation = sim @@ -255,14 +254,16 @@ def setUp(self): source_list = [Src0, Src1, Src2, Src3, Src4] mysurvey = survey.BaseSurvey(source_list=source_list) sim = simulation.BaseTimeSimulation( - mesh, time_steps=[(10.0, 3), (20.0, 2)], survey=mysurvey + time_steps=[(10.0, 3), (20.0, 2)], survey=mysurvey ) + # insert a mesh into the simulation (required for the Fields objects) + # This should likely be moved to a BasePDESimulation test. + sim.mesh = mesh self.F = fields.TimeFields( simulation=sim, knownFields={"phi": "CC", "e": "E", "b": "F"} ) self.Src0 = Src0 self.Src1 = Src1 - self.mesh = mesh self.XYZ = XYZ def test_contains(self): @@ -380,8 +381,11 @@ def setUp(self): source_list = [Src0, Src1, Src2, Src3, Src4] mysurvey = survey.BaseSurvey(source_list=source_list) sim = simulation.BaseTimeSimulation( - mesh, time_steps=[(10.0, 3), (20.0, 2)], survey=mysurvey + time_steps=[(10.0, 3), (20.0, 2)], survey=mysurvey ) + # insert a mesh into the simulation (required for the Fields objects) + # This should likely be moved to a BasePDESimulation test. + sim.mesh = mesh def alias(b, srcInd, timeInd): return self.F.mesh.edge_curl.T * b + timeInd @@ -391,7 +395,6 @@ def alias(b, srcInd, timeInd): ) self.Src0 = Src0 self.Src1 = Src1 - self.mesh = mesh self.XYZ = XYZ self.simulation = sim diff --git a/tests/base/test_Solver.py b/tests/base/test_Solver.py deleted file mode 100644 index adb753f6c8..0000000000 --- a/tests/base/test_Solver.py +++ /dev/null @@ -1,77 +0,0 @@ -import unittest - -from simpeg import Solver, SolverDiag, SolverCG, SolverLU -from discretize import TensorMesh -from simpeg.utils import sdiag -import numpy as np - -TOLD = 1e-10 -TOLI = 1e-3 -numRHS = 5 - -np.random.seed(77) - - -def dotest(MYSOLVER, multi=False, A=None, **solverOpts): - if A is None: - h1 = np.ones(10) * 100.0 - h2 = np.ones(10) * 100.0 - h3 = np.ones(10) * 100.0 - - h = [h1, h2, h3] - - M = TensorMesh(h) - - D = M.face_divergence - G = -M.face_divergence.T - Msig = M.get_face_inner_product() - A = D * Msig * G - A[-1, -1] *= ( - 1 / M.cell_volumes[-1] - ) # remove the constant null space from the matrix - else: - M = TensorMesh([A.shape[0]]) - - Ainv = MYSOLVER(A, **solverOpts) - if multi: - e = np.ones(M.nC) - else: - e = np.ones((M.nC, numRHS)) - rhs = A * e - x = Ainv * rhs - Ainv.clean() - return np.linalg.norm(e - x, np.inf) - - -class TestSolver(unittest.TestCase): - def test_direct_spsolve_1(self): - self.assertLess(dotest(Solver, False), TOLD) - - def test_direct_spsolve_M(self): - self.assertLess(dotest(Solver, True), TOLD) - - def test_direct_splu_1(self): - self.assertLess(dotest(SolverLU, False), TOLD) - - def test_direct_splu_M(self): - self.assertLess(dotest(SolverLU, True), TOLD) - - def test_iterative_diag_1(self): - self.assertLess( - dotest(SolverDiag, False, A=sdiag(np.random.rand(10) + 1.0)), TOLI - ) - - def test_iterative_diag_M(self): - self.assertLess( - dotest(SolverDiag, True, A=sdiag(np.random.rand(10) + 1.0)), TOLI - ) - - def test_iterative_cg_1(self): - self.assertLess(dotest(SolverCG, False), TOLI) - - def test_iterative_cg_M(self): - self.assertLess(dotest(SolverCG, True), TOLI) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/base/test_mass_matrices.py b/tests/base/test_base_pde_sim.py similarity index 92% rename from tests/base/test_mass_matrices.py rename to tests/base/test_base_pde_sim.py index 90dc04ea75..20501849ec 100644 --- a/tests/base/test_mass_matrices.py +++ b/tests/base/test_base_pde_sim.py @@ -1,3 +1,5 @@ +import re + from simpeg.base import with_property_mass_matrices, BasePDESimulation from simpeg import props, maps import unittest @@ -9,6 +11,8 @@ import scipy.sparse as sp import pytest +from simpeg.utils.solver_utils import get_default_solver + # define a very simple class... @with_property_mass_matrices("sigma") @@ -28,11 +32,11 @@ def __init__( self.muMap = muMap @property - def deleteTheseOnModelUpdate(self): + def _delete_on_model_update(self): """ matrices to be deleted if the model for conductivity/resistivity is updated """ - toDelete = super().deleteTheseOnModelUpdate + toDelete = super()._delete_on_model_update if self.sigmaMap is not None or self.rhoMap is not None: toDelete = toDelete + self._clear_on_sigma_update return toDelete @@ -493,7 +497,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=8672354) def test_Mn_deriv(self): u = np.random.randn(self.mesh.n_nodes) @@ -510,7 +514,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=523876) def test_Me_deriv(self): u = np.random.randn(self.mesh.n_edges) @@ -527,7 +531,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=9875163) def test_Me_diagonal_anisotropy_deriv(self): u = np.random.randn(self.mesh.n_edges) @@ -544,7 +548,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=1658372) def test_Me_full_anisotropy_deriv(self): u = np.random.randn(self.mesh.n_edges) @@ -561,7 +565,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=9867234) def test_Mf_deriv(self): u = np.random.randn(self.mesh.n_faces) @@ -578,7 +582,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=10523687) def test_Mf_diagonal_anisotropy_deriv(self): u = np.random.randn(self.mesh.n_faces) @@ -595,7 +599,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=19876354) def test_Mf_full_anisotropy_deriv(self): u = np.random.randn(self.mesh.n_faces) @@ -612,7 +616,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=102309487) def test_MccI_deriv(self): u = np.random.randn(self.mesh.n_cells) @@ -629,7 +633,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=89726354) def test_MnI_deriv(self): u = np.random.randn(self.mesh.n_nodes) @@ -646,7 +650,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=12503698) def test_MeI_deriv(self): u = np.random.randn(self.mesh.n_edges) @@ -663,7 +667,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=5674129834) def test_MfI_deriv(self): u = np.random.randn(self.mesh.n_faces) @@ -680,7 +684,7 @@ def Jvec(v): return d, Jvec - assert check_derivative(f, x0=x0, num=3, plotIt=False) + assert check_derivative(f, x0=x0, num=3, plotIt=False, random_seed=532349) def test_Mcc_adjoint(self): n_items = self.mesh.n_cells @@ -806,3 +810,34 @@ def test_bad_derivative_stash(): with pytest.raises(TypeError): sim.MeSigmaDeriv(u, v) + + +def test_solver_defaults(): + mesh = discretize.TensorMesh([2, 2, 2]) + sim = BasePDESimulation(mesh) + with pytest.warns(UserWarning, match="Using the default solver.*"): + solver_class = sim.solver + + assert solver_class is get_default_solver() + + +def test_bad_solver(): + mesh = discretize.TensorMesh([2, 2, 2]) + msg = re.escape("BasePDESimulation.solver must be a class") + with pytest.raises(TypeError, match=msg): + BasePDESimulation(mesh, solver="f") + + msg = re.escape("str is not a subclass of pymatsolver.base.BaseSolver") + with pytest.raises(TypeError, match=msg): + BasePDESimulation(mesh, solver=str) + + +def test_mesh_required(): + with pytest.raises(TypeError): + BasePDESimulation() + + +def test_bad_mesh(): + with pytest.raises(TypeError): + # should error on anything besides a discretize.base.BaseMesh + BasePDESimulation(np.array([1, 2, 3])) diff --git a/tests/base/test_data_misfit.py b/tests/base/test_data_misfit.py index 2e23131da5..bf1d0cc088 100644 --- a/tests/base/test_data_misfit.py +++ b/tests/base/test_data_misfit.py @@ -6,8 +6,6 @@ from simpeg import maps from simpeg import data_misfit, simulation, survey -np.random.seed(17) - class DataMisfitTest(unittest.TestCase): def setUp(self): @@ -23,7 +21,7 @@ def setUp(self): mesh=mesh, survey=survey.BaseSurvey([source]), model_map=maps.ExpMap(mesh) ) - synthetic_data = sim.make_synthetic_data(model) + synthetic_data = sim.make_synthetic_data(model, random_seed=17) self.relative = 0.01 self.noise_floor = 1e-8 @@ -68,7 +66,7 @@ def test_setting_W(self): def test_DataMisfitOrder(self): self.data.relative_error = self.relative self.data.noise_floor = self.noise_floor - self.dmis.test(x=self.model) + self.dmis.test(x=self.model, random_seed=17) if __name__ == "__main__": diff --git a/tests/base/test_directives.py b/tests/base/test_directives.py index f6450eb586..65fbb0f7f2 100644 --- a/tests/base/test_directives.py +++ b/tests/base/test_directives.py @@ -7,23 +7,28 @@ maps, directives, regularization, - data_misfit, optimization, inversion, inverse_problem, simulation, ) +from simpeg.data_misfit import L2DataMisfit from simpeg.potential_fields import magnetics as mag import shutil +from simpeg.regularization.base import Smallness +from simpeg.regularization.sparse import Sparse + class directivesValidation(unittest.TestCase): def test_validation_pass(self): betaest = directives.BetaEstimate_ByEig() IRLS = directives.Update_IRLS(f_min_change=1e-4, minGNiter=3, beta_tol=1e-2) + beta_schedule = directives.BetaSchedule(coolingFactor=2, coolingRate=1) + update_Jacobi = directives.UpdatePreconditioner() - dList = [betaest, IRLS, update_Jacobi] + dList = [betaest, IRLS, beta_schedule, update_Jacobi] directiveList = directives.DirectiveList(*dList) self.assertTrue(directiveList.validate()) @@ -33,7 +38,9 @@ def test_validation_fail(self): IRLS = directives.Update_IRLS(f_min_change=1e-4, minGNiter=3, beta_tol=1e-2) update_Jacobi = directives.UpdatePreconditioner() - dList = [betaest, update_Jacobi, IRLS] + beta_schedule = directives.BetaSchedule(coolingFactor=2, coolingRate=1) + + dList = [betaest, update_Jacobi, IRLS, beta_schedule] directiveList = directives.DirectiveList(*dList) with self.assertRaises(AssertionError): @@ -52,7 +59,8 @@ def test_validation_warning(self): betaest = directives.BetaEstimate_ByEig() IRLS = directives.Update_IRLS(f_min_change=1e-4, minGNiter=3, beta_tol=1e-2) - dList = [betaest, IRLS] + beta_schedule = directives.BetaSchedule(coolingFactor=2, coolingRate=1) + dList = [betaest, IRLS, beta_schedule] directiveList = directives.DirectiveList(*dList) with pytest.warns(UserWarning): @@ -83,8 +91,8 @@ def setUp(self): m = np.random.rand(mesh.nC) - data = sim.make_synthetic_data(m, add_noise=True) - dmis = data_misfit.L2DataMisfit(data=data, simulation=sim) + data = sim.make_synthetic_data(m, add_noise=True, random_seed=19) + dmis = L2DataMisfit(data=data, simulation=sim) dmis.W = 1.0 / data.relative_error # Add directives to the inversion @@ -110,20 +118,19 @@ def test_validation_in_inversion(self): # Here is where the norms are applied IRLS = directives.Update_IRLS(f_min_change=1e-4, minGNiter=3, beta_tol=1e-2) - update_Jacobi = directives.UpdatePreconditioner() sensitivity_weights = directives.UpdateSensitivityWeights() with self.assertRaises(AssertionError): # validation should happen and this will fail # (IRLS needs to be before update_Jacobi) - inv = inversion.BaseInversion( + inversion.BaseInversion( invProb, directiveList=[betaest, update_Jacobi, IRLS] ) with self.assertRaises(AssertionError): # validation should happen and this will fail # (sensitivity_weights needs to be before betaest) - inv = inversion.BaseInversion( + inversion.BaseInversion( invProb, directiveList=[betaest, sensitivity_weights] ) @@ -258,7 +265,118 @@ def test_sensitivity_weighting_amplitude_minimum(self): # self.test_sensitivity_weighting_subroutine(test_weights, test_directive) - print("SENSITIVITY WEIGHTING BY AMPLIUTDE AND MAX ALUE TEST PASSED") + print("SENSITIVITY WEIGHTING BY AMPLITUDE AND MAX VALUE TEST PASSED") + + def test_irls_directive(self): + input_norms = [0.0, 1.0, 1.0, 1.0] + reg = regularization.Sparse(self.mesh) + reg.norms = input_norms + projection = maps.Projection(self.mesh.n_cells, np.arange(self.mesh.n_cells)) + + other_reg = regularization.WeightedLeastSquares(self.mesh) + + invProb = inverse_problem.BaseInvProblem(self.dmis, reg + other_reg, self.opt) + + beta_schedule = directives.BetaSchedule(coolingFactor=3) + + # Here is where the norms are applied + irls_directive = directives.UpdateIRLS( + cooling_factor=3, + chifact_start=100.0, + chifact_target=1.0, + irls_cooling_factor=1.2, + f_min_change=np.inf, + max_irls_iterations=20, + misfit_tolerance=1e-0, + percentile=100, + verbose=True, + ) + + assert irls_directive.cooling_factor == 3 + assert irls_directive.metrics is not None + + # TODO Move these assertion test to the 'test_validation_in_inversion' after update + with self.assertRaises(AssertionError): + inversion.BaseInversion( + invProb, directiveList=[beta_schedule, irls_directive] + ) + + with self.assertRaises(AssertionError): + inversion.BaseInversion( + invProb, directiveList=[beta_schedule, irls_directive] + ) + + spherical_weights = directives.SphericalUnitsWeights(projection, [reg]) + with self.assertRaises(AssertionError): + inversion.BaseInversion( + invProb, directiveList=[irls_directive, spherical_weights] + ) + + update_Jacobi = directives.UpdatePreconditioner() + with self.assertRaises(AssertionError): + inversion.BaseInversion( + invProb, directiveList=[update_Jacobi, irls_directive] + ) + + invProb.phi_d = 1.0 + self.opt.iter = 3 + invProb.model = np.random.randn(reg.regularization_mesh.nC) + inv = inversion.BaseInversion(invProb, directiveList=[irls_directive]) + + irls_directive.initialize() + assert irls_directive.metrics.input_norms == [input_norms, None] + assert reg.norms == [2.0, 2.0, 2.0, 2.0] + + irls_directive.inversion = inv + irls_directive.endIter() + + assert irls_directive.metrics.start_irls_iter == self.opt.iter + assert len(reg.objfcts[0]._weights) == 2 # With irls weights + assert len(other_reg.objfcts[0]._weights) == 1 # No irls + irls_directive.metrics.irls_iteration_count += 1 + irls_directive.endIter() + + assert self.opt.stopNextIteration + + # Test stopping criteria based on max_irls_iter + irls_directive.max_irls_iterations = 2 + assert irls_directive.stopping_criteria() + + # Test beta re-adjustment down + invProb.phi_d = 4.0 + irls_directive.misfit_tolerance = 0.1 + irls_directive.adjust_cooling_schedule() + assert irls_directive.cooling_factor == 2.0 + + # Test beta re-adjustment up + invProb.phi_d = 0.5 + irls_directive.adjust_cooling_schedule() + assert irls_directive.cooling_factor == 0.5 + + def test_spherical_weights(self): + reg = regularization.Sparse(self.mesh) + projection = maps.Projection(self.mesh.n_cells, np.arange(self.mesh.n_cells)) + for obj in reg.objfcts[1:]: + obj.units = "radian" + + with pytest.raises(TypeError, match="Attribute 'amplitude' must be of type"): + directives.SphericalUnitsWeights(reg, [reg]) + + with pytest.raises(TypeError, match="Attribute 'angles' must be a list of"): + directives.SphericalUnitsWeights(projection, ["abc"]) + + spherical_weights = directives.SphericalUnitsWeights(projection, [reg]) + + inv_prob = inverse_problem.BaseInvProblem(self.dmis, reg, self.opt) + model = np.abs(np.random.randn(reg.regularization_mesh.nC)) + inv_prob.model = model + inv = inversion.BaseInversion(inv_prob, directiveList=[spherical_weights]) + spherical_weights.inversion = inv + + spherical_weights.initialize() + + assert "angle_scale" not in reg.objfcts[0]._weights + assert reg.objfcts[1]._weights["angle_scale"].max() == model.max() / np.pi def tearDown(self): # Clean up the working directory @@ -276,8 +394,10 @@ def test_save_output_dict(RegClass): sim = simulation.ExponentialSinusoidSimulation( mesh=mesh, model_map=maps.IdentityMap() ) - data = sim.make_synthetic_data(np.ones(mesh.n_cells), add_noise=True) - dmis = data_misfit.L2DataMisfit(data, sim) + data = sim.make_synthetic_data( + np.ones(mesh.n_cells), add_noise=True, random_seed=20 + ) + dmis = L2DataMisfit(data, sim) opt = optimization.InexactGaussNewton(maxIter=1) @@ -397,9 +517,9 @@ def test_normalization_method_setter_invalid(self, normalization_method): d_temp.normalization_method = normalization_method -class TestSeedProperty: +class TestRandomSeedProperty: """ - Test ``seed`` setter methods of directives. + Test ``random_seed`` setter methods of directives. """ directive_classes = ( @@ -411,22 +531,22 @@ class TestSeedProperty: @pytest.mark.parametrize("directive_class", directive_classes) @pytest.mark.parametrize( - "seed", + "random_seed", (42, np.random.default_rng(seed=1), np.array([1, 2])), ids=("int", "rng", "array"), ) - def test_valid_seed(self, directive_class, seed): + def test_valid_seed(self, directive_class, random_seed): "Test if seed setter works as expected on valid seed arguments." - directive = directive_class(seed=seed) - assert directive.seed is seed + directive = directive_class(random_seed=random_seed) + assert directive.random_seed is random_seed @pytest.mark.parametrize("directive_class", directive_classes) - @pytest.mark.parametrize("seed", (42.1, np.array([1.0, 2.0]))) - def test_invalid_seed(self, directive_class, seed): + @pytest.mark.parametrize("random_seed", (42.1, np.array([1.0, 2.0]))) + def test_invalid_seed(self, directive_class, random_seed): "Test if seed setter works as expected on valid seed arguments." msg = "Unable to initialize the random number generator with " with pytest.raises(TypeError, match=msg): - directive_class(seed=seed) + directive_class(random_seed=random_seed) class TestBetaEstimatorArguments: @@ -439,23 +559,156 @@ def test_beta_estimate_by_eig(self): """Test on directives.BetaEstimate_ByEig.""" beta0_ratio = 3.0 n_pw_iter = 3 - seed = 42 + random_seed = 42 directive = directives.BetaEstimate_ByEig( - beta0_ratio=beta0_ratio, n_pw_iter=n_pw_iter, seed=seed + beta0_ratio=beta0_ratio, n_pw_iter=n_pw_iter, random_seed=random_seed ) assert directive.beta0_ratio == beta0_ratio assert directive.n_pw_iter == n_pw_iter - assert directive.seed == seed + assert directive.random_seed == random_seed def test_beta_estimate_max_derivative(self): """Test on directives.BetaEstimateMaxDerivative.""" beta0_ratio = 3.0 - seed = 42 + random_seed = 42 directive = directives.BetaEstimateMaxDerivative( - beta0_ratio=beta0_ratio, seed=seed + beta0_ratio=beta0_ratio, random_seed=random_seed ) assert directive.beta0_ratio == beta0_ratio - assert directive.seed == seed + assert directive.random_seed == random_seed + + +class TestDeprecateSeedProperty: + """ + Test deprecation of seed property. + """ + + CLASSES = ( + directives.AlphasSmoothEstimate_ByEig, + directives.BetaEstimate_ByEig, + directives.BetaEstimateMaxDerivative, + directives.ScalingMultipleDataMisfits_ByEig, + ) + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + @pytest.mark.parametrize("directive", CLASSES) + def test_warning_argument(self, directive): + """ + Test if warning is raised after passing ``seed`` to the constructor. + """ + msg = self.get_message_deprecated_warning("seed", "random_seed") + seed = 42135 + with pytest.warns(FutureWarning, match=msg): + directive_instance = directive(seed=42135) + assert directive_instance.random_seed == seed + + @pytest.mark.parametrize("directive", CLASSES) + def test_error_duplicated_argument(self, directive): + """ + Test error after passing ``seed`` and ``random_seed`` to the constructor. + """ + msg = self.get_message_duplicated_error("seed", "random_seed") + with pytest.raises(TypeError, match=msg): + directive(seed=42, random_seed=42) + + @pytest.mark.parametrize("directive", CLASSES) + def test_warning_accessing_property(self, directive): + """ + Test warning when trying to access the ``seed`` property. + """ + directive_obj = directive(random_seed=42) + msg = "seed has been deprecated, please use random_seed" + with pytest.warns(FutureWarning, match=msg): + seed = directive_obj.seed + np.testing.assert_allclose(seed, directive_obj.random_seed) + + @pytest.mark.parametrize("directive", CLASSES) + def test_warning_setter(self, directive): + """ + Test warning when trying to set the ``seed`` property. + """ + directive_obj = directive(random_seed=42) + msg = "seed has been deprecated, please use random_seed" + new_seed = 35 + with pytest.warns(FutureWarning, match=msg): + directive_obj.seed = new_seed + np.testing.assert_allclose(directive_obj.random_seed, new_seed) + + +class TestUpdateIRLS: + """ + Additional tests to UpdateIRLS directive. + """ + + @pytest.fixture + def mesh(self): + """Sample tensor mesh.""" + return discretize.TensorMesh([4, 4, 4]) + + @pytest.fixture + def data_misfit(self, mesh): + rx = mag.Point(np.vstack([[0.25, 0.25, 0.25], [-0.25, -0.25, 0.25]])) + igrf = mag.UniformBackgroundField( + receiver_list=[rx], amplitude=5000, inclination=90, declination=0 + ) + survey = mag.Survey(igrf) + sim = mag.Simulation3DIntegral( + mesh, survey=survey, chiMap=maps.IdentityMap(mesh) + ) + model = np.random.default_rng(seed=42).normal(size=mesh.n_cells) + data = sim.make_synthetic_data(model, add_noise=True) + dmisfit = L2DataMisfit(data=data, simulation=sim) + return dmisfit + + def test_end_iter_irls_threshold(self, mesh, data_misfit): + """ + Test if irls_threshold is modified in every regularization term after + the IRLS process started. + """ + # Define a regularization combo with sparse and non-sparse terms + irls_threshold = 4.5 + sparse_regularization = Sparse( + mesh, norms=[1, 1, 1, 1], irls_threshold=irls_threshold + ) + non_sparse_regularization = Smallness(mesh) + reg = 0.1 * sparse_regularization + 0.5 * non_sparse_regularization + # Define inversion + opt = optimization.ProjectedGNCG() + opt.iter = 0 # manually set iter to zero + inv_prob = inverse_problem.BaseInvProblem(data_misfit, reg, opt) + inv_prob.phi_d = np.nan # manually set value for phi_d + inv_prob.model = np.zeros(mesh.n_cells) # manually set the model + # Define inversion + inv = inversion.BaseInversion(inv_prob) + irls_cooling_factor = 1.2 + update_irls = directives.UpdateIRLS( + irls_cooling_factor=irls_cooling_factor, + inversion=inv, + dmisfit=data_misfit, + reg=reg, + ) + # Modify metrics to kick in the IRLS process + update_irls.metrics.start_irls_iter = 0 + # Check irls_threshold of the objective function terms after running endIter + update_irls.endIter() + for obj_fun in sparse_regularization.objfcts: + assert obj_fun.irls_threshold == irls_threshold / irls_cooling_factor + # The irls_threshold for the sparse_regularization should not be changed + assert sparse_regularization.irls_threshold == irls_threshold if __name__ == "__main__": diff --git a/tests/base/test_joint.py b/tests/base/test_joint.py index 3d269cb141..f1b56f0fe9 100644 --- a/tests/base/test_joint.py +++ b/tests/base/test_joint.py @@ -53,8 +53,9 @@ def setUp(self): mesh=mesh, survey=survey1, rhoMap=maps.ExpMap(mesh) ) - dobs0 = simulation0.make_synthetic_data(model) - dobs1 = simulation1.make_synthetic_data(model) + rng = np.random.default_rng(seed=42) + dobs0 = simulation0.make_synthetic_data(model, random_seed=rng) + dobs1 = simulation1.make_synthetic_data(model, random_seed=rng) self.mesh = mesh self.model = model @@ -74,7 +75,7 @@ def setUp(self): def test_multiDataMisfit(self): self.dmis0.test(random_seed=42) self.dmis1.test(random_seed=42) - self.dmiscombo.test(x=self.model) + self.dmiscombo.test(x=self.model, random_seed=42) def test_inv(self): reg = regularization.WeightedLeastSquares(self.mesh) diff --git a/tests/base/test_maps.py b/tests/base/test_maps.py index 4957f8db28..ba7ac19581 100644 --- a/tests/base/test_maps.py +++ b/tests/base/test_maps.py @@ -1,3 +1,4 @@ +from copy import deepcopy import numpy as np import unittest import discretize @@ -8,6 +9,13 @@ from discretize.utils import mesh_builder_xyz, refine_tree_xyz, active_from_xyz import inspect +from simpeg.maps._parametric import ( + BaseParametric, + ParametricLayer, + ParametricBlock, + ParametricEllipsoid, +) + TOL = 1e-14 np.random.seed(121) @@ -129,19 +137,19 @@ def setUp(self): def test_transforms2D(self): for M in self.maps2test2D: - self.assertTrue(M(self.mesh2).test()) + self.assertTrue(M(self.mesh2).test(random_seed=42)) def test_transforms2Dvec(self): for M in self.maps2test2D: - self.assertTrue(M(self.mesh2).test()) + self.assertTrue(M(self.mesh2).test(random_seed=42)) def test_transforms3D(self): for M in self.maps2test3D: - self.assertTrue(M(self.mesh3).test()) + self.assertTrue(M(self.mesh3).test(random_seed=42)) def test_transforms3Dvec(self): for M in self.maps2test3D: - self.assertTrue(M(self.mesh3).test()) + self.assertTrue(M(self.mesh3).test(random_seed=42)) def test_invtransforms2D(self): for M in self.maps2test2D: @@ -184,71 +192,34 @@ def test_invtransforms3D(self): def test_ParametricCasingAndLayer(self): mapping = maps.ParametricCasingAndLayer(self.meshCyl) m = np.r_[-2.0, 1.0, 6.0, 2.0, -0.1, 0.2, 0.5, 0.2, -0.2, 0.2] - self.assertTrue(mapping.test(m)) + self.assertTrue(mapping.test(m=m, random_seed=42)) def test_ParametricBlock2D(self): mesh = discretize.TensorMesh([np.ones(30), np.ones(20)], x0=np.array([-15, -5])) mapping = maps.ParametricBlock(mesh) # val_background,val_block, block_x0, block_dx, block_y0, block_dy m = np.r_[-2.0, 1.0, -5, 10, 5, 4] - self.assertTrue(mapping.test(m)) + self.assertTrue(mapping.test(m=m, random_seed=42)) def test_transforms_logMap_reciprocalMap(self): - # Note that log/reciprocal maps can be kinda finicky, so we are being - # explicit about the random seed. - - v2 = np.r_[ - 0.40077291, 0.1441044, 0.58452314, 0.96323738, 0.01198519, 0.79754415 - ] - dv2 = np.r_[ - 0.80653921, 0.13132446, 0.4901117, 0.03358737, 0.65473762, 0.44252488 - ] - v3 = np.r_[ - 0.96084865, - 0.34385186, - 0.39430044, - 0.81671285, - 0.65929109, - 0.2235217, - 0.87897526, - 0.5784033, - 0.96876393, - 0.63535864, - 0.84130763, - 0.22123854, - ] - dv3 = np.r_[ - 0.96827838, - 0.26072111, - 0.45090749, - 0.10573893, - 0.65276365, - 0.15646586, - 0.51679682, - 0.23071984, - 0.95106218, - 0.14201845, - 0.25093564, - 0.3732866, - ] mapping = maps.LogMap(self.mesh2) - self.assertTrue(mapping.test(v2, dx=dv2)) + self.assertTrue(mapping.test(random_seed=42)) mapping = maps.LogMap(self.mesh3) - self.assertTrue(mapping.test(v3, dx=dv3)) + self.assertTrue(mapping.test(random_seed=42)) mapping = maps.ReciprocalMap(self.mesh2) - self.assertTrue(mapping.test(v2, dx=dv2)) + self.assertTrue(mapping.test(random_seed=42)) mapping = maps.ReciprocalMap(self.mesh3) - self.assertTrue(mapping.test(v3, dx=dv3)) + self.assertTrue(mapping.test(random_seed=42)) def test_Mesh2MeshMap(self): mapping = maps.Mesh2Mesh([self.mesh22, self.mesh2]) - self.assertTrue(mapping.test()) + self.assertTrue(mapping.test(random_seed=42)) def test_Mesh2MeshMapVec(self): mapping = maps.Mesh2Mesh([self.mesh22, self.mesh2]) - self.assertTrue(mapping.test()) + self.assertTrue(mapping.test(random_seed=42)) def test_mapMultiplication(self): M = discretize.TensorMesh([2, 3]) @@ -335,7 +306,7 @@ def test_map2Dto3D_x(self): ]: # m2to3 = maps.Surject2Dto3D(M3, normal='X') m = np.arange(m2to3.nP) - self.assertTrue(m2to3.test()) + self.assertTrue(m2to3.test(random_seed=42)) self.assertTrue( np.all(utils.mkvc((m2to3 * m).reshape(M3.vnC, order="F")[0, :, :]) == m) ) @@ -350,7 +321,7 @@ def test_map2Dto3D_y(self): ]: # m2to3 = maps.Surject2Dto3D(M3, normal='Y') m = np.arange(m2to3.nP) - self.assertTrue(m2to3.test()) + self.assertTrue(m2to3.test(random_seed=42)) self.assertTrue( np.all(utils.mkvc((m2to3 * m).reshape(M3.vnC, order="F")[:, 0, :]) == m) ) @@ -365,7 +336,7 @@ def test_map2Dto3D_z(self): ]: # m2to3 = maps.Surject2Dto3D(M3, normal='Z') m = np.arange(m2to3.nP) - self.assertTrue(m2to3.test()) + self.assertTrue(m2to3.test(random_seed=42)) self.assertTrue( np.all(utils.mkvc((m2to3 * m).reshape(M3.vnC, order="F")[:, :, 0]) == m) ) @@ -373,20 +344,23 @@ def test_map2Dto3D_z(self): def test_ParametricPolyMap(self): M2 = discretize.TensorMesh([np.ones(10), np.ones(10)], "CN") mParamPoly = maps.ParametricPolyMap(M2, 2, logSigma=True, normal="Y") - self.assertTrue(mParamPoly.test(m=np.r_[1.0, 1.0, 0.0, 0.0, 0.0])) + self.assertTrue( + mParamPoly.test(m=np.r_[1.0, 1.0, 0.0, 0.0, 0.0], random_seed=42) + ) def test_ParametricSplineMap(self): M2 = discretize.TensorMesh([np.ones(10), np.ones(10)], "CN") x = M2.cell_centers_x mParamSpline = maps.ParametricSplineMap(M2, x, normal="Y", order=1) - self.assertTrue(mParamSpline.test()) + self.assertTrue(mParamSpline.test(random_seed=42)) def test_parametric_block(self): M1 = discretize.TensorMesh([np.ones(10)], "C") block = maps.ParametricBlock(M1) self.assertTrue( block.test( - m=np.hstack([np.random.rand(2), np.r_[M1.x0, 2 * M1.h[0].min()]]) + m=np.hstack([np.random.rand(2), np.r_[M1.x0, 2 * M1.h[0].min()]]), + random_seed=42, ) ) @@ -400,7 +374,8 @@ def test_parametric_block(self): np.r_[M2.x0[0], 2 * M2.h[0].min()], np.r_[M2.x0[1], 4 * M2.h[1].min()], ] - ) + ), + random_seed=42, ) ) @@ -415,7 +390,8 @@ def test_parametric_block(self): np.r_[M3.x0[1], 4 * M3.h[1].min()], np.r_[M3.x0[2], 5 * M3.h[2].min()], ] - ) + ), + random_seed=42, ) ) @@ -430,7 +406,8 @@ def test_parametric_ellipsoid(self): np.r_[M2.x0[0], 2 * M2.h[0].min()], np.r_[M2.x0[1], 4 * M2.h[1].min()], ] - ) + ), + random_seed=42, ) ) @@ -445,7 +422,8 @@ def test_parametric_ellipsoid(self): np.r_[M3.x0[1], 4 * M3.h[1].min()], np.r_[M3.x0[2], 5 * M3.h[2].min()], ] - ) + ), + random_seed=42, ) ) @@ -471,8 +449,8 @@ def test_sum(self): self.assertTrue(np.all(summap0 * m0 == summap1 * m0)) - self.assertTrue(summap0.test(m0)) - self.assertTrue(summap1.test(m0)) + self.assertTrue(summap0.test(m=m0, random_seed=42)) + self.assertTrue(summap1.test(m=m0, random_seed=42)) def test_surject_units(self): M2 = discretize.TensorMesh([np.ones(10), np.ones(20)], "CC") @@ -486,7 +464,7 @@ def test_surject_units(self): self.assertTrue(np.all(m1[unit1] == 0)) self.assertTrue(np.all(m1[unit2] == 1)) - self.assertTrue(surject_units.test(m0)) + self.assertTrue(surject_units.test(m=m0, random_seed=42)) def test_Projection(self): nP = 10 @@ -508,7 +486,7 @@ def test_Projection(self): maps.Projection(nP, np.r_[10]) * m mapping = maps.Projection(nP, np.r_[1, 2, 6, 1, 3, 5, 4, 9, 9, 8, 0]) - mapping.test() + mapping.test(random_seed=42) def test_Tile(self): """ @@ -634,16 +612,14 @@ class TestSCEMT(unittest.TestCase): def test_sphericalInclusions(self): mesh = discretize.TensorMesh([4, 5, 3]) mapping = maps.SelfConsistentEffectiveMedium(mesh, sigma0=1e-1, sigma1=1.0) - m = np.random.default_rng(seed=0).random(mesh.n_cells) - mapping.test(m=m, dx=0.05 * np.ones(mesh.n_cells), num=3) + mapping.test(num=3, random_seed=42) def test_spheroidalInclusions(self): mesh = discretize.TensorMesh([4, 3, 2]) mapping = maps.SelfConsistentEffectiveMedium( mesh, sigma0=1e-1, sigma1=1.0, alpha0=0.8, alpha1=0.9, rel_tol=1e-8 ) - m = np.abs(np.random.rand(mesh.nC)) - mapping.test(m=m, dx=0.05 * np.ones(mesh.n_cells), num=3) + mapping.test(num=3, random_seed=42) @pytest.mark.parametrize( @@ -690,7 +666,7 @@ def test_LinearMapDerivs(A, b): y1 = mapping.deriv(m) @ v y2 = mapping.deriv(m, v=v) np.testing.assert_equal(y1, y2) - mapping.test() + mapping.test(random_seed=42) def test_LinearMap_errors(): @@ -772,5 +748,283 @@ def test_linearity(): assert all(not m.is_linear for m in non_linear_maps) +class DeprecatedIndActive: + """Base class to test deprecated ``actInd`` and ``indActive`` arguments in maps.""" + + @pytest.fixture + def mesh(self): + """Sample mesh.""" + return discretize.TensorMesh([np.ones(10), np.ones(10)], "CN") + + @pytest.fixture + def active_cells(self, mesh): + """Sample active cells for the mesh.""" + active_cells = np.ones(mesh.n_cells, dtype=bool) + active_cells[0] = False + return active_cells + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + +class TestParametricPolyMap(DeprecatedIndActive): + """Test deprecated ``actInd`` in ParametricPolyMap.""" + + def test_warning_argument(self, mesh, active_cells): + """ + Test if warning is raised after passing ``actInd`` to the constructor. + """ + msg = self.get_message_deprecated_warning("actInd", "active_cells") + with pytest.warns(FutureWarning, match=msg): + map_instance = maps.ParametricPolyMap(mesh, 2, actInd=active_cells) + np.testing.assert_allclose(map_instance.active_cells, active_cells) + + def test_error_duplicated_argument(self, mesh, active_cells): + """ + Test error after passing ``actInd`` and ``active_cells`` to the constructor. + """ + msg = self.get_message_duplicated_error("actInd", "active_cells") + with pytest.raises(TypeError, match=msg): + maps.ParametricPolyMap( + mesh, 2, active_cells=active_cells, actInd=active_cells + ) + + def test_warning_accessing_property(self, mesh, active_cells): + """ + Test warning when trying to access the ``actInd`` property. + """ + mapping = maps.ParametricPolyMap(mesh, 2, active_cells=active_cells) + msg = "actInd has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + old_act_ind = mapping.actInd + np.testing.assert_allclose(mapping.active_cells, old_act_ind) + + def test_warning_setter(self, mesh, active_cells): + """ + Test warning when trying to set the ``actInd`` property. + """ + mapping = maps.ParametricPolyMap(mesh, 2, active_cells=active_cells) + # Define new active cells to pass to the setter + new_active_cells = active_cells.copy() + new_active_cells[-4:] = False + msg = "actInd has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + mapping.actInd = new_active_cells + np.testing.assert_allclose(mapping.active_cells, new_active_cells) + + +class TestMesh2Mesh(DeprecatedIndActive): + """Test deprecated ``indActive`` in ``Mesh2Mesh``.""" + + @pytest.fixture + def meshes(self, mesh): + return [mesh, deepcopy(mesh)] + + def test_warning_argument(self, meshes, active_cells): + """ + Test if warning is raised after passing ``indActive`` to the constructor. + """ + msg = self.get_message_deprecated_warning("indActive", "active_cells") + with pytest.warns(FutureWarning, match=msg): + mapping_instance = maps.Mesh2Mesh(meshes, indActive=active_cells) + np.testing.assert_allclose(mapping_instance.active_cells, active_cells) + + def test_error_duplicated_argument(self, meshes, active_cells): + """ + Test error after passing ``indActive`` and ``active_cells`` to the constructor. + """ + msg = self.get_message_duplicated_error("indActive", "active_cells") + with pytest.raises(TypeError, match=msg): + maps.Mesh2Mesh(meshes, active_cells=active_cells, indActive=active_cells) + + def test_warning_accessing_property(self, meshes, active_cells): + """ + Test warning when trying to access the ``indActive`` property. + """ + mapping = maps.Mesh2Mesh(meshes, active_cells=active_cells) + msg = "indActive has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + old_act_ind = mapping.indActive + np.testing.assert_allclose(mapping.active_cells, old_act_ind) + + def test_warning_setter(self, meshes, active_cells): + """ + Test warning when trying to set the ``indActive`` property. + """ + mapping = maps.Mesh2Mesh(meshes, active_cells=active_cells) + # Define new active cells to pass to the setter + new_active_cells = active_cells.copy() + new_active_cells[-4:] = False + msg = "indActive has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + mapping.indActive = new_active_cells + np.testing.assert_allclose(mapping.active_cells, new_active_cells) + + +class TestInjectActiveCells(DeprecatedIndActive): + """Test deprecated ``indActive`` and ``valInactive`` in ``InjectActiveCells``.""" + + def test_indactive_warning_argument(self, mesh, active_cells): + """ + Test if warning is raised after passing ``indActive`` to the constructor. + """ + msg = self.get_message_deprecated_warning("indActive", "active_cells") + with pytest.warns(FutureWarning, match=msg): + mapping_instance = maps.InjectActiveCells(mesh, indActive=active_cells) + np.testing.assert_allclose(mapping_instance.active_cells, active_cells) + + def test_indactive_error_duplicated_argument(self, mesh, active_cells): + """ + Test error after passing ``indActive`` and ``active_cells`` to the constructor. + """ + msg = self.get_message_duplicated_error("indActive", "active_cells") + with pytest.raises(TypeError, match=msg): + maps.InjectActiveCells( + mesh, active_cells=active_cells, indActive=active_cells + ) + + def test_indactive_warning_accessing_property(self, mesh, active_cells): + """ + Test warning when trying to access the ``indActive`` property. + """ + mapping = maps.InjectActiveCells(mesh, active_cells=active_cells) + msg = "indActive has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + old_act_ind = mapping.indActive + np.testing.assert_allclose(mapping.active_cells, old_act_ind) + + def test_indactive_warning_setter(self, mesh, active_cells): + """ + Test warning when trying to set the ``indActive`` property. + """ + mapping = maps.InjectActiveCells(mesh, active_cells=active_cells) + # Define new active cells to pass to the setter + new_active_cells = active_cells.copy() + new_active_cells[-4:] = False + msg = "indActive has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + mapping.indActive = new_active_cells + np.testing.assert_allclose(mapping.active_cells, new_active_cells) + + @pytest.mark.parametrize("value_inactive", (3.14, np.array([1]))) + def test_valinactive_warning_argument(self, mesh, active_cells, value_inactive): + """ + Test if warning is raised after passing ``valInactive`` to the constructor. + """ + msg = self.get_message_deprecated_warning("valInactive", "value_inactive") + with pytest.warns(FutureWarning, match=msg): + mapping_instance = maps.InjectActiveCells( + mesh, active_cells=active_cells, valInactive=value_inactive + ) + # Ensure that the value passed to valInactive was correctly used + expected = np.zeros_like(active_cells, dtype=np.float64) + expected[~active_cells] = value_inactive + np.testing.assert_allclose(mapping_instance.value_inactive, expected) + + @pytest.mark.parametrize("valInactive", (3.14, np.array([3.14]))) + @pytest.mark.parametrize("value_inactive", (3.14, np.array([3.14]))) + def test_valinactive_error_duplicated_argument( + self, mesh, active_cells, valInactive, value_inactive + ): + """ + Test error after passing ``valInactive`` and ``value_inactive`` to the + constructor. + """ + msg = self.get_message_duplicated_error("valInactive", "value_inactive") + with pytest.raises(TypeError, match=msg): + maps.InjectActiveCells( + mesh, + active_cells=active_cells, + value_inactive=value_inactive, + valInactive=valInactive, + ) + + def test_valinactive_warning_accessing_property(self, mesh, active_cells): + """ + Test warning when trying to access the ``valInactive`` property. + """ + mapping = maps.InjectActiveCells( + mesh, active_cells=active_cells, value_inactive=3.14 + ) + msg = "valInactive has been deprecated, please use value_inactive" + with pytest.warns(FutureWarning, match=msg): + old_value = mapping.valInactive + np.testing.assert_allclose(mapping.value_inactive, old_value) + + def test_valinactive_warning_setter(self, mesh, active_cells): + """ + Test warning when trying to set the ``valInactive`` property. + """ + mapping = maps.InjectActiveCells( + mesh, active_cells=active_cells, value_inactive=3.14 + ) + msg = "valInactive has been deprecated, please use value_inactive" + with pytest.warns(FutureWarning, match=msg): + mapping.valInactive = 4.5 + np.testing.assert_allclose(mapping.value_inactive[~mapping.active_cells], 4.5) + + +class TestParametric(DeprecatedIndActive): + """Test deprecated ``indActive`` in parametric mappings.""" + + CLASSES = (BaseParametric, ParametricLayer, ParametricBlock, ParametricEllipsoid) + + @pytest.mark.parametrize("map_class", CLASSES) + def test_indactive_warning_argument(self, mesh, active_cells, map_class): + """ + Test if warning is raised after passing ``indActive`` to the constructor. + """ + msg = self.get_message_deprecated_warning("indActive", "active_cells") + with pytest.warns(FutureWarning, match=msg): + mapping_instance = map_class(mesh, indActive=active_cells) + np.testing.assert_allclose(mapping_instance.active_cells, active_cells) + + @pytest.mark.parametrize("map_class", CLASSES) + def test_indactive_error_duplicated_argument(self, mesh, active_cells, map_class): + """ + Test error after passing ``indActive`` and ``active_cells`` to the constructor. + """ + msg = self.get_message_duplicated_error("indActive", "active_cells") + with pytest.raises(TypeError, match=msg): + map_class(mesh, active_cells=active_cells, indActive=active_cells) + + @pytest.mark.parametrize("map_class", CLASSES) + def test_indactive_warning_accessing_property(self, mesh, active_cells, map_class): + """ + Test warning when trying to access the ``indActive`` property. + """ + mapping = map_class(mesh, active_cells=active_cells) + msg = "indActive has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + old_act_ind = mapping.indActive + np.testing.assert_allclose(mapping.active_cells, old_act_ind) + + @pytest.mark.parametrize("map_class", CLASSES) + def test_indactive_warning_setter(self, mesh, active_cells, map_class): + """ + Test warning when trying to set the ``indActive`` property. + """ + mapping = map_class(mesh, active_cells=active_cells) + # Define new active cells to pass to the setter + new_active_cells = active_cells.copy() + new_active_cells[-4:] = False + msg = "indActive has been deprecated, please use active_cells" + with pytest.warns(FutureWarning, match=msg): + mapping.indActive = new_active_cells + np.testing.assert_allclose(mapping.active_cells, new_active_cells) + + if __name__ == "__main__": unittest.main() diff --git a/tests/base/test_model_utils.py b/tests/base/test_model_utils.py index 97802fbf2d..4cc34beaf1 100644 --- a/tests/base/test_model_utils.py +++ b/tests/base/test_model_utils.py @@ -1,13 +1,10 @@ -import pytest import unittest import numpy as np - +import pytest from discretize import TensorMesh -from simpeg import ( - utils, -) +from simpeg import utils class DepthWeightingTest(unittest.TestCase): @@ -77,6 +74,109 @@ def test_depth_weighting_2D(self): np.testing.assert_allclose(wz, wz2) +class TestDistancehWeighting: + def test_distance_weighting_3D(self): + # Mesh + dh = 5.0 + hx = [(dh, 5, -1.3), (dh, 40), (dh, 5, 1.3)] + hy = [(dh, 5, -1.3), (dh, 40), (dh, 5, 1.3)] + hz = [(dh, 15)] + mesh = TensorMesh([hx, hy, hz], "CCN") + + rng = np.random.default_rng(seed=42) + actv = rng.integers(low=0, high=2, size=mesh.n_cells, dtype=bool) + + # Define reference locs at random locations + reference_locs = rng.uniform( + low=mesh.nodes.min(axis=0), high=mesh.nodes.max(axis=0), size=(1000, 3) + ) + + # distance weighting + with pytest.warns(): + wz_scipy = utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="scipy" + ) + wz_numba = utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="numba" + ) + np.testing.assert_allclose(wz_scipy, wz_numba) + + with pytest.raises(ValueError): + utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="test" + ) + + def test_distance_weighting_2D(self): + # Mesh + dh = 5.0 + hx = [(dh, 5, -1.3), (dh, 40), (dh, 5, 1.3)] + hz = [(dh, 15)] + mesh = TensorMesh([hx, hz], "CN") + + rng = np.random.default_rng(seed=42) + actv = rng.integers(low=0, high=2, size=mesh.n_cells, dtype=bool) + + # Define reference locs at random locations + reference_locs = rng.uniform( + low=mesh.nodes.min(axis=0), high=mesh.nodes.max(axis=0), size=(1000, 2) + ) + + # distance weighting + with pytest.warns(): + wz_scipy = utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="scipy" + ) + wz_numba = utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="numba" + ) + np.testing.assert_allclose(wz_scipy, wz_numba) + + def test_distance_weighting_1D(self): + # Mesh + dh = 5.0 + hx = [(dh, 5, -1.3), (dh, 40), (dh, 5, 1.3)] + mesh = TensorMesh([hx], "C") + + rng = np.random.default_rng(seed=42) + actv = rng.integers(low=0, high=2, size=mesh.n_cells, dtype=bool) + + # Define reference locs at random locations + reference_locs = rng.uniform( + low=mesh.nodes.min(axis=0), high=mesh.nodes.max(axis=0), size=(1000, 1) + ) + + # distance weighting + with pytest.warns(): + wz_scipy = utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="scipy" + ) + wz_numba = utils.distance_weighting( + mesh, reference_locs, active_cells=actv, exponent=3, engine="numba" + ) + np.testing.assert_allclose(wz_scipy, wz_numba) + + @pytest.mark.parametrize("ndim", (2, 3)) + def test_invalid_reference_locs(self, ndim): + """ + Test if errors are raised when invalid reference_locs are passed. + """ + hx = [5.0, 10] + h = [hx] * ndim + origin = "CCN" if ndim == 3 else "CC" + reference_locs = [1.0, 2.0] if ndim == 3 else [1.0] + mesh = TensorMesh(h, origin) + with pytest.raises(ValueError): + utils.distance_weighting(mesh, reference_locs) + + def test_numba_and_cdist_opts_error(self): + """Test error when passing numba and cdist_opts.""" + hx = [5.0, 10] + mesh = TensorMesh([hx, hx, hx]) + msg = "The `cdist_opts` is valid only when engine is 'scipy'." + with pytest.raises(TypeError, match=msg): + utils.distance_weighting(mesh, [1.0, 2.0, 3.0], cdist_opts={"foo": "bar"}) + + @pytest.fixture def mesh(): """Sample mesh.""" diff --git a/tests/base/test_objective_function.py b/tests/base/test_objective_function.py index ad4a3d22ac..24650f64b4 100644 --- a/tests/base/test_objective_function.py +++ b/tests/base/test_objective_function.py @@ -35,7 +35,7 @@ def deriv2(self, m, v=None): class TestBaseObjFct(unittest.TestCase): def test_derivs(self): objfct = objective_function.L2ObjectiveFunction() - self.assertTrue(objfct.test(eps=1e-9)) + self.assertTrue(objfct.test(eps=1e-9, random_seed=42)) def test_deriv2(self): nP = 100 @@ -70,7 +70,7 @@ def test_sum(self): objfct = objective_function.L2ObjectiveFunction( W=sp.eye(nP) ) + scalar * objective_function.L2ObjectiveFunction(W=sp.eye(nP)) - self.assertTrue(objfct.test(eps=1e-9)) + self.assertTrue(objfct.test(eps=1e-9, random_seed=42)) self.assertTrue(np.all(objfct.multipliers == np.r_[1.0, scalar])) @@ -84,7 +84,7 @@ def test_2sum(self): + alpha1 * objective_function.L2ObjectiveFunction() ) phi2 = objective_function.L2ObjectiveFunction() + alpha2 * phi1 - self.assertTrue(phi2.test(eps=EPS)) + self.assertTrue(phi2.test(eps=EPS, random_seed=42)) self.assertTrue(len(phi1.multipliers) == 2) self.assertTrue(len(phi2.multipliers) == 2) diff --git a/tests/base/test_problem.py b/tests/base/test_problem.py index a6afd10479..e39608e774 100644 --- a/tests/base/test_problem.py +++ b/tests/base/test_problem.py @@ -1,13 +1,11 @@ import unittest -import discretize from simpeg import simulation import numpy as np class TestTimeSimulation(unittest.TestCase): def setUp(self): - mesh = discretize.TensorMesh([10, 10]) - self.sim = simulation.BaseTimeSimulation(mesh) + self.sim = simulation.BaseTimeSimulation() def test_timeProblem_setTimeSteps(self): self.sim.time_steps = [(1e-6, 3), 1e-5, (1e-4, 2)] diff --git a/tests/base/test_simulation.py b/tests/base/test_simulation.py index 4f49d4c9fa..12578951db 100644 --- a/tests/base/test_simulation.py +++ b/tests/base/test_simulation.py @@ -1,6 +1,9 @@ +import re import unittest import numpy as np import discretize +import pytest + from simpeg import maps, simulation @@ -25,10 +28,47 @@ def test_make_synthetic_data(self): assert np.all(data.relative_error == 0.05 * np.ones_like(dclean)) +def test_exp_sim_mesh_required(): + msg = ".*missing 1 required positional argument: 'mesh'" + with pytest.raises(TypeError, match=msg): + simulation.ExponentialSinusoidSimulation() + + +def test_exp_sim_bad_mesh_type(): + mesh = discretize.TreeMesh([16, 16]) + msg = "mesh must be an instance of TensorMesh, not TreeMesh" + with pytest.raises(TypeError, match=msg): + simulation.ExponentialSinusoidSimulation(mesh) + + +def test_exp_sim_bad_mesh_dim(): + mesh = discretize.TensorMesh([5, 5]) + msg = "ExponentialSinusoidSimulation mesh must be 1D, received a 2D mesh." + with pytest.raises(ValueError, match=msg): + simulation.ExponentialSinusoidSimulation(mesh) + + +@pytest.mark.parametrize( + "base_class", + [ + simulation.BaseSimulation, + simulation.BaseTimeSimulation, + simulation.LinearSimulation, + ], +) +def test_base_no_mesh(base_class): + # this current message is... not a good one + # # but is what is thrown when an invalid arugment is passed. + msg = re.escape( + "object.__init__() takes exactly one argument (the instance to initialize)" + ) + with pytest.raises(TypeError, match=msg): + base_class(mesh=0) + + class TestTimeSimulation(unittest.TestCase): def setUp(self): - mesh = discretize.TensorMesh([10, 10]) - self.sim = simulation.BaseTimeSimulation(mesh=mesh) + self.sim = simulation.BaseTimeSimulation() def test_time_simulation_time_steps(self): self.sim.time_steps = [(1e-6, 3), 1e-5, (1e-4, 2)] diff --git a/tests/dask/test_DC_jvecjtvecadj_dask.py b/tests/dask/test_DC_jvecjtvecadj_dask.py index a2f32c2e16..c61ad59fcc 100644 --- a/tests/dask/test_DC_jvecjtvecadj_dask.py +++ b/tests/dask/test_DC_jvecjtvecadj_dask.py @@ -15,8 +15,6 @@ from simpeg.electromagnetics import resistivity as dc import shutil -np.random.seed(40) - TOL = 1e-5 FLR = 1e-20 # "zero", so if residual below this --> pass regardless of order @@ -45,7 +43,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -71,6 +69,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=54, ) self.assertTrue(passed) @@ -87,7 +86,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=6 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=6, + random_seed=1234, ) self.assertTrue(passed) @@ -123,7 +126,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -149,6 +152,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=883, ) self.assertTrue(passed) @@ -165,7 +169,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=78523, ) self.assertTrue(passed) diff --git a/tests/dask/test_IP_jvecjtvecadj_dask.py b/tests/dask/test_IP_jvecjtvecadj_dask.py index 73ac660054..f18fc04793 100644 --- a/tests/dask/test_IP_jvecjtvecadj_dask.py +++ b/tests/dask/test_IP_jvecjtvecadj_dask.py @@ -117,6 +117,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=66346, ) self.assertTrue(passed) @@ -133,7 +134,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=41, ) self.assertTrue(passed) @@ -162,7 +167,7 @@ def setUp(self): mesh=mesh, survey=survey, sigma=sigma, etaMap=maps.IdentityMap(mesh) ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -187,6 +192,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=41, ) self.assertTrue(passed) @@ -203,7 +209,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=41, ) self.assertTrue(passed) @@ -232,7 +242,7 @@ def setUp(self): mesh=mesh, survey=survey, sigma=sigma, etaMap=maps.IdentityMap(mesh) ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -256,6 +266,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=41, ) self.assertTrue(passed) @@ -272,7 +283,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=41, ) self.assertTrue(passed) @@ -305,7 +320,7 @@ def setUp(self): storeJ=True, ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -329,6 +344,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=41, ) self.assertTrue(passed) @@ -345,7 +361,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=41, ) self.assertTrue(passed) @@ -385,7 +405,7 @@ def setUp(self): storeJ=True, ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -409,6 +429,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=41, ) self.assertTrue(passed) @@ -425,7 +446,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=41, ) self.assertTrue(passed) diff --git a/tests/dask/test_grav_inversion_linear.py b/tests/dask/test_grav_inversion_linear.py index df68680167..bef3ea796f 100644 --- a/tests/dask/test_grav_inversion_linear.py +++ b/tests/dask/test_grav_inversion_linear.py @@ -77,7 +77,7 @@ def setUp(self): self.mesh, survey=survey, rhoMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="ram", chunk_format="row", ) @@ -86,7 +86,11 @@ def setUp(self): # computing sensitivities to ram is best using dask processes with dask.config.set(scheduler="processes"): data = sim.make_synthetic_data( - self.model, relative_error=0.0, noise_floor=0.0005, add_noise=True + self.model, + relative_error=0.0, + noise_floor=0.0005, + add_noise=True, + random_seed=42, ) # Create a regularization reg = regularization.Sparse(self.mesh, active_cells=actv, mapping=idenMap) @@ -103,7 +107,7 @@ def setUp(self): invProb = inverse_problem.BaseInvProblem(dmis, reg, opt, beta=1e2) # Here is where the norms are applied - IRLS = directives.Update_IRLS(max_irls_iterations=20, chifact_start=2.0) + IRLS = directives.UpdateIRLS() update_Jacobi = directives.UpdatePreconditioner() sensitivity_weights = directives.UpdateSensitivityWeights(every_iteration=False) self.inv = inversion.BaseInversion( diff --git a/tests/dask/test_mag_MVI_Octree.py b/tests/dask/test_mag_MVI_Octree.py index cc3984f2ab..167a191775 100644 --- a/tests/dask/test_mag_MVI_Octree.py +++ b/tests/dask/test_mag_MVI_Octree.py @@ -100,7 +100,7 @@ def setUp(self): survey=survey, model_type="vector", chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="disk", chunk_format="auto", ) @@ -108,7 +108,11 @@ def setUp(self): # Compute some data and add some random noise data = sim.make_synthetic_data( - utils.mkvc(self.model), relative_error=0.0, noise_floor=5.0, add_noise=True + utils.mkvc(self.model), + relative_error=0.0, + noise_floor=5.0, + add_noise=True, + random_seed=40, ) # This Mapping connects the regularizations for the three-component @@ -146,8 +150,8 @@ def setUp(self): # Here is where the norms are applied # Use pick a treshold parameter empirically based on the distribution of # model parameters - IRLS = directives.Update_IRLS( - f_min_change=1e-3, max_irls_iterations=0, beta_tol=5e-1 + IRLS = directives.UpdateIRLS( + f_min_change=1e-3, max_irls_iterations=0, misfit_tolerance=5e-1 ) # Pre-conditioner @@ -208,14 +212,14 @@ def setUp(self): invProb = inverse_problem.BaseInvProblem(dmis, reg, opt, beta=beta) # Here is where the norms are applied - IRLS = directives.Update_IRLS( + IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=5, - minGNiter=1, - beta_tol=0.5, - coolingRate=1, - coolEps_q=True, - sphericalDomain=True, + misfit_tolerance=0.5, + ) + + spherical_scale = directives.SphericalUnitsWeights( + amplitude=wires.amp, angles=[reg_t, reg_p] ) # Special directive specific to the mag amplitude problem. The sensitivity @@ -226,7 +230,13 @@ def setUp(self): self.inv = inversion.BaseInversion( invProb, - directiveList=[ProjSpherical, IRLS, sensitivity_weights, update_Jacobi], + directiveList=[ + spherical_scale, + ProjSpherical, + IRLS, + sensitivity_weights, + update_Jacobi, + ], ) def test_mag_inverse(self): diff --git a/tests/dask/test_mag_inversion_linear_Octree.py b/tests/dask/test_mag_inversion_linear_Octree.py index 0bf5c4b6e0..69a1f4748a 100644 --- a/tests/dask/test_mag_inversion_linear_Octree.py +++ b/tests/dask/test_mag_inversion_linear_Octree.py @@ -107,13 +107,17 @@ def setUp(self): self.mesh, survey=survey, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="ram", chunk_format="equal", ) self.sim = sim data = sim.make_synthetic_data( - self.model, relative_error=0.0, noise_floor=1.0, add_noise=True + self.model, + relative_error=0.0, + noise_floor=1.0, + add_noise=True, + random_seed=40, ) # Create a regularization @@ -145,7 +149,7 @@ def setUp(self): # Here is where the norms are applied # Use pick a treshold parameter empirically based on the distribution of # model parameters - IRLS = directives.Update_IRLS() + IRLS = directives.UpdateIRLS() update_Jacobi = directives.UpdatePreconditioner() sensitivity_weights = directives.UpdateSensitivityWeights() self.inv = inversion.BaseInversion( diff --git a/tests/dask/test_mag_nonLinear_Amplitude.py b/tests/dask/test_mag_nonLinear_Amplitude.py index eb1775c032..46935c5455 100644 --- a/tests/dask/test_mag_nonLinear_Amplitude.py +++ b/tests/dask/test_mag_nonLinear_Amplitude.py @@ -101,7 +101,7 @@ def setUp(self): survey=survey, mesh=mesh, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="forward_only", ) simulation.M = M_xyz @@ -135,7 +135,7 @@ def setUp(self): mesh=mesh, survey=survey, chiMap=idenMap, - ind_active=surf, + active_cells=surf, store_sensitivities="ram", ) simulation.model = mstart @@ -167,8 +167,8 @@ def setUp(self): # Target misfit to stop the inversion, # try to fit as much as possible of the signal, we don't want to lose anything - IRLS = directives.Update_IRLS( - f_min_change=1e-3, minGNiter=1, beta_tol=1e-1, max_irls_iterations=5 + IRLS = directives.UpdateIRLS( + f_min_change=1e-3, misfit_tolerance=1e-1, max_irls_iterations=5 ) update_Jacobi = directives.UpdatePreconditioner() # Put all the parts together @@ -201,7 +201,7 @@ def setUp(self): mesh=mesh, survey=surveyAmp, chiMap=idenMap, - ind_active=surf, + active_cells=surf, is_amplitude_data=True, store_sensitivities="forward_only", ) @@ -228,7 +228,7 @@ def setUp(self): survey=surveyAmp, mesh=mesh, chiMap=idenMap, - ind_active=actv, + active_cells=actv, is_amplitude_data=True, ) @@ -253,13 +253,7 @@ def setUp(self): betaest = directives.BetaEstimate_ByEig(beta0_ratio=1) # Specify the sparse norms - IRLS = directives.Update_IRLS( - max_irls_iterations=5, - f_min_change=1e-3, - minGNiter=1, - coolingRate=1, - beta_search=False, - ) + IRLS = directives.UpdateIRLS(max_irls_iterations=5, f_min_change=1e-3) # Special directive specific to the mag amplitude problem. The sensitivity # weights are update between each iteration. @@ -268,7 +262,13 @@ def setUp(self): # Put all together self.inv = inversion.BaseInversion( - invProb, directiveList=[update_SensWeight, betaest, IRLS, update_Jacobi] + invProb, + directiveList=[ + update_SensWeight, + betaest, + IRLS, + update_Jacobi, + ], ) self.mstart = mstart diff --git a/tests/em/em1d/test_EM1D_FD_jac_layers.py b/tests/em/em1d/test_EM1D_FD_jac_layers.py index 432b647a64..0364ae3992 100644 --- a/tests/em/em1d/test_EM1D_FD_jac_layers.py +++ b/tests/em/em1d/test_EM1D_FD_jac_layers.py @@ -118,7 +118,7 @@ def derChk(m): dm = m_1D * 0.5 passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=9186724 ) self.assertTrue(passed) if passed: @@ -164,7 +164,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-27) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-27, random_seed=2345 + ) self.assertTrue(passed) if passed: print("EM1DFM MagDipole Jtvec test works") @@ -279,7 +281,7 @@ def derChk(m): dm = m_1D * 0.5 passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=664 ) self.assertTrue(passed) if passed: @@ -325,7 +327,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-27) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-27, random_seed=42 + ) self.assertTrue(passed) if passed: print("EM1DFM Circular Loop Jtvec test works") @@ -420,7 +424,7 @@ def derChk(m): return [fwdfun(m), lambda mx: jacfun(m, mx)] passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=1123 ) self.assertTrue(passed) if passed: @@ -463,7 +467,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-27) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-27, random_seed=124 + ) self.assertTrue(passed) if passed: print("EM1DFM Piecewise Linear Loop Jtvec test works") diff --git a/tests/em/em1d/test_EM1D_TD_general_fwd.py b/tests/em/em1d/test_EM1D_TD_general_fwd.py index 1d4daf5c6d..962b4e8b45 100644 --- a/tests/em/em1d/test_EM1D_TD_general_fwd.py +++ b/tests/em/em1d/test_EM1D_TD_general_fwd.py @@ -276,5 +276,14 @@ def test_em1dtd_mag_dipole_bzdt(self): np.testing.assert_allclose(self.bzdt, empymod_solution, rtol=1e-2) +def test_backwards_compatible_filter_key(): + + srv = tdem.Survey([]) + sim = tdem.Simulation1DLayered(survey=srv) + sim.time_filter = "key_81_CosSin_2009" + + assert sim.time_filter == "key_81_2009" + + if __name__ == "__main__": unittest.main() diff --git a/tests/em/em1d/test_EM1D_TD_general_jac_layers.py b/tests/em/em1d/test_EM1D_TD_general_jac_layers.py index 6cce1655aa..f6818ccf81 100644 --- a/tests/em/em1d/test_EM1D_TD_general_jac_layers.py +++ b/tests/em/em1d/test_EM1D_TD_general_jac_layers.py @@ -85,7 +85,7 @@ def derChk(m): return [fwdfun(m), lambda mx: jacfun(m, mx)] passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=9187235 ) self.assertTrue(passed) @@ -118,7 +118,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-26) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-26, random_seed=42 + ) self.assertTrue(passed) @@ -265,7 +267,7 @@ def derChk(m): return [fwdfun(m), lambda mx: jacfun(m, mx)] passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=42 ) self.assertTrue(passed) @@ -297,7 +299,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-26) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-26, random_seed=42 + ) self.assertTrue(passed) diff --git a/tests/em/em1d/test_EM1D_TD_off_jac_layers.py b/tests/em/em1d/test_EM1D_TD_off_jac_layers.py index c985b8e758..1288b544b6 100644 --- a/tests/em/em1d/test_EM1D_TD_off_jac_layers.py +++ b/tests/em/em1d/test_EM1D_TD_off_jac_layers.py @@ -116,7 +116,7 @@ def derChk(m): return [fwdfun(m), lambda mx: jacfun(m, mx)] passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=51234 ) self.assertTrue(passed) if passed: @@ -160,7 +160,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-27) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-27, random_seed=52 + ) self.assertTrue(passed) if passed: print("EM1DTM MagDipole Jtvec test works") @@ -276,7 +278,7 @@ def derChk(m): return [fwdfun(m), lambda mx: jacfun(m, mx)] passed = tests.check_derivative( - derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15 + derChk, m_1D, num=4, dx=dm, plotIt=False, eps=1e-15, random_seed=523 ) self.assertTrue(passed) if passed: @@ -320,7 +322,9 @@ def misfit(m, dobs): def derChk(m): return misfit(m, dobs) - passed = tests.check_derivative(derChk, m_ini, num=4, plotIt=False, eps=1e-27) + passed = tests.check_derivative( + derChk, m_ini, num=4, plotIt=False, eps=1e-27, random_seed=98234 + ) self.assertTrue(passed) if passed: print("EM1DTM Circular Loop Jtvec test works") diff --git a/tests/em/em1d/test_utils.py b/tests/em/em1d/test_utils.py new file mode 100644 index 0000000000..bbeb4b2174 --- /dev/null +++ b/tests/em/em1d/test_utils.py @@ -0,0 +1,37 @@ +from collections import namedtuple + +import pytest +import libdlf +import numpy as np +import numpy.testing as npt +from empymod.transform import get_dlf_points + +from simpeg.electromagnetics.utils.em1d_utils import get_splined_dlf_points + +FILTERS = [f"hankel.{filt}" for filt in libdlf.hankel.__all__] + [ + f"fourier.{filt}" for filt in libdlf.fourier.__all__ +] + + +@pytest.mark.parametrize("filt", FILTERS) +@pytest.mark.parametrize("n_points", [1, 5, 10]) +def test_splined_dlf(filt, n_points): + f_type, f_name = filt.split(".") + f_module = getattr(libdlf, f_type) + filt = getattr(f_module, f_name) + base, *vals = filt() + if len(vals) == 2: + v0, v1 = vals + else: + v0 = v1 = vals[0] + factor = np.around([base[1] / base[0]], 15) + filt_type = namedtuple("Filter", "base v0 v1 factor") + filt = filt_type(base, v0, v1, factor) + + r_s = np.logspace(-1, 1, n_points) + + out1, out2 = get_splined_dlf_points(filt, r_s.min(), r_s.max()) + test1, test2 = get_dlf_points(filt, r_s, -1) + + npt.assert_allclose(out1, test1[0]) + npt.assert_allclose(out2, test2) diff --git a/tests/em/fdem/forward/test_FDEM_analytics.py b/tests/em/fdem/forward/test_FDEM_analytics.py index afda665b43..ebadf7a7ea 100644 --- a/tests/em/fdem/forward/test_FDEM_analytics.py +++ b/tests/em/fdem/forward/test_FDEM_analytics.py @@ -5,7 +5,7 @@ import numpy as np import scipy.sparse as sp from scipy.constants import mu_0 -from simpeg import SolverLU, utils +from simpeg import utils from simpeg.electromagnetics import analytics from simpeg.electromagnetics import frequency_domain as fdem @@ -59,14 +59,6 @@ def setUp(self): sigma[mesh.gridCC[:, 2] > 0] = 1e-8 prb = fdem.Simulation3DMagneticFluxDensity(mesh, survey=survey, sigma=sigma) - - try: - from pymatsolver import Pardiso - - prb.solver = Pardiso - except ImportError: - prb.solver = SolverLU - self.prb = prb self.mesh = mesh self.sig = sig diff --git a/tests/em/fdem/forward/test_FDEM_casing.py b/tests/em/fdem/forward/test_FDEM_casing.py index a0ceffc3c8..92d8b85153 100644 --- a/tests/em/fdem/forward/test_FDEM_casing.py +++ b/tests/em/fdem/forward/test_FDEM_casing.py @@ -66,22 +66,27 @@ class Casing_DerivTest(unittest.TestCase): def test_derivs(self): rng = np.random.default_rng(seed=42) - np.random.seed(1983) # set a random seed for check_derivative tests.check_derivative( - CasingMagDipoleDeriv_r, np.ones(n) * 10 + rng.normal(size=n), plotIt=False + CasingMagDipoleDeriv_r, + np.ones(n) * 10 + rng.normal(size=n), + plotIt=False, + random_seed=rng, ) - np.random.seed(1983) # set a random seed for check_derivative - tests.check_derivative(CasingMagDipoleDeriv_z, rng.normal(size=n), plotIt=False) + tests.check_derivative( + CasingMagDipoleDeriv_z, rng.normal(size=n), plotIt=False, random_seed=rng + ) - np.random.seed(1983) # set a random seed for check_derivative tests.check_derivative( CasingMagDipole2Deriv_z_r, np.ones(n) * 10 + rng.normal(size=n), plotIt=False, + random_seed=rng, ) - np.random.seed(1983) # set a random seed for check_derivative tests.check_derivative( - CasingMagDipole2Deriv_z_z, rng.normal(size=n), plotIt=False + CasingMagDipole2Deriv_z_z, + rng.normal(size=n), + plotIt=False, + random_seed=rng, ) diff --git a/tests/em/fdem/forward/test_FDEM_primsec.py b/tests/em/fdem/forward/test_FDEM_primsec.py index a4e4494871..76c09f0c99 100644 --- a/tests/em/fdem/forward/test_FDEM_primsec.py +++ b/tests/em/fdem/forward/test_FDEM_primsec.py @@ -5,7 +5,6 @@ from simpeg import maps, tests, utils from simpeg.electromagnetics import frequency_domain as fdem -from pymatsolver import Pardiso as Solver import numpy as np import unittest @@ -126,8 +125,7 @@ def fun(x): lambda x: self.secondarySimulation.Jvec(x0, x, f=self.fields_primsec), ] - np.random.seed(1983) # set a random seed for check_derivative - return tests.check_derivative(fun, x0, num=2, plotIt=False) + return tests.check_derivative(fun, x0, num=2, plotIt=False, random_seed=515) def AdjointTest(self): print("\nTesting adjoint") @@ -169,7 +167,6 @@ def setUpClass(self): self.primarySimulation = fdem.Simulation3DMagneticFluxDensity( meshp, sigmaMap=primaryMapping ) - self.primarySimulation.solver = Solver primarySrc = fdem.Src.MagDipole(self.rxlist, frequency=freq, location=src_loc) self.primarySurvey = fdem.Survey([primarySrc]) @@ -185,7 +182,6 @@ def setUpClass(self): self.secondarySimulation = fdem.Simulation3DMagneticFluxDensity( meshs, survey=self.secondarySurvey, sigmaMap=mapping ) - self.secondarySimulation.solver = Solver # Full 3D problem to compare with self.survey3D = fdem.Survey([primarySrc]) @@ -193,7 +189,6 @@ def setUpClass(self): self.simulation3D = fdem.Simulation3DMagneticFluxDensity( meshs, survey=self.survey3D, sigmaMap=mapping ) - self.simulation3D.solver = Solver # solve and store fields print(" solving primary - secondary") @@ -236,7 +231,6 @@ def setUpClass(self): self.primarySimulation = fdem.Simulation3DCurrentDensity( meshp, sigmaMap=primaryMapping ) - self.primarySimulation.solver = Solver s_e = np.zeros(meshp.nF) inds = meshp.nFx + meshp.closest_points_index(src_loc, grid_loc="Fz") s_e[inds] = 1.0 / csz @@ -260,7 +254,6 @@ def setUpClass(self): survey=self.secondarySurvey, sigmaMap=mapping, ) - self.secondarySimulation.solver = Solver # Full 3D problem to compare with @@ -276,7 +269,6 @@ def setUpClass(self): self.simulation3D = fdem.Simulation3DElectricField( meshs, survey=self.survey3D, sigmaMap=mapping ) - self.simulation3D.solver = Solver self.simulation3D.model = model # solve and store fields diff --git a/tests/em/fdem/forward/test_permittivity.py b/tests/em/fdem/forward/test_permittivity.py index 2ef4abd272..aaaff90b74 100644 --- a/tests/em/fdem/forward/test_permittivity.py +++ b/tests/em/fdem/forward/test_permittivity.py @@ -6,7 +6,6 @@ import geoana import discretize from simpeg.electromagnetics import frequency_domain as fdem -from pymatsolver import Pardiso # set up the mesh @@ -83,7 +82,6 @@ def print_comparison( forward_only=True, sigma=conductivity, permittivity=epsilon, - solver=Pardiso, ), lambda survey, epsilon: fdem.Simulation3DMagneticFluxDensity( mesh, @@ -91,7 +89,6 @@ def print_comparison( forward_only=True, sigma=conductivity, permittivity=epsilon, - solver=Pardiso, ), ], ) @@ -138,7 +135,6 @@ def test_mag_dipole(epsilon, frequency, simulation): forward_only=True, sigma=conductivity, permittivity=epsilon, - solver=Pardiso, ), lambda survey, epsilon: fdem.Simulation3DMagneticField( mesh, @@ -146,7 +142,6 @@ def test_mag_dipole(epsilon, frequency, simulation): forward_only=True, sigma=conductivity, permittivity=epsilon, - solver=Pardiso, ), ], ) @@ -223,7 +218,6 @@ def test_cross_check_e_dipole(epsilon_r, frequency): forward_only=True, sigma=sigma, permittivity=rel_permittivity * epsilon_0, - solver=Pardiso, ) # H-formulation @@ -240,7 +234,6 @@ def test_cross_check_e_dipole(epsilon_r, frequency): forward_only=True, sigma=sigma, permittivity=rel_permittivity * epsilon_0, - solver=Pardiso, ) # compute fields @@ -315,7 +308,6 @@ def test_cross_check_b_dipole(epsilon_r, frequency): forward_only=True, sigma=sigma, permittivity=rel_permittivity * epsilon_0, - solver=Pardiso, ) # E-formulation @@ -330,7 +322,6 @@ def test_cross_check_b_dipole(epsilon_r, frequency): forward_only=True, sigma=sigma, permittivity=rel_permittivity * epsilon_0, - solver=Pardiso, ) # compute fields diff --git a/tests/em/fdem/inverse/derivs/test_FDEM_derivs.py b/tests/em/fdem/inverse/derivs/test_FDEM_derivs.py index c30005ba36..2aae768832 100644 --- a/tests/em/fdem/inverse/derivs/test_FDEM_derivs.py +++ b/tests/em/fdem/inverse/derivs/test_FDEM_derivs.py @@ -40,8 +40,9 @@ def derivTest(fdemType, comp, src): def fun(x): return prb.dpred(x), lambda x: prb.Jvec(x0, x) - np.random.seed(1983) # set a random seed for check_derivative - return tests.check_derivative(fun, x0, num=2, plotIt=False, eps=FLR) + return tests.check_derivative( + fun, x0, num=2, plotIt=False, eps=FLR, random_seed=6521 + ) class FDEM_DerivTests(unittest.TestCase): diff --git a/tests/em/fdem/muinverse/test_muinverse.py b/tests/em/fdem/muinverse/test_muinverse.py index 7e3841d396..9e45560342 100644 --- a/tests/em/fdem/muinverse/test_muinverse.py +++ b/tests/em/fdem/muinverse/test_muinverse.py @@ -181,8 +181,9 @@ def fun(x): rng = np.random.default_rng(seed=3321) dx = rng.uniform(size=mod.shape) * (mod.max() - mod.min()) * 0.01 - np.random.seed(1983) # set a random seed for check_derivative - return tests.check_derivative(fun, mod, dx=dx, num=4, plotIt=False) + return tests.check_derivative( + fun, mod, dx=dx, num=4, plotIt=False, random_seed=55 + ) def JtvecTest( self, prbtype="ElectricField", sigmaInInversion=False, invertMui=False diff --git a/tests/em/nsem/forward/test_1D_finite_volume.py b/tests/em/nsem/forward/test_1D_finite_volume.py index 4af4dae02f..5a836908d4 100644 --- a/tests/em/nsem/forward/test_1D_finite_volume.py +++ b/tests/em/nsem/forward/test_1D_finite_volume.py @@ -2,7 +2,6 @@ from discretize import TensorMesh from simpeg.electromagnetics import natural_source as nsem from simpeg import maps -from pymatsolver import Pardiso import unittest @@ -50,14 +49,12 @@ def get_simulation(self, formulation="e"): if formulation == "e": return nsem.simulation.Simulation1DElectricField( mesh=self.mesh, - solver=Pardiso, survey=self.survey, sigmaMap=maps.IdentityMap(), ) elif formulation == "h": return nsem.simulation.Simulation1DMagneticField( mesh=self.mesh, - solver=Pardiso, survey=self.survey, sigmaMap=maps.IdentityMap(), ) diff --git a/tests/em/nsem/forward/test_Problem1D_AnalyticVsNumeric.py b/tests/em/nsem/forward/test_Problem1D_AnalyticVsNumeric.py index a2432f9135..4a0ef2ee3e 100644 --- a/tests/em/nsem/forward/test_Problem1D_AnalyticVsNumeric.py +++ b/tests/em/nsem/forward/test_Problem1D_AnalyticVsNumeric.py @@ -34,7 +34,7 @@ def calculateAnalyticSolution(source_list, mesh, model): surveyAna = nsem.Survey(source_list) data1D = nsem.Data(surveyAna) for src in surveyAna.source_list: - elev = src.receiver_list[0].locations[0] + elev = src.receiver_list[0].locations_e[0] anaEd, anaEu, anaHd, anaHu = nsem.utils.analytic_1d.getEHfields( mesh, model, src.frequency, elev ) diff --git a/tests/em/nsem/forward/test_Problem3D_VsAnalyticSolution.py b/tests/em/nsem/forward/test_Problem3D_VsAnalyticSolution.py index 5086c62d43..5300d49273 100644 --- a/tests/em/nsem/forward/test_Problem3D_VsAnalyticSolution.py +++ b/tests/em/nsem/forward/test_Problem3D_VsAnalyticSolution.py @@ -5,8 +5,6 @@ from simpeg.electromagnetics import natural_source as nsem -np.random.seed(1100) - TOLr = 1 TOLp = 2 FLR = 1e-20 # "zero", so if residual below this --> pass regardless of order diff --git a/tests/em/nsem/forward/test_Recursive1D_VsAnalyticHalfspace.py b/tests/em/nsem/forward/test_Recursive1D_VsAnalyticHalfspace.py index 16395302a5..3242e6f5aa 100644 --- a/tests/em/nsem/forward/test_Recursive1D_VsAnalyticHalfspace.py +++ b/tests/em/nsem/forward/test_Recursive1D_VsAnalyticHalfspace.py @@ -1,9 +1,15 @@ import unittest +import warnings + from simpeg.electromagnetics import natural_source as nsem from simpeg import maps import numpy as np from scipy.constants import mu_0 +ns_rx = nsem.receivers + +import pytest + def create_survey(freq): receivers_list = [ @@ -61,5 +67,33 @@ def test_4(self): np.testing.assert_allclose(*compute_simulation(100.0, 1.0)) +@pytest.mark.parametrize( + "rx_class", + [ + ns_rx.Impedance, + ns_rx.PointNaturalSource, + ns_rx.Admittance, + ns_rx.Tipper, + ns_rx.Point3DTipper, + ns_rx.ApparentConductivity, + ], +) +def test_incorrect_rx_types(rx_class): + loc = np.zeros((1, 3)) + rx = rx_class(loc) + source = nsem.sources.Planewave(rx, frequency=10) + survey = nsem.Survey(source) + # make sure that only these exact classes do not issue warnings. + if rx_class in [ns_rx.Impedance, ns_rx.PointNaturalSource]: + with warnings.catch_warnings(): + warnings.simplefilter("error") + nsem.Simulation1DRecursive(survey=survey) + else: + with pytest.raises( + NotImplementedError, match="Simulation1DRecursive does not support .*" + ): + nsem.Simulation1DRecursive(survey=survey) + + if __name__ == "__main__": unittest.main() diff --git a/tests/em/nsem/forward/test_Simulation2D_vs_Analytic_pytest.py b/tests/em/nsem/forward/test_Simulation2D_vs_Analytic_pytest.py new file mode 100644 index 0000000000..96833bf431 --- /dev/null +++ b/tests/em/nsem/forward/test_Simulation2D_vs_Analytic_pytest.py @@ -0,0 +1,170 @@ +import pytest +from scipy.constants import mu_0 +import numpy as np +from discretize import TensorMesh +from simpeg.electromagnetics import natural_source as nsem +from simpeg.utils import model_builder +from simpeg import maps + +REL_TOLERANCE = 0.05 +ABS_TOLERANCE = 1e-13 + + +@pytest.fixture +def mesh(): + # Mesh for testing + return TensorMesh( + [ + [(40.0, 10, -1.4), (40.0, 50), (40.0, 10, 1.4)], + [(40.0, 10, -1.4), (40.0, 50), (40.0, 10, 1.4)], + ], + "CC", + ) + + +@pytest.fixture +def mapping(mesh): + return maps.IdentityMap(mesh) + + +def get_model(mesh, model_type): + # Model used for testing + model = 1e-8 * np.ones(mesh.nC) + model[mesh.cell_centers[:, 1] < 0.0] = 1e-2 + + if model_type == "layer": + model[mesh.cell_centers[:, 1] < -500.0] = 1e-1 + elif model_type == "block": + ind_block = model_builder.get_block_indices( + mesh.cell_centers, + np.array([-500, -800]), + np.array([500, -400]), + ) + model[ind_block] = 1e-1 + + return model + + +@pytest.fixture +def locations(): + # Receiver locations + elevation = 0.0 + rx_x = np.arange(-350, 350, 200) + return np.c_[rx_x, elevation + np.zeros_like(rx_x)] + + +@pytest.fixture +def frequencies(): + # Frequencies being evaluated + return [1e1, 2e1] + + +def get_survey(locations, frequencies, survey_type, component, orientation): + source_list = [] + + for f in frequencies: + # MT data types (Zxy, Zyx) + if survey_type == "impedance": + rx_list = [ + nsem.receivers.Impedance( + locations_e=locations, + locations_h=locations, + orientation=orientation, + component=component, + ) + ] + + # ZTEM data types (Tzx, Tzy) + elif survey_type == "tipper": + rx_list = [ + nsem.receivers.Tipper( + locations_h=locations, + locations_base=locations, + orientation=orientation, + component=component, + ) + ] + + source_list.append(nsem.sources.Planewave(rx_list, f)) + + return nsem.survey.Survey(source_list) + + +def get_analytic_halfspace_solution(sigma, f, survey_type, component, orientation): + # MT data types (Zxy, Zyx) + if survey_type == "impedance": + if component in ["real", "imag"]: + ampl = np.sqrt(np.pi * f * mu_0 / sigma) + if orientation == "xy": + return -ampl + else: + return ampl + elif component == "app_res": + return 1 / sigma + elif component == "phase": + if orientation == "xy": + return -135.0 + else: + return 45 + + # ZTEM data types (Tzx, Tzy) + elif survey_type == "tipper": + return 0.0 + + +# Validate impedances, tippers and admittances against analytic +# solution for a halfspace. + +CASES_LIST_HALFSPACE = [ + ("impedance", "real", "xy"), + ("impedance", "real", "yx"), + ("impedance", "imag", "xy"), + ("impedance", "imag", "yx"), + ("impedance", "app_res", "xy"), + ("impedance", "app_res", "yx"), + ("impedance", "phase", "xy"), + ("impedance", "phase", "yx"), + # ("tipper", "real", "zx"), + # ("tipper", "real", "zy"), + # ("tipper", "imag", "zx"), + # ("tipper", "imag", "zy"), +] + + +@pytest.mark.parametrize("survey_type, component, orientation", CASES_LIST_HALFSPACE) +def test_analytic_halfspace_solution( + survey_type, component, orientation, frequencies, locations, mesh, mapping +): + # Numerical solution + survey = get_survey(locations, frequencies, survey_type, component, orientation) + model_hs = get_model(mesh, "halfspace") # 1e-2 halfspace + if orientation in ["xy", "zx"]: + sim = nsem.simulation.Simulation2DElectricField( + mesh, survey=survey, sigmaMap=mapping + ) + elif orientation in ["yx", "zy"]: + sim = nsem.simulation.Simulation2DMagneticField( + mesh, survey=survey, sigmaMap=mapping + ) + + numeric_solution = sim.dpred(model_hs) + + # Analytic solution + sigma_hs = 1e-2 + n_locations = np.shape(locations)[0] + analytic_solution = np.hstack( + [ + get_analytic_halfspace_solution( + sigma_hs, f, survey_type, component, orientation + ) + for f in frequencies + ] + ) + analytic_solution = np.repeat(analytic_solution, n_locations) + + # # Error + err = np.abs( + (numeric_solution - analytic_solution) / (analytic_solution + ABS_TOLERANCE) + ) + + assert np.all(err < REL_TOLERANCE) diff --git a/tests/em/nsem/forward/test_Simulation3D_vs_Analytic_pytest.py b/tests/em/nsem/forward/test_Simulation3D_vs_Analytic_pytest.py new file mode 100644 index 0000000000..0bef1fd56c --- /dev/null +++ b/tests/em/nsem/forward/test_Simulation3D_vs_Analytic_pytest.py @@ -0,0 +1,192 @@ +import pytest +from scipy.constants import mu_0 +import numpy as np +from discretize import TensorMesh +from simpeg.electromagnetics import natural_source as nsem +from simpeg.utils import model_builder, mkvc +from simpeg import maps + +REL_TOLERANCE = 0.05 +ABS_TOLERANCE = 1e-13 + + +@pytest.fixture +def mesh(): + # Mesh for testing + return TensorMesh( + [ + [(200, 6, -1.5), (200.0, 4), (200, 6, 1.5)], + [(200, 6, -1.5), (200.0, 4), (200, 6, 1.5)], + [(200, 8, -1.5), (200.0, 8), (200, 8, 1.5)], + ], + "CCC", + ) + + +@pytest.fixture +def mapping(mesh): + return maps.IdentityMap(mesh) + + +def get_model(mesh, model_type): + # Model used for testing + model = 1e-8 * np.ones(mesh.nC) + model[mesh.cell_centers[:, 2] < 0.0] = 1e-2 + + if model_type == "layer": + model[mesh.cell_centers[:, 2] < -3000.0] = 1e-1 + elif model_type == "block": + ind_block = model_builder.get_block_indices( + mesh.cell_centers, + np.array([-1000, -1000, -1500]), + np.array([1000, 1000, -1000]), + ) + model[ind_block] = 1e-1 + + return model + + +@pytest.fixture +def locations(): + # Receiver locations + elevation = 0.0 + rx_x, rx_y = np.meshgrid(np.arange(-350, 350, 200), np.arange(-350, 350, 200)) + return np.hstack( + (mkvc(rx_x, 2), mkvc(rx_y, 2), elevation + np.zeros((np.prod(rx_x.shape), 1))) + ) + + +@pytest.fixture +def frequencies(): + # Frequencies being evaluated + return [1e-1, 2e-1] + + +def get_survey(locations, frequencies, survey_type, component): + source_list = [] + + for f in frequencies: + # MT data types (Zxx, Zxy, Zyx, Zyy) + if survey_type == "impedance": + if component == "phase": + orientations = ["xy", "yx"] # off-diagonal only!!! + else: + orientations = ["xx", "xy", "yx", "yy"] + rx_list = [ + nsem.receivers.Impedance( + locations_e=locations, + locations_h=locations, + orientation=ij, + component=component, + ) + for ij in orientations + ] + + # ZTEM data types (Txx, Tyx, Tzx, Txy, Tyy, Tzy) + elif survey_type == "tipper": + rx_list = [ + nsem.receivers.Tipper( + locations_h=locations, + locations_base=locations, + orientation=ij, + component=component, + ) + for ij in ["xx", "yx", "zx", "xy", "yy", "zy"] + ] + + # Admittance data types (Yxx, Yyx, Yzx, Yxy, Yyy, Yzy) + elif survey_type == "admittance": + rx_list = [ + nsem.receivers.Admittance( + locations_e=locations, + locations_h=locations, + orientation=ij, + component=component, + ) + for ij in ["xx", "yx", "zx", "xy", "yy", "zy"] + ] + + elif survey_type == "apparent_conductivity": + rx_list = [nsem.receivers.ApparentConductivity(locations)] + + source_list.append(nsem.sources.PlanewaveXYPrimary(rx_list, f)) + + return nsem.survey.Survey(source_list) + + +def get_analytic_halfspace_solution(sigma, f, survey_type, component): + # MT data types (Zxx, Zxy, Zyx, Zyy) + if survey_type == "impedance": + if component in ["real", "imag"]: + ampl = np.sqrt(np.pi * f * mu_0 / sigma) + return np.r_[0.0, -ampl, ampl, 0.0] + elif component == "app_res": + return np.r_[0.0, 1 / sigma, 1 / sigma, 0.0] + elif component == "phase": + return np.r_[-135.0, 45.0] # off-diagonal only! + + # ZTEM data types (Txx, Tyx, Tzx, Txy, Tyy, Tzy) + elif survey_type == "tipper": + if component == "real": + return np.r_[1.0, 0.0, 0.0, 0.0, 1.0, 0.0] + else: + return np.r_[0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + + # Admittance data types (Yxx, Yyx, Yzx, Yxy, Yyy, Yzy) + elif survey_type == "admittance": + ampl = 0.5 * np.sqrt(sigma / (np.pi * f * mu_0)) + if component == "real": + return np.r_[0.0, -ampl, 0.0, ampl, 0.0, 0.0] + else: + return np.r_[0.0, ampl, 0.0, -ampl, 0.0, 0.0] + + # MobileMT data type (app_cond) + elif survey_type == "apparent_conductivity": + return sigma + + +# Validate impedances, tippers and admittances against analytic +# solution for a halfspace. + +CASES_LIST_HALFSPACE = [ + ("impedance", "real"), + ("impedance", "imag"), + ("impedance", "app_res"), + ("impedance", "phase"), + ("tipper", "real"), + ("tipper", "imag"), + ("admittance", "real"), + ("admittance", "imag"), + ("apparent_conductivity", None), +] + + +@pytest.mark.parametrize("survey_type, component", CASES_LIST_HALFSPACE) +def test_analytic_halfspace_solution( + survey_type, component, frequencies, locations, mesh, mapping +): + # Numerical solution + survey = get_survey(locations, frequencies, survey_type, component) + model_hs = get_model(mesh, "halfspace") # 1e-2 halfspace + sim = nsem.simulation.Simulation3DPrimarySecondary( + mesh, survey=survey, sigmaPrimary=model_hs, sigmaMap=mapping + ) + numeric_solution = sim.dpred(model_hs) + + # Analytic solution + sigma_hs = 1e-2 + n_locations = np.shape(locations)[0] + analytic_solution = np.hstack( + [ + get_analytic_halfspace_solution(sigma_hs, f, survey_type, component) + for f in frequencies + ] + ) + analytic_solution = np.repeat(analytic_solution, n_locations) + + # # Error + err = np.abs( + (numeric_solution - analytic_solution) / (analytic_solution + ABS_TOLERANCE) + ) + + assert np.all(err < REL_TOLERANCE) diff --git a/tests/em/nsem/inversion/test_BC_Sims.py b/tests/em/nsem/inversion/test_BC_Sims.py index 10edb4ce3d..8962b76272 100644 --- a/tests/em/nsem/inversion/test_BC_Sims.py +++ b/tests/em/nsem/inversion/test_BC_Sims.py @@ -6,7 +6,6 @@ from simpeg.electromagnetics import natural_source as nsem from simpeg import maps from discretize import TensorMesh, TreeMesh, CylindricalMesh -from pymatsolver import Pardiso def check_deriv(sim, test_mod, **kwargs): @@ -25,8 +24,9 @@ def J_func(v): def check_adjoint(sim, test_mod): - u = np.random.rand(len(test_mod)) - v = np.random.rand(sim.survey.nD) + rng = np.random.default_rng(seed=42) + u = rng.uniform(size=len(test_mod)) + v = rng.uniform(size=sim.survey.nD) f = sim.fields(test_mod) Ju = sim.Jvec(test_mod, u, f=f) @@ -88,14 +88,12 @@ def create_simulation_1d(sim_type, deriv_type): mesh, survey=survey, **sim_kwargs, - solver=Pardiso, ) else: sim = nsem.simulation.Simulation1DMagneticField( mesh, survey=survey, **sim_kwargs, - solver=Pardiso, ) return sim, test_mod @@ -191,7 +189,6 @@ def create_simulation_2d(sim_type, deriv_type, mesh_type, fixed_boundary=False): mesh, survey=survey, **sim_kwargs, - solver=Pardiso, ) else: if fixed_boundary: @@ -242,7 +239,6 @@ def create_simulation_2d(sim_type, deriv_type, mesh_type, fixed_boundary=False): mesh, survey=survey, **sim_kwargs, - solver=Pardiso, ) return sim, test_mod @@ -259,19 +255,19 @@ def test_errors(self): def test_e_sigma_deriv(self): sim, test_mod = create_simulation_1d("e", "sigma") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=235) def test_h_sigma_deriv(self): sim, test_mod = create_simulation_1d("h", "sigma") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=5212) def test_e_mu_deriv(self): sim, test_mod = create_simulation_1d("e", "mu") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=63246) def test_h_mu_deriv(self): sim, test_mod = create_simulation_1d("h", "mu") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=124) def test_e_sigma_adjoint(self): sim, test_mod = create_simulation_1d("e", "sigma") @@ -332,13 +328,15 @@ def test_errors(self): nsem.simulation.Simulation2DMagneticField( mesh_2d, survey=survey_yx, e_bc=100 ) + + random_array = np.random.default_rng(seed=42).uniform(size=20) with self.assertRaises(TypeError): nsem.simulation.Simulation2DElectricField( - mesh_2d, survey=survey_xy, h_bc=np.random.rand(20) + mesh_2d, survey=survey_xy, h_bc=random_array ) with self.assertRaises(TypeError): nsem.simulation.Simulation2DMagneticField( - mesh_2d, survey=survey_yx, e_bc=np.random.rand(20) + mesh_2d, survey=survey_yx, e_bc=random_array ) # Check fixed boundary condition Key Error @@ -353,8 +351,9 @@ def test_errors(self): # Check fixed boundary condition length error bc = {} + rng = np.random.default_rng(seed=42) for freq in survey_xy.frequencies: - bc[freq] = np.random.rand(mesh_2d.boundary_edges.shape[0] + 3) + bc[freq] = rng.uniform(size=mesh_2d.boundary_edges.shape[0] + 3) with self.assertRaises(ValueError): nsem.simulation.Simulation2DElectricField( mesh_2d, survey=survey_xy, h_bc=bc @@ -366,19 +365,19 @@ def test_errors(self): def test_e_sigma_deriv(self): sim, test_mod = create_simulation_2d("e", "sigma", "TensorMesh") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=125) def test_h_sigma_deriv(self): sim, test_mod = create_simulation_2d("h", "sigma", "TensorMesh") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=7425) def test_e_mu_deriv(self): sim, test_mod = create_simulation_2d("e", "mu", "TensorMesh") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=236423) def test_h_mu_deriv(self): sim, test_mod = create_simulation_2d("h", "mu", "TensorMesh") - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=34632) def test_e_sigma_adjoint(self): sim, test_mod = create_simulation_2d("e", "sigma", "TensorMesh") @@ -408,13 +407,13 @@ def test_e_sigma_deriv_fixed(self): sim, test_mod = create_simulation_2d( "e", "sigma", "TensorMesh", fixed_boundary=True ) - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=2634) def test_h_sigma_deriv_fixed(self): sim, test_mod = create_simulation_2d( "h", "sigma", "TensorMesh", fixed_boundary=True ) - assert check_deriv(sim, test_mod, num=3) + assert check_deriv(sim, test_mod, num=3, random_seed=3651326) def test_e_sigma_adjoint_fixed(self): sim, test_mod = create_simulation_2d( diff --git a/tests/em/nsem/inversion/test_NSEM_2D_jvecjtvecadj_pytest.py b/tests/em/nsem/inversion/test_NSEM_2D_jvecjtvecadj_pytest.py new file mode 100644 index 0000000000..e93aee6089 --- /dev/null +++ b/tests/em/nsem/inversion/test_NSEM_2D_jvecjtvecadj_pytest.py @@ -0,0 +1,232 @@ +import pytest +import numpy as np +from discretize import TensorMesh, tests +from simpeg import ( + maps, + data_misfit, +) +from simpeg.utils import model_builder +from simpeg.electromagnetics import natural_source as nsem + +ADJ_RTOL = 1e-5 + + +@pytest.fixture +def mesh(): + return TensorMesh( + [ + [(40.0, 10, -1.4), (40.0, 50), (40.0, 10, 1.4)], + [(40.0, 10, -1.4), (40.0, 50), (40.0, 10, 1.4)], + ], + "CC", + ) + + +@pytest.fixture +def active_cells(mesh): + return mesh.cell_centers[:, 1] < 0.0 + + +@pytest.fixture +def mapping(mesh, active_cells): + return maps.InjectActiveCells(mesh, active_cells, 1e-8) * maps.ExpMap( + nP=np.sum(active_cells) + ) + + +@pytest.fixture +def sigma_hs(mesh, active_cells): + sigma_hs = 1e-8 * np.ones(mesh.nC) + sigma_hs[active_cells] = 1e1 + return sigma_hs + + +@pytest.fixture +def locations(): + # Receiver locations + elevation = 0.0 + rx_x = np.arange(-350, 350, 200) + return np.c_[rx_x, elevation + np.zeros_like(rx_x)] + + +@pytest.fixture +def frequencies(): + # Frequencies being evaluated + return [1e-1, 2e-1] + + +def get_survey(survey_type, orientation, components, locations, frequencies): + + if not isinstance(components, list): + components = [components] + + source_list = [] + + for f in frequencies: + + # MT data types (Zxy or Zyx) + if survey_type == "impedance": + rx_list = [ + nsem.receivers.Impedance( + locations, + orientation=orientation, + component=comp, + ) + for comp in components + ] + + # ZTEM data types (Tzx or Tzy) + elif survey_type == "tipper": + rx_list = [ + nsem.receivers.Tipper( + locations_h=locations, + locations_base=np.zeros_like(locations), + orientation=orientation, + component=comp, + ) + for comp in components + ] + + # Admittance data types (Yxy or Yyx) + elif survey_type == "admittance": + rx_list = [ + nsem.receivers.Admittance( + locations, + orientation=orientation, + component=comp, + ) + for comp in components + ] + + source_list.append(nsem.sources.Planewave(rx_list, f)) + + return nsem.survey.Survey(source_list) + + +CASES_LIST = [ + ("impedance", "xy", ["real", "imag"]), + ("impedance", "yx", ["real", "imag"]), + ("impedance", "xy", ["app_res"]), + ("impedance", "yx", ["app_res"]), + ("impedance", "xy", ["phase"]), + ("impedance", "yx", ["phase"]), +] + + +@pytest.mark.parametrize("survey_type, orientation, components", CASES_LIST) +class TestDerivatives: + def get_setup_objects( + self, + survey_type, + orientation, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ): + survey = get_survey( + survey_type, orientation, components, locations, frequencies + ) + + # Define the simulation + if orientation in ["xy", "zy"]: + sim = nsem.simulation.Simulation2DElectricField( + mesh, survey=survey, sigmaMap=mapping + ) + elif orientation in ["yx", "zx"]: + sim = nsem.simulation.Simulation2DMagneticField( + mesh, survey=survey, sigmaMap=mapping + ) + + n_active = np.sum(active_cells) + + rng = np.random.default_rng(4412) + # Model + m0 = np.log(1e1) * np.ones(n_active) + ind = model_builder.get_indices_block( + np.r_[-200.0, -600.0], + np.r_[200.0, -200.0], + mesh.cell_centers[active_cells, :], + ) + m0[ind] = np.log(1e0) + m0 += 0.01 * rng.uniform(low=-1, high=1, size=n_active) + + # Define data and misfit + data = sim.make_synthetic_data(m0, add_noise=True) + dmis = data_misfit.L2DataMisfit(simulation=sim, data=data) + + return m0, dmis + + def test_misfit( + self, + survey_type, + orientation, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ): + m0, dmis = self.get_setup_objects( + survey_type, + orientation, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ) + sim = dmis.simulation + + passed = tests.check_derivative( + lambda m: (sim.dpred(m), lambda mx: sim.Jvec(m, mx)), + m0, + plotIt=False, + num=2, + random_seed=42, + ) + + assert passed + + def test_adjoint( + self, + survey_type, + orientation, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ): + m0, dmis = self.get_setup_objects( + survey_type, + orientation, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ) + sim = dmis.simulation + n_data = sim.survey.nD + + f = sim.fields(m0) + tests.assert_isadjoint( + lambda u: sim.Jvec(m0, u, f=f), + lambda v: sim.Jtvec(m0, v, f=f), + m0.shape, + (n_data,), + rtol=ADJ_RTOL, + random_seed=44, + ) diff --git a/tests/em/nsem/inversion/test_NSEM_3D_jvecjtvecadj_pytest.py b/tests/em/nsem/inversion/test_NSEM_3D_jvecjtvecadj_pytest.py new file mode 100644 index 0000000000..457499fdc7 --- /dev/null +++ b/tests/em/nsem/inversion/test_NSEM_3D_jvecjtvecadj_pytest.py @@ -0,0 +1,252 @@ +import pytest +import numpy as np +from discretize import TensorMesh, tests +from simpeg import ( + maps, + data_misfit, +) +from simpeg.utils import mkvc, model_builder +from simpeg.electromagnetics import natural_source as nsem + +ADJ_RTOL = 1e-10 + + +@pytest.fixture +def mesh(): + return TensorMesh( + [ + [(200, 6, -1.5), (200.0, 4), (200, 6, 1.5)], + [(200, 6, -1.5), (200.0, 4), (200, 6, 1.5)], + [(200, 8, -1.5), (200.0, 8), (200, 8, 1.5)], + ], + "CCC", + ) + + +@pytest.fixture +def active_cells(mesh): + return mesh.cell_centers[:, 2] < 0.0 + + +@pytest.fixture +def mapping(mesh, active_cells): + return maps.InjectActiveCells(mesh, active_cells, 1e-8) * maps.ExpMap( + nP=np.sum(active_cells) + ) + + +@pytest.fixture +def sigma_hs(mesh, active_cells): + sigma_hs = 1e-8 * np.ones(mesh.nC) + sigma_hs[active_cells] = 1e1 + return sigma_hs + + +@pytest.fixture +def locations(): + # Receiver locations + elevation = 0.0 + rx_x, rx_y = np.meshgrid(np.arange(-350, 350, 200), np.arange(-350, 350, 200)) + return np.hstack( + (mkvc(rx_x, 2), mkvc(rx_y, 2), elevation + np.zeros((np.prod(rx_x.shape), 1))) + ) + + +@pytest.fixture +def frequencies(): + # Frequencies being evaluated + return [1e-1, 2e-1] + + +def get_survey(survey_type, orientations, components, locations, frequencies): + if not isinstance(orientations, list): + orientations = [orientations] + + if not isinstance(components, list): + components = [components] + + source_list = [] + + for f in frequencies: + rx_list = [] + + # MT data types (Zxx, Zxy, Zyx, Zyy) + if survey_type == "impedance": + for orient in orientations: + rx_list.extend( + [ + nsem.receivers.Impedance( + locations, + orientation=orient, + component=comp, + ) + for comp in components + ] + ) + + # ZTEM data types (Txx, Tyx, Tzx, Txy, Tyy, Tzy) + elif survey_type == "tipper": + for orient in orientations: + rx_list.extend( + [ + nsem.receivers.Tipper( + locations_h=locations, + locations_base=np.zeros_like(locations), + orientation=orient, + component=comp, + ) + for comp in components + ] + ) + + # Admittance data types (Yxx, Yyx, Yzx, Yxy, Yyy, Yzy) + elif survey_type == "admittance": + for orient in orientations: + rx_list.extend( + [ + nsem.receivers.Admittance( + locations, + orientation=orient, + component=comp, + ) + for comp in components + ] + ) + + # MobileMT is app_cond + elif survey_type == "apparent_conductivity": + rx_list.extend([nsem.receivers.ApparentConductivity(locations)]) + + source_list.append(nsem.sources.PlanewaveXYPrimary(rx_list, f)) + + return nsem.survey.Survey(source_list) + + +CASES_LIST = [ + ("impedance", ["xy", "yx"], ["real", "imag"]), + ("impedance", ["xx", "yy"], ["real", "imag"]), + ("impedance", ["xy", "yx"], ["app_res"]), + ("impedance", ["xx", "yy"], ["app_res"]), + ("impedance", ["xy", "yx"], ["phase"]), + ("tipper", ["zx", "zy"], ["real", "imag"]), + ("tipper", ["xx", "yy"], ["real", "imag"]), + ("tipper", ["xy", "yx"], ["real", "imag"]), + ("admittance", ["xy", "yx"], ["real", "imag"]), + ("admittance", ["xx", "yy"], ["real", "imag"]), + ("admittance", ["zx", "zy"], ["real", "imag"]), + ("apparent_conductivity", None, None), +] + + +@pytest.mark.parametrize("survey_type, orientations, components", CASES_LIST) +class TestDerivatives: + def get_setup_objects( + self, + survey_type, + orientations, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ): + survey = get_survey( + survey_type, orientations, components, locations, frequencies + ) + + # Define the simulation + sim = nsem.simulation.Simulation3DPrimarySecondary( + mesh, survey=survey, sigmaMap=mapping, sigmaPrimary=sigma_hs + ) + + n_active = np.sum(active_cells) + rng = np.random.default_rng(4412) + + # Model + m0 = np.log(1e1) * np.ones(n_active) + ind = model_builder.get_indices_block( + np.r_[-200.0, -200.0, -600.0], + np.r_[200.0, 200.0, -200.0], + mesh.cell_centers[active_cells, :], + ) + m0[ind] = np.log(1e0) + m0 += 0.01 * rng.uniform(low=-1, high=1, size=n_active) + + # Define data and misfit + data = sim.make_synthetic_data(m0, add_noise=True) + dmis = data_misfit.L2DataMisfit(simulation=sim, data=data) + + return m0, dmis + + def test_misfit( + self, + survey_type, + orientations, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ): + m0, dmis = self.get_setup_objects( + survey_type, + orientations, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ) + sim = dmis.simulation + + passed = tests.check_derivative( + lambda m: (sim.dpred(m), lambda mx: sim.Jvec(m, mx)), + m0, + plotIt=False, + num=3, + random_seed=412, + ) + + assert passed + + def test_adjoint( + self, + survey_type, + orientations, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ): + m0, dmis = self.get_setup_objects( + survey_type, + orientations, + components, + locations, + frequencies, + mesh, + active_cells, + mapping, + sigma_hs, + ) + sim = dmis.simulation + n_data = sim.survey.nD + + f = sim.fields(m0) + tests.assert_isadjoint( + lambda u: sim.Jvec(m0, u, f=f), + lambda v: sim.Jtvec(m0, v, f=f), + m0.shape, + (n_data,), + rtol=ADJ_RTOL, + random_seed=32, + ) diff --git a/tests/em/nsem/inversion/test_Problem1D_Adjoint.py b/tests/em/nsem/inversion/test_Problem1D_Adjoint.py index d3a9aaaafc..b81cda78b6 100644 --- a/tests/em/nsem/inversion/test_Problem1D_Adjoint.py +++ b/tests/em/nsem/inversion/test_Problem1D_Adjoint.py @@ -50,9 +50,9 @@ def JvecAdjointTest_1D(sigmaHalf, formulation="PrimSec"): m = np.r_[sigma_model, layer_thicknesses] u = simulation.fields(m) - np.random.seed(1983) - v = np.random.rand(survey.nD) - w = np.random.rand(len(m)) + rng = np.random.default_rng(seed=1983) + v = rng.uniform(size=survey.nD) + w = rng.uniform(size=len(m)) vJw = v.dot(simulation.Jvec(m, w, u)) wJtv = w.dot(simulation.Jtvec(m, v, u)) @@ -80,14 +80,10 @@ def JvecAdjointTest(sigmaHalf, formulation="PrimSec"): m = sigma u = problem.fields(m) - np.random.seed(1983) - v = np.random.rand( - survey.nD, - ) + rng = np.random.default_rng(seed=1983) + v = rng.uniform(size=survey.nD) # print problem.PropMap.PropModel.nP - w = np.random.rand( - problem.mesh.nC, - ) + w = rng.uniform(size=problem.mesh.nC) vJw = v.ravel().dot(problem.Jvec(m, w, u)) wJtv = w.ravel().dot(problem.Jtvec(m, v, u)) diff --git a/tests/em/nsem/inversion/test_Problem1D_Derivs.py b/tests/em/nsem/inversion/test_Problem1D_Derivs.py index 733e5bda1f..310a7ec4dc 100644 --- a/tests/em/nsem/inversion/test_Problem1D_Derivs.py +++ b/tests/em/nsem/inversion/test_Problem1D_Derivs.py @@ -46,12 +46,13 @@ def DerivJvecTest_1D(halfspace_value, freq=False, expMap=True): ) x0 = np.r_[sigma_model, layer_thicknesses] - np.random.seed(1983) def fun(x): return simulation.dpred(x), lambda x: simulation.Jvec(x0, x) - return tests.check_derivative(fun, x0, num=6, plotIt=False, eps=FLR) + return tests.check_derivative( + fun, x0, num=6, plotIt=False, eps=FLR, random_seed=298376 + ) def DerivJvecTest(halfspace_value, freq=False, expMap=True): @@ -69,13 +70,14 @@ def DerivJvecTest(halfspace_value, freq=False, expMap=True): ) x0 = sigBG - np.random.seed(1983) survey = simulation.survey def fun(x): return simulation.dpred(x), lambda x: simulation.Jvec(x0, x) - return tests.check_derivative(fun, x0, num=4, plotIt=False, eps=FLR) + return tests.check_derivative( + fun, x0, num=4, plotIt=False, eps=FLR, random_seed=5553 + ) class NSEM_DerivTests(unittest.TestCase): diff --git a/tests/em/nsem/inversion/test_Problem3D_Adjoint.py b/tests/em/nsem/inversion/test_Problem3D_Adjoint.py index ecafadd8d0..eb3ec464a4 100644 --- a/tests/em/nsem/inversion/test_Problem3D_Adjoint.py +++ b/tests/em/nsem/inversion/test_Problem3D_Adjoint.py @@ -44,14 +44,11 @@ def JvecAdjointTest( ) u = simulation.fields(m) - np.random.seed(1983) - v = np.random.rand( - simulation.survey.nD, - ) + rng = np.random.default_rng(seed=1983) + v = rng.uniform(size=simulation.survey.nD) # print problem.PropMap.PropModel.nP - w = np.random.rand( - len(m), - ) + w = rng.uniform(size=len(m)) + # print(problem.Jvec(m, w, u)) vJw = v.ravel().dot(simulation.Jvec(m, w, u)) wJtv = w.ravel().dot(simulation.Jtvec(m, v, u)) diff --git a/tests/em/nsem/inversion/test_Problem3D_Derivs.py b/tests/em/nsem/inversion/test_Problem3D_Derivs.py index 9d4b332a06..8540e9f3bc 100644 --- a/tests/em/nsem/inversion/test_Problem3D_Derivs.py +++ b/tests/em/nsem/inversion/test_Problem3D_Derivs.py @@ -2,7 +2,7 @@ import pytest import unittest import numpy as np -from simpeg import tests, mkvc +from simpeg import tests from simpeg.electromagnetics import natural_source as nsem from scipy.constants import mu_0 @@ -88,36 +88,9 @@ def DerivJvecTest(inputSetup, comp="All", freq=False, expMap=True): def fun(x): return simulation.dpred(x), lambda x: simulation.Jvec(m, x) - return tests.check_derivative(fun, m, num=3, plotIt=False, eps=FLR) - - -def DerivProjfieldsTest(inputSetup, comp="All", freq=False): - survey, simulation = nsem.utils.test_utils.setupSimpegNSEM_ePrimSec( - inputSetup, comp, freq + return tests.check_derivative( + fun, m, num=3, plotIt=False, eps=FLR, random_seed=1512 ) - print("Derivative test of data projection for eFormulation primary/secondary\n") - # simulation.mapping = Maps.ExpMap(simulation.mesh) - # Initate things for the derivs Test - src = survey.source_list[0] - np.random.seed(1983) - u0x = np.random.randn(survey.mesh.nE) + np.random.randn(survey.mesh.nE) * 1j - u0y = np.random.randn(survey.mesh.nE) + np.random.randn(survey.mesh.nE) * 1j - u0 = np.vstack((mkvc(u0x, 2), mkvc(u0y, 2))) - f0 = simulation.fieldsPair(survey.mesh, survey) - # u0 = np.hstack((mkvc(u0_px,2),mkvc(u0_py,2))) - f0[src, "e_pxSolution"] = u0[: len(u0) / 2] # u0x - f0[src, "e_pySolution"] = u0[len(u0) / 2 : :] # u0y - - def fun(u): - f = simulation.fieldsPair(survey.mesh, survey) - f[src, "e_pxSolution"] = u[: len(u) / 2] - f[src, "e_pySolution"] = u[len(u) / 2 : :] - return ( - rx.eval(src, survey.mesh, f), - lambda t: rx.evalDeriv(src, survey.mesh, f0, mkvc(t, 2)), - ) - - return tests.check_derivative(fun, u0, num=3, plotIt=False, eps=FLR) class NSEM_DerivTests(unittest.TestCase): diff --git a/tests/em/nsem/inversion/test_complex_resistivity.py b/tests/em/nsem/inversion/test_complex_resistivity.py index 45cc6ef6cc..3c98b3d80c 100644 --- a/tests/em/nsem/inversion/test_complex_resistivity.py +++ b/tests/em/nsem/inversion/test_complex_resistivity.py @@ -6,8 +6,8 @@ from discretize.utils import mkvc from simpeg.electromagnetics import natural_source as ns import numpy as np -from pymatsolver import Pardiso as Solver from discretize.utils import volume_average +import pytest TOLr = 5e-2 TOL = 1e-4 @@ -32,7 +32,7 @@ def setUp(self): # create background conductivity model sigma_back = 1e-2 - sigma_background = np.zeros(mesh.nC) * sigma_back + sigma_background = np.ones(mesh.nC) * sigma_back sigma_background[~active] = 1e-8 # create a model to test with @@ -79,7 +79,7 @@ def create_simulation(self, rx_type="apparent_resistivity", rx_orientation="xy") # Set the mapping actMap = maps.InjectActiveCells( - mesh=self.mesh, indActive=self.active, valInactive=np.log(1e-8) + mesh=self.mesh, active_cells=self.active, value_inactive=np.log(1e-8) ) mapping = maps.ExpMap(self.mesh) * actMap # print(survey_ns.source_list) @@ -89,7 +89,6 @@ def create_simulation(self, rx_type="apparent_resistivity", rx_orientation="xy") survey=survey_ns, sigmaPrimary=self.sigma_background, sigmaMap=mapping, - solver=Solver, ) return sim @@ -121,7 +120,7 @@ def create_simulation_rx(self, rx_type="apparent_resistivity", rx_orientation="x # Set the mapping actMap = maps.InjectActiveCells( - mesh=self.mesh, indActive=self.active, valInactive=np.log(1e-8) + mesh=self.mesh, active_cells=self.active, value_inactive=np.log(1e-8) ) mapping = maps.ExpMap(self.mesh) * actMap # print(survey_ns.source_list) @@ -131,7 +130,6 @@ def create_simulation_rx(self, rx_type="apparent_resistivity", rx_orientation="x survey=survey_ns, sigmaPrimary=self.sigma_background, sigmaMap=mapping, - solver=Solver, ) return sim @@ -173,7 +171,7 @@ def create_simulation_1dprimary_assign_mesh1d( # Set the mapping actMap = maps.InjectActiveCells( - mesh=self.mesh, indActive=self.active, valInactive=np.log(1e-8) + mesh=self.mesh, active_cells=self.active, value_inactive=np.log(1e-8) ) mapping = maps.ExpMap(self.mesh) * actMap # print(survey_ns.source_list) @@ -182,7 +180,6 @@ def create_simulation_1dprimary_assign_mesh1d( self.mesh, survey=survey_ns, sigmaMap=mapping, - solver=Solver, ) return sim @@ -212,7 +209,7 @@ def create_simulation_1dprimary_assign( # Set the mapping actMap = maps.InjectActiveCells( - mesh=self.mesh, indActive=self.active, valInactive=np.log(1e-8) + mesh=self.mesh, active_cells=self.active, value_inactive=np.log(1e-8) ) mapping = maps.ExpMap(self.mesh) * actMap # print(survey_ns.source_list) @@ -221,20 +218,23 @@ def create_simulation_1dprimary_assign( self.mesh, survey=survey_ns, sigmaMap=mapping, - solver=Solver, ) return sim def check_deriv(self, sim): def fun(x): - return sim.dpred(x), lambda x: sim.Jvec(self.model, x) + d = sim.dpred(x) + return d, lambda y: sim.Jvec(x, y) - passed = tests.check_derivative(fun, self.model, num=3, plotIt=False) + passed = tests.check_derivative( + fun, self.model, num=3, plotIt=False, random_seed=1983 + ) self.assertTrue(passed) def check_adjoint(self, sim): - w = np.random.rand(len(self.model)) - v = np.random.rand(sim.survey.nD) + rng = np.random.default_rng(seed=42) + w = rng.uniform(size=len(self.model)) + v = rng.uniform(size=sim.survey.nD) f = sim.fields(self.model) vJw = v.ravel().dot(sim.Jvec(self.model, w, f)) @@ -275,6 +275,7 @@ def test_apparent_resistivity_yx(self): def test_apparent_resistivity_yy(self): self.check_deriv_adjoint("apparent_resistivity", "yy") + @pytest.mark.xfail() def test_phase_xx(self): self.check_deriv_adjoint("phase", "xx") @@ -284,9 +285,34 @@ def test_phase_xy(self): def test_phase_yx(self): self.check_deriv_adjoint("phase", "yx") + @pytest.mark.xfail() def test_phase_yy(self): self.check_deriv_adjoint("phase", "yy") + def test_real_xx(self): + self.check_deriv_adjoint("real", "xx") + + def test_real_xy(self): + self.check_deriv_adjoint("real", "xy") + + def test_real_yx(self): + self.check_deriv_adjoint("real", "yx") + + def test_real_yy(self): + self.check_deriv_adjoint("real", "yy") + + def test_imag_xx(self): + self.check_deriv_adjoint("imag", "xx") + + def test_imag_xy(self): + self.check_deriv_adjoint("imag", "xy") + + def test_imag_yx(self): + self.check_deriv_adjoint("imag", "yx") + + def test_imag_yy(self): + self.check_deriv_adjoint("imag", "yy") + if __name__ == "__main__": unittest.main() diff --git a/tests/em/nsem/survey/test_nsem_data.py b/tests/em/nsem/survey/test_nsem_data.py index 61babc3818..a6ccfe1604 100644 --- a/tests/em/nsem/survey/test_nsem_data.py +++ b/tests/em/nsem/survey/test_nsem_data.py @@ -34,5 +34,5 @@ def test_from_rec_array(self): for src in data_obj.survey.source_list: assert len(src.receiver_list) == 2 # one real, one imaginary component for rx in src.receiver_list: - np.testing.assert_almost_equal(rx.locations, [self.loc]) + np.testing.assert_almost_equal(rx.locations_e, [self.loc]) np.testing.assert_almost_equal(data_obj.dobs, np.array([0.5, 0.0, 0.5, 1.0])) diff --git a/tests/em/nsem/test_nsem_point_deprecations.py b/tests/em/nsem/test_nsem_point_deprecations.py new file mode 100644 index 0000000000..35128d890e --- /dev/null +++ b/tests/em/nsem/test_nsem_point_deprecations.py @@ -0,0 +1,215 @@ +import inspect +import re + +import pytest +import simpeg.electromagnetics.natural_source as nsem +import numpy as np +import discretize +import numpy.testing as npt + + +@pytest.fixture( + params=[ + "same_location", + "diff_location", + ] +) +def impedance_pairs(request): + test_e_locs = np.array([[0.2, 0.1, 0.3], [-0.1, 0.2, -0.3]]) + test_h_locs = np.array([[-0.2, 0.24, 0.1], [0.5, 0.2, -0.2]]) + + rx_point_type = request.param + if rx_point_type == "same": + rx1 = nsem.receivers.PointNaturalSource(test_e_locs) + rx2 = nsem.receivers.Impedance(test_e_locs, orientation="xy") + else: + rx1 = nsem.receivers.PointNaturalSource( + locations_e=test_e_locs, locations_h=test_h_locs + ) + rx2 = nsem.receivers.Impedance( + locations_e=test_e_locs, locations_h=test_h_locs, orientation="xy" + ) + return rx1, rx2 + + +@pytest.fixture() +def tipper_pairs(): + test_e_locs = np.array([[0.2, 0.1, 0.3], [-0.1, 0.2, -0.3]]) + + rx1 = nsem.receivers.Point3DTipper(test_e_locs) + rx2 = nsem.receivers.Tipper(test_e_locs, orientation="zx") + return rx1, rx2 + + +def test_deprecation(): + test_loc = np.array([10.0, 11.0, 12.0]) + with pytest.warns(FutureWarning, match="PointNaturalSource has been deprecated.*"): + nsem.receivers.PointNaturalSource(test_loc) + + with pytest.warns(FutureWarning, match="Using the default for locations.*"): + nsem.receivers.PointNaturalSource() + + with pytest.warns(FutureWarning, match="Point3DTipper has been deprecated.*"): + nsem.receivers.Point3DTipper(test_loc) + + +def test_imp_consistent_attributes(impedance_pairs): + rx1, rx2 = impedance_pairs + + for item_name in dir(rx1): + is_dunder = re.match(r"__\w+__", item_name) is not None + # skip a few things related to the wrapping, and dunder methods + if not (item_name in ["locations", "_uid", "uid", "_old__init__"] or is_dunder): + item1 = getattr(rx1, item_name) + item2 = getattr(rx2, item_name) + if not (inspect.isfunction(item1) or inspect.ismethod(item1)): + if isinstance(item1, np.ndarray): + npt.assert_array_equal(item1, item2) + else: + assert item1 == item2 + + npt.assert_array_equal(rx1.locations, rx2.locations_e) + + +def test_tip_consistent_attributes(tipper_pairs): + rx1, rx2 = tipper_pairs + + for item_name in dir(rx1): + is_dunder = re.match(r"__\w+__", item_name) is not None + # skip a few things related to the wrapping, and dunder methods + if not ( + item_name in ["locations", "locations_e", "_uid", "uid", "_old__init__"] + or is_dunder + ): + item1 = getattr(rx1, item_name) + item2 = getattr(rx2, item_name) + if not (inspect.isfunction(item1) or inspect.ismethod(item1)): + print(item_name, item1, item2) + if isinstance(item1, np.ndarray): + npt.assert_array_equal(item1, item2) + else: + assert item1 == item2 + + npt.assert_array_equal(rx1.locations, rx2.locations_h) + npt.assert_array_equal(rx1.locations, rx2.locations_base) + + +@pytest.mark.parametrize( + "rx_component", ["real", "imag", "apparent_resistivity", "phase", "complex"] +) +def test_imp_consistent_eval(impedance_pairs, rx_component): + rx1, rx2 = impedance_pairs + rx1.component = rx_component + rx2.component = rx_component + # test that the output of the function eval returns the same thing, + # since it was updated... + mesh = discretize.TensorMesh([3, 4, 5], origin="CCC") + + # create a mock simulation + src = nsem.sources.PlanewaveXYPrimary( + [rx1, rx2], frequency=10, sigma_primary=np.ones(mesh.n_cells) + ) + survey = nsem.Survey(src) + sim_temp = nsem.Simulation3DPrimarySecondary(survey=survey, mesh=mesh, sigma=1) + + # Create a mock field, + f = sim_temp.fieldsPair(sim_temp) + test_u = np.linspace(1, 2, 2 * mesh.n_edges) + 1j * np.linspace( + -1, 1, 2 * mesh.n_edges + ) + f[src, sim_temp._solutionType] = test_u.reshape(mesh.n_edges, 2) + + v1 = rx1.eval(src, mesh, f) + v2 = rx2.eval(src, mesh, f) + + npt.assert_equal(v1, v2) + + if rx_component == "real": + # do a quick test here that calling eval on rx1 is the same as calling + # eval on rx2 with a complex component + rx2.component = "complex" + with pytest.warns(FutureWarning, match="Calling with return_complex=True.*"): + v1 = rx1.eval(src, mesh, f, return_complex=True) + v2 = rx2.eval(src, mesh, f) + + # assert it reset + assert rx1.component == "real" + # assert the outputs are the same + npt.assert_equal(v1, v2) + + +@pytest.mark.parametrize("rx_component", ["real", "imag", "complex"]) +def test_tip_consistent_eval(tipper_pairs, rx_component): + rx1, rx2 = tipper_pairs + rx1.component = rx_component + rx2.component = rx_component + # test that the output of the function eval returns the same thing, + # since it was updated... + mesh = discretize.TensorMesh([3, 4, 5], origin="CCC") + + # create a mock simulation + src = nsem.sources.PlanewaveXYPrimary( + [rx1, rx2], frequency=10, sigma_primary=np.ones(mesh.n_cells) + ) + survey = nsem.Survey(src) + sim_temp = nsem.Simulation3DPrimarySecondary(survey=survey, mesh=mesh, sigma=1) + + # Create a mock field, + f = sim_temp.fieldsPair(sim_temp) + test_u = np.linspace(1, 2, 2 * mesh.n_edges) + 1j * np.linspace( + -1, 1, 2 * mesh.n_edges + ) + f[src, sim_temp._solutionType] = test_u.reshape(mesh.n_edges, 2) + + v1 = rx1.eval(src, mesh, f) + v2 = rx2.eval(src, mesh, f) + + npt.assert_equal(v1, v2) + + if rx_component == "real": + # do a quick test here that calling eval on rx1 is the same as calling + # eval on rx2 with a complex component + rx2.component = "complex" + with pytest.warns(FutureWarning, match="Calling with return_complex=True.*"): + v1 = rx1.eval(src, mesh, f, return_complex=True) + v2 = rx2.eval(src, mesh, f) + + # assert it reset + assert rx1.component == "real" + # assert the outputs are the same + npt.assert_equal(v1, v2) + + +def test_imp_location_initialization(): + loc_1 = np.empty((2, 3)) + loc_2 = np.empty((2, 3)) + with pytest.raises(TypeError, match="Cannot pass both locations and .*"): + nsem.receivers.PointNaturalSource(locations=loc_1, locations_h=loc_2) + + with pytest.raises(TypeError, match="Either locations or both locations_e.*"): + nsem.receivers.PointNaturalSource(locations_e=loc_1) + + rx1 = nsem.receivers.PointNaturalSource(locations=[loc_1]) + rx2 = nsem.receivers.Impedance(loc_1) + npt.assert_equal(rx1.locations, rx2.locations_e) + npt.assert_equal(rx1.locations, rx2.locations_h) + + rx1 = nsem.receivers.PointNaturalSource(locations=[loc_1, loc_2]) + rx2 = nsem.receivers.Impedance(loc_1, loc_2) + npt.assert_equal(rx1.locations_e, rx2.locations_e) + npt.assert_equal(rx1.locations_h, rx2.locations_h) + + with pytest.raises(ValueError, match="incorrect size of list, must be length .*"): + nsem.receivers.PointNaturalSource(locations=[loc_1, loc_2, loc_1]) + + +def test_tip_location_initialization(): + loc_1 = np.empty((2, 3)) + loc_2 = np.empty((2, 3)) + with pytest.warns(UserWarning, match="locations_e and locations_h are unused.*"): + nsem.receivers.Point3DTipper(locations=loc_1, locations_e=loc_2) + + with pytest.raises( + ValueError, match="incorrect size of list, must be length of 1 or 2" + ): + nsem.receivers.Point3DTipper([loc_1, loc_1, loc_1]) diff --git a/tests/em/static/test_DCIP_io_utils.py b/tests/em/static/test_DCIP_io_utils.py index 12bd6c6beb..eebf780d06 100644 --- a/tests/em/static/test_DCIP_io_utils.py +++ b/tests/em/static/test_DCIP_io_utils.py @@ -39,7 +39,8 @@ def test_dc2d(self): self.station_spacing, ) survey2D = dc.survey.Survey(source_list) - dobs = np.random.rand(survey2D.nD) + rng = np.random.default_rng(seed=42) + dobs = rng.uniform(size=survey2D.nD) dunc = 1e-3 * np.ones(survey2D.nD) data2D = data.Data(survey2D, dobs=dobs, standard_deviation=dunc) @@ -94,7 +95,8 @@ def test_ip2d(self): self.station_spacing, ) survey2D = dc.survey.Survey(source_list) - dobs = np.random.rand(survey2D.nD) + rng = np.random.default_rng(seed=42) + dobs = rng.uniform(size=survey2D.nD) dunc = 1e-3 * np.ones(survey2D.nD) data2D = data.Data(survey2D, dobs=dobs, standard_deviation=dunc) @@ -151,7 +153,8 @@ def test_dcip3d(self): self.station_spacing, ) survey3D = dc.survey.Survey(source_list) - dobs = np.random.rand(survey3D.nD) + rng = np.random.default_rng(seed=42) + dobs = rng.uniform(size=survey3D.nD) dunc = 1e-3 * np.ones(survey3D.nD) data3D = data.Data(survey3D, dobs=dobs, standard_deviation=dunc) diff --git a/tests/em/static/test_DC_1D_jvecjtvecadj.py b/tests/em/static/test_DC_1D_jvecjtvecadj.py index 87ff631371..c55e19aaa9 100644 --- a/tests/em/static/test_DC_1D_jvecjtvecadj.py +++ b/tests/em/static/test_DC_1D_jvecjtvecadj.py @@ -87,9 +87,9 @@ def test_forward_accuracy(data_type, rx_type, tx_type): @pytest.mark.parametrize("deriv_type", ("sigma", "h", "both")) def test_derivative(deriv_type): n_layer = 4 - np.random.seed(40) - log_cond = np.random.rand(n_layer) - log_thick = np.random.rand(n_layer - 1) + rng = np.random.default_rng(seed=40) + log_cond = rng.uniform(size=n_layer) + log_thick = rng.uniform(size=n_layer - 1) if deriv_type != "h": sigma_map = maps.ExpMap() @@ -130,15 +130,15 @@ def J(v): return d, J - assert check_derivative(sim_1d_func, model, plotIt=False, num=4) + assert check_derivative(sim_1d_func, model, plotIt=False, num=4, random_seed=125) @pytest.mark.parametrize("deriv_type", ("sigma", "h", "both")) def test_adjoint(deriv_type): n_layer = 4 - np.random.seed(40) - log_cond = np.random.rand(n_layer) - log_thick = np.random.rand(n_layer - 1) + rng = np.random.default_rng(seed=40) + log_cond = rng.uniform(size=n_layer) + log_thick = rng.uniform(size=n_layer - 1) if deriv_type != "h": sigma_map = maps.ExpMap() @@ -177,7 +177,7 @@ def J(v): def JT(v): return simulation.Jtvec(model, v) - assert_isadjoint(J, JT, len(model), survey.nD) + assert_isadjoint(J, JT, len(model), survey.nD, random_seed=5512) def test_errors(): @@ -219,9 +219,9 @@ def test_errors(): def test_functionality(): n_layer = 4 - np.random.seed(40) - log_cond = np.random.rand(n_layer) - thick = np.random.rand(n_layer - 1) + rng = np.random.default_rng(seed=40) + log_cond = rng.uniform(size=n_layer) + thick = rng.uniform(size=n_layer - 1) sigma_map = maps.ExpMap() model = log_cond diff --git a/tests/em/static/test_DC_2D_analytic.py b/tests/em/static/test_DC_2D_analytic.py index 9edbf3ca0f..c53fce458b 100644 --- a/tests/em/static/test_DC_2D_analytic.py +++ b/tests/em/static/test_DC_2D_analytic.py @@ -1,9 +1,11 @@ +import discretize import numpy as np import unittest +import pytest from discretize import TensorMesh -from simpeg import utils, SolverLU +from simpeg import utils from simpeg.electromagnetics import resistivity as dc from simpeg.electromagnetics import analytics @@ -43,19 +45,11 @@ def setUp(self): self.data_ana = data_ana self.plotIt = False - try: - from pymatsolver import Pardiso - - self.solver = Pardiso - except ImportError: - self.solver = SolverLU - def test_Simulation2DNodal(self, tolerance=0.05): simulation = dc.simulation_2d.Simulation2DNodal( self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -71,7 +65,6 @@ def test_Simulation2DCellCentered(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -114,19 +107,11 @@ def setUp(self): self.data_ana = data_ana self.plotIt = False - try: - from pymatsolver import Pardiso - - self.solver = Pardiso - except ImportError: - self.solver = SolverLU - def test_Simulation2DNodal(self, tolerance=0.05): simulation = dc.simulation_2d.Simulation2DNodal( self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -142,7 +127,6 @@ def test_Simulation2DCellCentered(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -187,19 +171,11 @@ def setUp(self): self.data_ana = data_ana self.plotIt = False - try: - from pymatsolver import PardisoSolver - - self.solver = PardisoSolver - except ImportError: - self.solver = SolverLU - def test_Simulation2DNodal(self, tolerance=0.05): simulation = dc.simulation_2d.Simulation2DNodal( self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -215,7 +191,6 @@ def test_Simulation2DCellCentered(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -259,19 +234,11 @@ def setUp(self): self.sigma = sigma self.data_ana = data_ana - try: - from pymatsolver import PardisoSolver - - self.solver = PardisoSolver - except ImportError: - self.solver = SolverLU - def test_Simulation2DCellCentered(self, tolerance=0.05): simulation = dc.simulation_2d.Simulation2DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -287,7 +254,6 @@ def test_Simulation2DNodal(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) data = simulation.dpred() @@ -345,19 +311,11 @@ def setUp(self): self.plotIt = False self.ROI_inds = ROI_inds - try: - from pymatsolver import PardisoSolver - - self.solver = PardisoSolver - except ImportError: - self.solver = SolverLU - def test_Simulation2DCellCentered(self, tolerance=0.05): simulation = dc.simulation_2d.Simulation2DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, ) field = simulation.fields() @@ -374,7 +332,6 @@ def test_Simulation2DCellCentered_Dirichlet(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Dirichlet", ) field = simulation.fields() @@ -392,7 +349,6 @@ def test_Simulation2DNodal(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, ) field = simulation.fields() data = field[:, "phi"][:, 0] @@ -437,19 +393,11 @@ def setUp(self): self.sigma_half = sighalf self.plotIt = False - try: - from pymatsolver import Pardiso - - self.solver = Pardiso - except ImportError: - self.solver = SolverLU - def test_Simulation2DNodal(self, tolerance=0.05): simulation = dc.simulation_2d.Simulation2DNodal( self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) with self.assertRaises(KeyError): @@ -468,7 +416,6 @@ def test_Simulation2DCellCentered(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=self.solver, bc_type="Robin", ) with self.assertRaises(KeyError): @@ -483,5 +430,12 @@ def test_Simulation2DCellCentered(self, tolerance=0.05): self.assertLess(err, tolerance) +def test_bad_mesh_dim(): + mesh = discretize.TensorMesh([3, 3, 3]) + msg = "Simulation2DNodal mesh must be 2D, received a 3D mesh." + with pytest.raises(ValueError, match=msg): + dc.Simulation2DNodal(mesh) + + if __name__ == "__main__": unittest.main() diff --git a/tests/em/static/test_DC_2D_jvecjtvecadj.py b/tests/em/static/test_DC_2D_jvecjtvecadj.py index c25e06711f..3ea979bca6 100644 --- a/tests/em/static/test_DC_2D_jvecjtvecadj.py +++ b/tests/em/static/test_DC_2D_jvecjtvecadj.py @@ -13,11 +13,6 @@ ) from simpeg.electromagnetics import resistivity as dc -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - class DCProblem_2DTests(unittest.TestCase): formulation = "Simulation2DCellCentered" @@ -47,12 +42,11 @@ def setUp(self): mesh, rhoMap=maps.IdentityMap(mesh), storeJ=self.storeJ, - solver=Solver, survey=survey, bc_type=self.bc_type, ) mSynth = np.ones(mesh.nC) * 1.0 - data = simulation.make_synthetic_data(mSynth, add_noise=True) + data = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=data) @@ -78,6 +72,7 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=9582376, ) self.assertTrue(passed) @@ -94,7 +89,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=23, ) self.assertTrue(passed) diff --git a/tests/em/static/test_DC_FieldsDipoleFullspace.py b/tests/em/static/test_DC_FieldsDipoleFullspace.py index ac33a2f2b9..d36a43595e 100644 --- a/tests/em/static/test_DC_FieldsDipoleFullspace.py +++ b/tests/em/static/test_DC_FieldsDipoleFullspace.py @@ -5,10 +5,6 @@ import numpy as np from simpeg.electromagnetics import resistivity as dc -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver from geoana.em import fdem from scipy.constants import mu_0, epsilon_0 @@ -103,7 +99,6 @@ def test_Simulation3DCellCentered_Dirichlet(self, tolerance=0.1): simulation = dc.Simulation3DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, bc_type="Dirichlet" ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) @@ -136,7 +131,6 @@ def test_Simulation3DCellCentered_Mixed(self, tolerance=0.1): simulation = dc.simulation.Simulation3DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, bc_type="Mixed" ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) @@ -165,7 +159,6 @@ def test_Simulation3DCellCentered_Neumann(self, tolerance=0.1): simulation = dc.Simulation3DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, bc_type="Neumann" ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) @@ -276,7 +269,6 @@ def test_Simulation3DNodal(self, tolerance=0.1): simulation = dc.simulation.Simulation3DNodal( self.mesh, survey=self.survey, sigma=self.sigma ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) diff --git a/tests/em/static/test_DC_FieldsMultipoleFullspace.py b/tests/em/static/test_DC_FieldsMultipoleFullspace.py index d5e9b8ebfc..d0ff665636 100644 --- a/tests/em/static/test_DC_FieldsMultipoleFullspace.py +++ b/tests/em/static/test_DC_FieldsMultipoleFullspace.py @@ -5,11 +5,6 @@ import numpy as np from simpeg.electromagnetics import resistivity as dc -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - from geoana.em import fdem from scipy.constants import mu_0, epsilon_0 @@ -131,7 +126,6 @@ def test_Simulation3DCellCentered_Dirichlet(self, tolerance=0.1): simulation = dc.Simulation3DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, bc_type="Dirichlet" ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) @@ -157,7 +151,6 @@ def test_Simulation3DCellCentered_Mixed(self, tolerance=0.1): simulation = dc.simulation.Simulation3DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, bc_type="Mixed" ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) @@ -175,7 +168,6 @@ def test_Simulation3DCellCentered_Neumann(self, tolerance=0.1): simulation = dc.Simulation3DCellCentered( self.mesh, survey=self.survey, sigma=self.sigma, bc_type="Neumann" ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) @@ -305,7 +297,6 @@ def test_Simulation3DNodal(self, tolerance=0.1): simulation = dc.simulation.Simulation3DNodal( self.mesh, survey=self.survey, sigma=self.sigma ) - simulation.solver = Solver f = simulation.fields() eNumeric = utils.mkvc(f[self.survey.source_list, "e"]) diff --git a/tests/em/static/test_DC_Utils.py b/tests/em/static/test_DC_Utils.py index 5e98513a81..8055041cdf 100644 --- a/tests/em/static/test_DC_Utils.py +++ b/tests/em/static/test_DC_Utils.py @@ -12,11 +12,6 @@ import shutil import os -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - class DCUtilsTests_halfspace(unittest.TestCase): def setUp(self): @@ -83,17 +78,16 @@ def test_io_rhoa(self): dim=self.mesh.dim, ) - self.assertEqual(survey_type, survey.survey_type) - # Setup Problem with exponential mapping expmap = maps.ExpMap(self.mesh) problem = dc.Simulation3DCellCentered( self.mesh, sigmaMap=expmap, survey=survey, bc_type="Neumann" ) - problem.solver = Solver # Create synthetic data - dobs = problem.make_synthetic_data(self.model, relative_error=0.0) + dobs = problem.make_synthetic_data( + self.model, relative_error=0.0, random_seed=40 + ) dobs.noise_floor = 1e-5 # Testing IO diff --git a/tests/em/static/test_DC_analytic.py b/tests/em/static/test_DC_analytic.py index d26c1a1cca..e247877902 100644 --- a/tests/em/static/test_DC_analytic.py +++ b/tests/em/static/test_DC_analytic.py @@ -6,11 +6,6 @@ from simpeg.electromagnetics import resistivity as dc from simpeg.electromagnetics import analytics -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - class DCProblemAnalyticTests(unittest.TestCase): def setUp(self): @@ -55,7 +50,6 @@ def test_Simulation3DNodal(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=Solver, bc_type="Neumann", ) data = simulation.dpred() @@ -77,7 +71,6 @@ def test_Simulation3DNodal_Robin(self, tolerance=0.05): self.mesh, survey=self.survey, sigma=self.sigma, - solver=Solver, bc_type="Robin", ) data = simulation.dpred() @@ -93,7 +86,6 @@ def test_Simulation3DCellCentered_Mixed(self, tolerance=0.05): survey=self.survey, sigma=self.sigma, bc_type="Mixed", - solver=Solver, ) data = simulation.dpred() @@ -116,7 +108,6 @@ def test_Simulation3DCellCentered_Neumann(self, tolerance=0.05): survey=self.survey, sigma=self.sigma, bc_type="Neumann", - solver=Solver, ) data = simulation.dpred() err = np.sqrt( @@ -178,7 +169,6 @@ def test_Simulation3DCellCentered_Dirichlet(self, tolerance=0.05): survey=self.survey, sigma=self.sigma, bc_type="Dirichlet", - solver=Solver, ) data = simulation.dpred() @@ -234,7 +224,6 @@ def test_Simulation3DCellCentered_Mixed(self, tolerance=0.05): survey=self.survey, sigma=self.sigma, bc_type="Mixed", - solver=Solver, ) data = simulation.dpred() err = np.sqrt( diff --git a/tests/em/static/test_DC_jvecjtvecadj.py b/tests/em/static/test_DC_jvecjtvecadj.py index 25c08fc8e2..7ab643fb33 100644 --- a/tests/em/static/test_DC_jvecjtvecadj.py +++ b/tests/em/static/test_DC_jvecjtvecadj.py @@ -13,10 +13,8 @@ ) from simpeg.utils import mkvc from simpeg.electromagnetics import resistivity as dc -from pymatsolver import Pardiso import shutil -np.random.seed(40) TOL = 1e-5 FLR = 1e-20 # "zero", so if residual below this --> pass regardless of order @@ -46,7 +44,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -72,14 +70,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=918367, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(mkvc(self.dobs).shape[0]) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=mkvc(self.dobs).shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -88,7 +88,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=6 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=6, + random_seed=63, ) self.assertTrue(passed) @@ -129,27 +133,28 @@ def setUp(self): mesh=mesh, survey=self.survey, sigmaMap=self.sigma_map, - solver=Pardiso, bc_type="Dirichlet", ) def test_e_deriv(self): - x0 = -1 + 1e-1 * np.random.rand(self.sigma_map.nP) + rng = np.random.default_rng(seed=42) + x0 = -1 + 1e-1 * rng.uniform(size=self.sigma_map.nP) def fun(x): return self.prob.dpred(x), lambda x: self.prob.Jvec(x0, x) - return tests.check_derivative(fun, x0, num=3, plotIt=False) + return tests.check_derivative(fun, x0, num=3, plotIt=False, random_seed=98253) def test_e_adjoint(self): print("Adjoint Test for e") - m = -1 + 1e-1 * np.random.rand(self.sigma_map.nP) + rng = np.random.default_rng(seed=42) + m = -1 + 1e-1 * rng.uniform(size=self.sigma_map.nP) u = self.prob.fields(m) # u = u[self.survey.source_list,'e'] - v = np.random.rand(self.survey.nD) - w = np.random.rand(self.sigma_map.nP) + v = rng.uniform(size=self.survey.nD) + w = rng.uniform(size=self.sigma_map.nP) vJw = v.dot(self.prob.Jvec(m, w, u)) wJtv = w.dot(self.prob.Jtvec(m, v, u)) @@ -185,7 +190,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -211,14 +216,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=825, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(mkvc(self.dobs).shape[0]) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=mkvc(self.dobs).shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -227,7 +234,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=3456845, ) self.assertTrue(passed) @@ -282,14 +293,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=562, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(mkvc(self.dobs).shape[0]) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=mkvc(self.dobs).shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -298,7 +311,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=1254, ) self.assertTrue(passed) @@ -327,7 +344,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -353,14 +370,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=98670234, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(mkvc(self.dobs).shape[0]) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=mkvc(self.dobs).shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -369,7 +388,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=4 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=4, + random_seed=5613789, ) self.assertTrue(passed) @@ -405,7 +428,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -431,14 +454,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=346, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(mkvc(self.dobs).shape[0]) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=mkvc(self.dobs).shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -447,7 +472,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=83475902, ) self.assertTrue(passed) @@ -487,7 +516,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(simulation=simulation, data=dobs) @@ -513,14 +542,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=908762, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(mkvc(self.dobs).shape[0]) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=mkvc(self.dobs).shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -529,7 +560,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=63426, ) self.assertTrue(passed) diff --git a/tests/em/static/test_DC_miniaturize.py b/tests/em/static/test_DC_miniaturize.py index 95a2fb67a7..317bbe4dd4 100644 --- a/tests/em/static/test_DC_miniaturize.py +++ b/tests/em/static/test_DC_miniaturize.py @@ -2,7 +2,6 @@ from simpeg.electromagnetics.static.utils.static_utils import generate_dcip_sources_line from simpeg import maps import numpy as np -from pymatsolver import Pardiso import discretize import os @@ -173,7 +172,6 @@ def setUp(self): self.sim1 = dc.Simulation2DNodal( survey=survey, mesh=mesh, - solver=Pardiso, storeJ=False, sigmaMap=maps.IdentityMap(mesh), miniaturize=False, @@ -182,7 +180,6 @@ def setUp(self): self.sim2 = dc.Simulation2DNodal( survey=survey, mesh=mesh, - solver=Pardiso, storeJ=False, sigmaMap=maps.IdentityMap(mesh), miniaturize=True, @@ -198,13 +195,15 @@ def test_dpred(self): self.assertTrue(np.allclose(d1, d2)) def test_Jvec(self): - u = np.random.rand(*self.model.shape) + rng = np.random.default_rng(seed=42) + u = rng.uniform(size=self.model.shape) J1u = self.sim1.Jvec(self.model, u, f=self.f1) J2u = self.sim2.Jvec(self.model, u, f=self.f2) self.assertTrue(np.allclose(J1u, J2u)) def test_Jtvec(self): - v = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.survey.nD) J1tv = self.sim1.Jtvec(self.model, v, f=self.f1) J2tv = self.sim2.Jtvec(self.model, v, f=self.f2) self.assertTrue(np.allclose(J1tv, J2tv)) @@ -269,7 +268,6 @@ def setUp(self): self.sim1 = dc.Simulation3DNodal( survey=survey, mesh=mesh, - solver=Pardiso, storeJ=False, sigmaMap=maps.IdentityMap(mesh), miniaturize=False, @@ -278,7 +276,6 @@ def setUp(self): self.sim2 = dc.Simulation3DNodal( survey=survey, mesh=mesh, - solver=Pardiso, storeJ=False, sigmaMap=maps.IdentityMap(mesh), miniaturize=True, @@ -295,13 +292,15 @@ def test_dpred(self): self.assertTrue(np.allclose(d1, d2)) def test_Jvec(self): - u = np.random.rand(*self.model.shape) + rng = np.random.default_rng(seed=42) + u = rng.uniform(size=self.model.shape) J1u = self.sim1.Jvec(self.model, u, f=self.f1) J2u = self.sim2.Jvec(self.model, u, f=self.f2) self.assertTrue(np.allclose(J1u, J2u)) def test_Jtvec(self): - v = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.survey.nD) J1tv = self.sim1.Jtvec(self.model, v, f=self.f1) J2tv = self.sim2.Jtvec(self.model, v, f=self.f2) self.assertTrue(np.allclose(J1tv, J2tv)) diff --git a/tests/em/static/test_IP_2D_fwd.py b/tests/em/static/test_IP_2D_fwd.py index 93c22b41e9..59c883a231 100644 --- a/tests/em/static/test_IP_2D_fwd.py +++ b/tests/em/static/test_IP_2D_fwd.py @@ -6,11 +6,6 @@ from simpeg.electromagnetics import resistivity as dc from simpeg.electromagnetics import induced_polarization as ip -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - class IPProblemAnalyticTests(unittest.TestCase): def setUp(self): @@ -57,7 +52,6 @@ def test_Simulation2DNodal(self): problemDC = dc.Simulation2DNodal( self.mesh, survey=self.surveyDC, sigmaMap=maps.IdentityMap(self.mesh) ) - problemDC.solver = Solver data0 = problemDC.dpred(self.sigma0) datainf = problemDC.dpred(self.sigmaInf) @@ -69,7 +63,6 @@ def test_Simulation2DNodal(self): sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), ) - problemIP.solver = Solver data_full = data0 - datainf data = problemIP.dpred(self.eta) @@ -87,7 +80,6 @@ def test_Simulation2DCellCentered(self): problemDC = dc.Simulation2DCellCentered( self.mesh, survey=self.surveyDC, rhoMap=maps.IdentityMap(self.mesh) ) - problemDC.solver = Solver data0 = problemDC.dpred(1.0 / self.sigma0) finf = problemDC.fields(1.0 / self.sigmaInf) datainf = problemDC.dpred(1.0 / self.sigmaInf, f=finf) @@ -100,7 +92,6 @@ def test_Simulation2DCellCentered(self): rho=1.0 / self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), ) - problemIP.solver = Solver data_full = data0 - datainf data = problemIP.dpred(self.eta) err = np.linalg.norm((data - data_full) / data_full) ** 2 / data_full.size @@ -165,7 +156,6 @@ def test_Simulation2DNodal(self): simDC = dc.Simulation2DNodal( self.mesh, sigmaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_dc, ) data0 = simDC.dpred(self.sigma0) @@ -176,7 +166,6 @@ def test_Simulation2DNodal(self): self.mesh, sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_ip, ) data = simIP.dpred(self.eta) @@ -185,7 +174,6 @@ def test_Simulation2DNodal(self): self.mesh, sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_ip, storeJ=True, ) @@ -209,7 +197,6 @@ def test_Simulation2DCellCentered(self): simDC = dc.Simulation2DCellCentered( self.mesh, sigmaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_dc, ) data0 = simDC.dpred(self.sigma0) @@ -220,7 +207,6 @@ def test_Simulation2DCellCentered(self): self.mesh, sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_ip, ) data = simIP.dpred(self.eta) diff --git a/tests/em/static/test_IP_2D_jvecjtvecadj.py b/tests/em/static/test_IP_2D_jvecjtvecadj.py index c95da77982..7cf4ed0176 100644 --- a/tests/em/static/test_IP_2D_jvecjtvecadj.py +++ b/tests/em/static/test_IP_2D_jvecjtvecadj.py @@ -14,8 +14,6 @@ from simpeg.electromagnetics import resistivity as dc from simpeg.electromagnetics import induced_polarization as ip -np.random.seed(30) - class IPProblemTestsCC(unittest.TestCase): def setUp(self): @@ -49,7 +47,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg = regularization.WeightedLeastSquares(mesh) @@ -73,14 +71,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=63426, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=30) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -89,7 +89,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=7861325, ) self.assertTrue(passed) @@ -126,7 +130,7 @@ def setUp(self): ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg = regularization.WeightedLeastSquares(mesh) @@ -150,14 +154,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=87643, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=30) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -166,7 +172,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=25938764, ) self.assertTrue(passed) diff --git a/tests/em/static/test_IP_fwd.py b/tests/em/static/test_IP_fwd.py index 3d722f931c..1ba373f891 100644 --- a/tests/em/static/test_IP_fwd.py +++ b/tests/em/static/test_IP_fwd.py @@ -7,11 +7,6 @@ from simpeg.electromagnetics import resistivity as dc from simpeg.electromagnetics import induced_polarization as ip -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - class IPProblemAnalyticTests(unittest.TestCase): def setUp(self): @@ -55,7 +50,6 @@ def test_Simulation3DNodal(self): simulationdc = dc.simulation.Simulation3DNodal( mesh=self.mesh, survey=self.surveyDC, sigmaMap=maps.IdentityMap(self.mesh) ) - simulationdc.solver = Solver data0 = simulationdc.dpred(self.sigma0) finf = simulationdc.fields(self.sigmaInf) datainf = simulationdc.dpred(self.sigmaInf, f=finf) @@ -68,7 +62,6 @@ def test_Simulation3DNodal(self): Ainv=simulationdc.Ainv, _f=finf, ) - simulationip.solver = Solver data_full = data0 - datainf data = simulationip.dpred(self.eta) err = np.linalg.norm((data - data_full) / data_full) ** 2 / data_full.size @@ -84,7 +77,6 @@ def test_Simulation3DCellCentered(self): simulationdc = dc.simulation.Simulation3DCellCentered( mesh=self.mesh, survey=self.surveyDC, sigmaMap=maps.IdentityMap(self.mesh) ) - simulationdc.solver = Solver data0 = simulationdc.dpred(self.sigma0) finf = simulationdc.fields(self.sigmaInf) datainf = simulationdc.dpred(self.sigmaInf, f=finf) @@ -97,7 +89,6 @@ def test_Simulation3DCellCentered(self): Ainv=simulationdc.Ainv, _f=finf, ) - simulationip.solver = Solver data_full = data0 - datainf data = simulationip.dpred(self.eta) err = np.linalg.norm((data - data_full) / data_full) ** 2 / data_full.size @@ -157,7 +148,6 @@ def test_Simulation3DNodal(self): simulationdc = dc.simulation.Simulation3DNodal( self.mesh, sigmaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_dc, ) data0 = simulationdc.dpred(self.sigma0) @@ -170,7 +160,6 @@ def test_Simulation3DNodal(self): sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), Ainv=simulationdc.Ainv, - solver=Solver, ) data = simulationip.dpred(self.eta) @@ -180,7 +169,6 @@ def test_Simulation3DNodal(self): sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), Ainv=simulationdc.Ainv, - solver=Solver, storeJ=True, ) data2 = simulationip_stored.dpred(self.eta) @@ -203,7 +191,6 @@ def test_Simulation3DCellCentered(self): simulationdc = dc.simulation.Simulation3DCellCentered( self.mesh, sigmaMap=maps.IdentityMap(self.mesh), - solver=Solver, survey=self.survey_dc, ) data0 = simulationdc.dpred(self.sigma0) @@ -216,7 +203,6 @@ def test_Simulation3DCellCentered(self): sigma=self.sigmaInf, etaMap=maps.IdentityMap(self.mesh), Ainv=simulationdc.Ainv, - solver=Solver, ) data = simulationip.dpred(self.eta) diff --git a/tests/em/static/test_IP_jvecjtvecadj.py b/tests/em/static/test_IP_jvecjtvecadj.py index 8884b3b385..ecc9a8188e 100644 --- a/tests/em/static/test_IP_jvecjtvecadj.py +++ b/tests/em/static/test_IP_jvecjtvecadj.py @@ -14,8 +14,6 @@ from simpeg.electromagnetics import induced_polarization as ip import shutil -np.random.seed(30) - class IPProblemTestsCC(unittest.TestCase): def setUp(self): @@ -41,7 +39,7 @@ def setUp(self): mesh=mesh, survey=survey, sigma=sigma, etaMap=maps.IdentityMap(mesh) ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -66,14 +64,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=63426, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.Survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=30) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -82,7 +82,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=234623, ) self.assertTrue(passed) @@ -111,7 +115,7 @@ def setUp(self): mesh=mesh, survey=survey, sigma=sigma, etaMap=maps.IdentityMap(mesh) ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -135,14 +139,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=63462, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.Survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=30) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -151,7 +157,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=5234, ) self.assertTrue(passed) @@ -184,7 +194,7 @@ def setUp(self): storeJ=True, ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -208,14 +218,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=4512, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.Survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=30) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -224,7 +236,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=541, ) self.assertTrue(passed) @@ -264,7 +280,7 @@ def setUp(self): storeJ=True, ) mSynth = np.ones(mesh.nC) * 0.1 - dobs = simulation.make_synthetic_data(mSynth, add_noise=True) + dobs = simulation.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=simulation) reg = regularization.WeightedLeastSquares(mesh) @@ -288,14 +304,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=512, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.Survey.nSrc) - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=30) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -304,7 +322,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=87623, ) self.assertTrue(passed) diff --git a/tests/em/static/test_SIP_2D_jvecjtvecadj.py b/tests/em/static/test_SIP_2D_jvecjtvecadj.py index 751aa7ea98..dd2cb4bb7c 100644 --- a/tests/em/static/test_SIP_2D_jvecjtvecadj.py +++ b/tests/em/static/test_SIP_2D_jvecjtvecadj.py @@ -14,13 +14,6 @@ import numpy as np from simpeg.electromagnetics import spectral_induced_polarization as sip -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - -np.random.seed(38) - class SIPProblemTestsCC(unittest.TestCase): def setUp(self): @@ -63,12 +56,11 @@ def setUp(self): etaMap=wires.eta, tauiMap=wires.taui, verbose=False, - solver=Solver, survey=survey, ) mSynth = np.r_[eta, 1.0 / tau] problem.model = mSynth - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg = regularization.WeightedLeastSquares(mesh) @@ -93,14 +85,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=51, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC * 2) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=38) + v = rng.uniform(size=self.mesh.nC * 2) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -109,7 +103,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=38, ) self.assertTrue(passed) @@ -155,12 +153,11 @@ def setUp(self): etaMap=wires.eta, tauiMap=wires.taui, verbose=False, - solver=Solver, survey=survey, ) mSynth = np.r_[eta, 1.0 / tau] problem.model = mSynth - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg = regularization.WeightedLeastSquares(mesh) @@ -185,13 +182,15 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=643, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test - v = np.random.rand(self.mesh.nC * 2) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=38) + v = rng.uniform(size=self.mesh.nC * 2) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -200,7 +199,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=2 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=2, + random_seed=521, ) self.assertTrue(passed) @@ -257,11 +260,10 @@ def setUp(self): tauiMap=actmaptau * wires.taui, cMap=actmapc * wires.c, actinds=~airind, - solver=Solver, survey=survey, ) mSynth = np.r_[eta[~airind], 1.0 / tau[~airind], c[~airind]] - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg_eta = regularization.WeightedLeastSquares( @@ -295,13 +297,15 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=575, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test - v = np.random.rand(self.reg.mapping.nP) - w = np.random.rand(self.survey.nD) + rng = np.random.default_rng(seed=38) + v = rng.uniform(size=self.reg.mapping.nP) + w = rng.uniform(size=self.survey.nD) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -310,7 +314,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=57556, ) self.assertTrue(passed) diff --git a/tests/em/static/test_SIP_jvecjtvecadj.py b/tests/em/static/test_SIP_jvecjtvecadj.py index d9400f6f1e..d1b0181fb4 100644 --- a/tests/em/static/test_SIP_jvecjtvecadj.py +++ b/tests/em/static/test_SIP_jvecjtvecadj.py @@ -13,13 +13,6 @@ import numpy as np from simpeg.electromagnetics import spectral_induced_polarization as sip -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - -np.random.seed(38) - class SIPProblemTestsCC(unittest.TestCase): def setUp(self): @@ -71,10 +64,9 @@ def setUp(self): tauiMap=wires.taui, storeJ=False, ) - problem.solver = Solver mSynth = np.r_[eta, 1.0 / tau] problem.model = mSynth - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg = regularization.WeightedLeastSquares(mesh) @@ -99,14 +91,16 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=51, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test # u = np.random.rand(self.mesh.nC*self.survey.nSrc) - v = np.random.rand(self.mesh.nC * 2) - w = np.random.rand(self.dobs.shape[0]) + rng = np.random.default_rng(seed=38) + v = rng.uniform(size=self.mesh.nC * 2) + w = rng.uniform(size=self.dobs.shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-10 @@ -115,7 +109,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=51, ) self.assertTrue(passed) @@ -168,10 +166,9 @@ def setUp(self): storeJ=False, ) print(survey.nD) - problem.solver = Solver mSynth = np.r_[eta, 1.0 / tau] print(survey.nD) - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) print(survey.nD) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) @@ -197,13 +194,15 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=5432, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test - v = np.random.rand(self.mesh.nC * 2) - w = np.random.rand(self.dobs.shape[0]) + rng = np.random.default_rng(seed=38) + v = rng.uniform(size=self.mesh.nC * 2) + w = rng.uniform(size=self.dobs.shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -212,7 +211,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=553254, ) self.assertTrue(passed) @@ -277,9 +280,8 @@ def setUp(self): verbose=False, ) - problem.solver = Solver mSynth = np.r_[eta[~airind], 1.0 / tau[~airind], c[~airind]] - dobs = problem.make_synthetic_data(mSynth, add_noise=True) + dobs = problem.make_synthetic_data(mSynth, add_noise=True, random_seed=40) # Now set up the problem to do some minimization dmis = data_misfit.L2DataMisfit(data=dobs, simulation=problem) reg_eta = regularization.Sparse(mesh, mapping=wires.eta, active_cells=~airind) @@ -307,13 +309,15 @@ def test_misfit(self): self.m0, plotIt=False, num=3, + random_seed=754, ) self.assertTrue(passed) def test_adjoint(self): # Adjoint Test - v = np.random.rand(self.reg.mapping.nP) - w = np.random.rand(self.dobs.shape[0]) + rng = np.random.default_rng(seed=38) + v = rng.uniform(size=self.reg.mapping.nP) + w = rng.uniform(size=self.dobs.shape[0]) wtJv = w.dot(self.p.Jvec(self.m0, v)) vtJtw = v.dot(self.p.Jtvec(self.m0, w)) passed = np.abs(wtJv - vtJtw) < 1e-8 @@ -322,7 +326,11 @@ def test_adjoint(self): def test_dataObj(self): passed = tests.check_derivative( - lambda m: [self.dmis(m), self.dmis.deriv(m)], self.m0, plotIt=False, num=3 + lambda m: [self.dmis(m), self.dmis.deriv(m)], + self.m0, + plotIt=False, + num=3, + random_seed=2234, ) self.assertTrue(passed) diff --git a/tests/em/static/test_SPjvecjtvecadj.py b/tests/em/static/test_SPjvecjtvecadj.py index 8d806a3de3..94fb2b86a4 100644 --- a/tests/em/static/test_SPjvecjtvecadj.py +++ b/tests/em/static/test_SPjvecjtvecadj.py @@ -43,8 +43,8 @@ def test_forward(): mesh=mesh, survey=dc_survey, sigma=conductivity ) - dc_dpred = sim_dc.make_synthetic_data(None, add_noise=False) - sp_dpred = sim.make_synthetic_data(q, add_noise=False) + dc_dpred = sim_dc.make_synthetic_data(None, add_noise=False, random_seed=40) + sp_dpred = sim.make_synthetic_data(q, add_noise=False, random_seed=40) np.testing.assert_allclose(dc_dpred.dobs, sp_dpred.dobs) @@ -71,8 +71,9 @@ def Jvec(v): return d, Jvec - m0 = np.random.randn(q_map.shape[1]) - check_derivative(func, m0, plotIt=False) + rng = np.random.default_rng(seed=42) + m0 = rng.normal(size=q_map.shape[1]) + check_derivative(func, m0, plotIt=False, random_seed=rng) @pytest.mark.parametrize( @@ -87,7 +88,8 @@ def test_adjoint(q_map): sim.model = None sim.qMap = q_map - model = np.random.rand(q_map.shape[1]) + rng = np.random.default_rng(seed=42) + model = rng.uniform(size=q_map.shape[1]) f = sim.fields(model) def Jvec(v): @@ -96,7 +98,9 @@ def Jvec(v): def Jtvec(v): return sim.Jtvec(model, v, f=f) - assert_isadjoint(Jvec, Jtvec, shape_u=(q_map.shape[1],), shape_v=(survey.nD)) + assert_isadjoint( + Jvec, Jtvec, shape_u=(q_map.shape[1],), shape_v=(survey.nD), random_seed=rng + ) def test_errors(): @@ -110,13 +114,11 @@ def test_clears(): # set qMap as a non-linear map to make sure it adds the correct # items to be cleared on model update sim.qMap = maps.IdentityMap() - assert sim.deleteTheseOnModelUpdate == [] - assert sim.clean_on_model_update == [] + assert sim._delete_on_model_update == [] sim.storeJ = True sim.qMap = maps.ExpMap() - assert sim.deleteTheseOnModelUpdate == ["_Jmatrix", "_gtgdiag"] - assert sim.clean_on_model_update == [] + assert sim._delete_on_model_update == ["_Jmatrix", "_gtgdiag"] def test_deprecations(): diff --git a/tests/em/static/test_dc_survey.py b/tests/em/static/test_dc_survey.py new file mode 100644 index 0000000000..f7b88754db --- /dev/null +++ b/tests/em/static/test_dc_survey.py @@ -0,0 +1,79 @@ +""" +Tests for resistivity (DC) survey objects. +""" + +import pytest +import numpy as np + +from discretize import TensorMesh +from simpeg.electromagnetics.static.resistivity import Survey +from simpeg.electromagnetics.static.resistivity import sources +from simpeg.electromagnetics.static.resistivity import receivers + + +class TestRemovedSourceType: + """ + Tests after removing the source_type argument and property. + """ + + def test_warning_after_argument(self): + """ + Test warning after passing source_type as argument to the constructor. + """ + msg = "Argument 'survey_type' is ignored and will be removed in future" + with pytest.warns(FutureWarning, match=msg): + survey = Survey(source_list=[], survey_type="dipole-dipole") + # Check if the object doesn't have a `_survey_type` attribute + assert not hasattr(survey, "_survey_type") + + def test_warning_removed_property(self): + """ + Test if warning is raised when accessing the survey_type property. + """ + survey = Survey(source_list=[]) + msg = "Property 'survey_type' has been removed." + with pytest.warns(FutureWarning, match=msg): + survey.survey_type + with pytest.warns(FutureWarning, match=msg): + survey.survey_type = "dipole-dipole" + + +class TestDeprecatedIndActive: + """ + Test the deprecated ``ind_active`` argument in ``drape_electrodes_on_topography``. + """ + + @pytest.fixture + def mesh(self): + return TensorMesh((5, 5, 5)) + + def test_error(self, mesh): + """ + Test if error is raised after passing ``ind_active`` as argument. + """ + survey = Survey(source_list=[]) + msg = "'ind_active' has been deprecated and will be removed in " + active_cells = np.ones(mesh.n_cells, dtype=bool) + with pytest.raises(TypeError, match=msg): + survey.drape_electrodes_on_topography( + mesh, active_cells, ind_active=active_cells + ) + + +def test_repr(): + """ + Test the __repr__ method of the survey. + """ + receivers_list = [ + receivers.Dipole( + locations_m=[[1, 2, 3], [4, 5, 6]], locations_n=[[7, 8, 9], [10, 11, 12]] + ) + ] + sources_list = [ + sources.Dipole( + receivers_list, location_a=[0.5, 1.5, 2.5], location_b=[4.5, 5.5, 6.5] + ) + ] + survey = Survey(source_list=sources_list) + expected_repr = "Survey(#sources: 1; #data: 2)" + assert repr(survey) == expected_repr diff --git a/tests/em/static/test_sip_survey.py b/tests/em/static/test_sip_survey.py new file mode 100644 index 0000000000..ff3ecc3b51 --- /dev/null +++ b/tests/em/static/test_sip_survey.py @@ -0,0 +1,34 @@ +""" +Tests for Spectral IP (SIP) survey objects. +""" + +import pytest + +from simpeg.electromagnetics.static.spectral_induced_polarization import Survey + + +class TestRemovedSourceType: + """ + Tests after removing the source_type argument and property. + """ + + def test_warning_after_argument(self): + """ + Test warning after passing source_type as argument to the constructor. + """ + msg = "Argument 'survey_type' is ignored and will be removed in future" + with pytest.warns(FutureWarning, match=msg): + survey = Survey(source_list=[], survey_type="dipole-dipole") + # Check if the object doesn't have a `_survey_type` attribute + assert not hasattr(survey, "_survey_type") + + def test_warning_removed_property(self): + """ + Test if warning is raised when accessing the survey_type property. + """ + survey = Survey(source_list=[]) + msg = "Property 'survey_type' has been removed." + with pytest.warns(FutureWarning, match=msg): + survey.survey_type + with pytest.warns(FutureWarning, match=msg): + survey.survey_type = "dipole-dipole" diff --git a/tests/em/static/test_spectral_ip_mappings.py b/tests/em/static/test_spectral_ip_mappings.py new file mode 100644 index 0000000000..99f244a2c0 --- /dev/null +++ b/tests/em/static/test_spectral_ip_mappings.py @@ -0,0 +1,63 @@ +""" +Test ``spectral_ip_mappings`` function. +""" + +import pytest +import numpy as np + +import discretize +from simpeg.electromagnetics.static.spectral_induced_polarization import ( + spectral_ip_mappings, +) + + +class TestDeprecatedIndActive: + """Test deprecated ``indActive`` argument ``spectral_ip_mappings``.""" + + OLD_NAME = "indActive" + NEW_NAME = "active_cells" + + @pytest.fixture + def mesh(self): + """Sample mesh.""" + return discretize.TensorMesh([10, 10, 10], "CCN") + + @pytest.fixture + def active_cells(self, mesh): + """Sample active cells for the mesh.""" + active_cells = np.ones(mesh.n_cells, dtype=bool) + active_cells[0] = False + return active_cells + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def test_warning_argument(self, mesh, active_cells): + """ + Test if warning is raised after passing ``indActive`` as argument. + """ + msg = self.get_message_deprecated_warning(self.OLD_NAME, self.NEW_NAME) + with pytest.warns(FutureWarning, match=msg): + spectral_ip_mappings(mesh, indActive=active_cells) + + def test_error_duplicated_argument(self, mesh, active_cells): + """ + Test error after passing ``indActive`` and ``active_cells`` as arguments. + """ + msg = self.get_message_duplicated_error(self.OLD_NAME, self.NEW_NAME) + with pytest.raises(TypeError, match=msg): + spectral_ip_mappings( + mesh, active_cells=active_cells, indActive=active_cells + ) diff --git a/tests/em/static/test_static_utils.py b/tests/em/static/test_static_utils.py new file mode 100644 index 0000000000..b02489fac6 --- /dev/null +++ b/tests/em/static/test_static_utils.py @@ -0,0 +1,66 @@ +""" +Test functions in ``static_utils``. +""" + +import pytest +import numpy as np + +import discretize +from simpeg.electromagnetics.static.utils.static_utils import drapeTopotoLoc + + +class TestDeprecatedIndActive: + """Test deprecated ``ind_active`` argument ``drapeTopotoLoc``.""" + + OLD_NAME = "ind_active" + NEW_NAME = "active_cells" + + @pytest.fixture + def mesh(self): + """Sample mesh.""" + return discretize.TensorMesh([10, 10, 10], "CCN") + + @pytest.fixture + def points(self): + """Sample points.""" + return np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) + + @pytest.fixture + def active_cells(self, mesh): + """Sample active cells for the mesh.""" + active_cells = np.ones(mesh.n_cells, dtype=bool) + active_cells[0] = False + return active_cells + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def test_warning_argument(self, mesh, points, active_cells): + """ + Test if warning is raised after passing ``ind_active`` as argument. + """ + msg = self.get_message_deprecated_warning(self.OLD_NAME, self.NEW_NAME) + with pytest.warns(FutureWarning, match=msg): + drapeTopotoLoc(mesh, points, ind_active=active_cells) + + def test_error_duplicated_argument(self, mesh, points, active_cells): + """ + Test error after passing ``ind_active`` and ``active_cells`` as arguments. + """ + msg = self.get_message_duplicated_error(self.OLD_NAME, self.NEW_NAME) + with pytest.raises(TypeError, match=msg): + drapeTopotoLoc( + mesh, points, active_cells=active_cells, ind_active=active_cells + ) diff --git a/tests/em/tdem/test_TDEM_DerivAdjoint.py b/tests/em/tdem/test_TDEM_DerivAdjoint.py index 49d0b4476d..69514dd054 100644 --- a/tests/em/tdem/test_TDEM_DerivAdjoint.py +++ b/tests/em/tdem/test_TDEM_DerivAdjoint.py @@ -5,8 +5,6 @@ from simpeg import maps, tests from simpeg.electromagnetics import time_domain as tdem -from pymatsolver import Pardiso as Solver - plotIt = False testDeriv = True @@ -46,7 +44,6 @@ def get_prob(mesh, mapping, formulation, **kwargs): mesh, sigmaMap=mapping, **kwargs ) prb.time_steps = [(1e-05, 10), (5e-05, 10), (2.5e-4, 10)] - prb.solver = Solver return prb @@ -67,8 +64,9 @@ def setUpClass(self): mapping = get_mapping(mesh) self.survey = get_survey() self.prob = get_prob(mesh, mapping, self.formulation, survey=self.survey) - self.m = np.log(1e-1) * np.ones(self.prob.sigmaMap.nP) + 1e-3 * np.random.randn( - self.prob.sigmaMap.nP + rng = np.random.default_rng(seed=42) + self.m = np.log(1e-1) * np.ones(self.prob.sigmaMap.nP) + 1e-3 * rng.normal( + size=self.prob.sigmaMap.nP ) print("Solving Fields for problem {}".format(self.formulation)) t = time.time() @@ -103,7 +101,6 @@ def set_receiver_list(self, rxcomp): src.receiver_list = rxlist def JvecTest(self, rxcomp): - np.random.seed(10) self.set_receiver_list(rxcomp) def derChk(m): @@ -117,17 +114,19 @@ def derChk(m): prbtype=self.formulation, rxcomp=rxcomp ) ) - tests.check_derivative(derChk, self.m, plotIt=False, num=2, eps=1e-20) + tests.check_derivative( + derChk, self.m, plotIt=False, num=2, eps=1e-20, random_seed=12 + ) def JvecVsJtvecTest(self, rxcomp): - np.random.seed(10) self.set_receiver_list(rxcomp) print( "\nAdjoint Testing Jvec, Jtvec prob {}, {}".format(self.formulation, rxcomp) ) - m = np.random.rand(self.prob.sigmaMap.nP) - d = np.random.randn(self.prob.survey.nD) + rng = np.random.default_rng(seed=42) + m = rng.uniform(size=self.prob.sigmaMap.nP) + d = rng.normal(size=self.prob.survey.nD) V1 = d.dot(self.prob.Jvec(self.m, m, f=self.fields)) V2 = m.dot(self.prob.Jtvec(self.m, d, f=self.fields)) tol = TOL * (np.abs(V1) + np.abs(V2)) / 2.0 @@ -146,8 +145,9 @@ def test_eDeriv_m_adjoint(self): print("\n Testing eDeriv_m Adjoint") - m = np.random.rand(len(self.m)) - e = np.random.randn(prb.mesh.nE) + rng = np.random.default_rng(seed=42) + m = rng.uniform(size=len(self.m)) + e = rng.normal(size=prb.mesh.nE) V1 = e.dot(f._eDeriv_m(1, prb.survey.source_list[0], m)) V2 = m.dot(f._eDeriv_m(1, prb.survey.source_list[0], e, adjoint=True)) tol = TOL * (np.abs(V1) + np.abs(V2)) / 2.0 @@ -162,8 +162,9 @@ def test_eDeriv_u_adjoint(self): prb = self.prob f = self.fields - b = np.random.rand(prb.mesh.nF) - e = np.random.randn(prb.mesh.nE) + rng = np.random.default_rng(seed=42) + b = rng.uniform(size=prb.mesh.nF) + e = rng.normal(size=prb.mesh.nE) V1 = e.dot(f._eDeriv_u(1, prb.survey.source_list[0], b)) V2 = b.dot(f._eDeriv_u(1, prb.survey.source_list[0], e, adjoint=True)) tol = TOL * (np.abs(V1) + np.abs(V2)) / 2.0 diff --git a/tests/em/tdem/test_TDEM_DerivAdjoint_RawWaveform.py b/tests/em/tdem/test_TDEM_DerivAdjoint_RawWaveform.py index e650dde269..8b175a548b 100644 --- a/tests/em/tdem/test_TDEM_DerivAdjoint_RawWaveform.py +++ b/tests/em/tdem/test_TDEM_DerivAdjoint_RawWaveform.py @@ -6,7 +6,6 @@ from simpeg.electromagnetics import time_domain as tdem from simpeg.electromagnetics import utils from scipy.interpolate import interp1d -from pymatsolver import Pardiso as Solver import pytest plotIt = False @@ -47,7 +46,6 @@ def get_prob(mesh, mapping, formulation, **kwargs): prb = getattr(tdem, "Simulation3D{}".format(formulation))( mesh, sigmaMap=mapping, **kwargs ) - prb.solver = Solver return prb @@ -72,14 +70,14 @@ def setUpClass(self): time_steps = [(1e-3, 5), (1e-4, 5), (5e-5, 10), (5e-5, 10), (1e-4, 10)] t_mesh = discretize.TensorMesh([time_steps]) times = t_mesh.nodes_x - np.random.rand(412) + rng = np.random.default_rng(seed=42) self.survey = get_survey(times, self.t0) self.prob = get_prob( mesh, mapping, self.formulation, survey=self.survey, time_steps=time_steps ) self.m = np.log(1e-1) * np.ones(self.prob.sigmaMap.nP) - self.m *= 0.25 * np.random.rand(*self.m.shape) + 1 + self.m *= 0.25 * rng.uniform(size=self.m.shape) + 1 print("Solving Fields for problem {}".format(self.formulation)) t = time.time() @@ -120,7 +118,6 @@ def set_receiver_list(self, rxcomp): src.receiver_list = rxlist def JvecTest(self, rxcomp): - np.random.seed(4) self.set_receiver_list(rxcomp) def derChk(m): @@ -134,17 +131,19 @@ def derChk(m): prbtype=self.formulation, rxcomp=rxcomp ) ) - tests.check_derivative(derChk, self.m, plotIt=False, num=3, eps=1e-20) + tests.check_derivative( + derChk, self.m, plotIt=False, num=3, eps=1e-20, random_seed=5412 + ) def JvecVsJtvecTest(self, rxcomp): - np.random.seed(4) self.set_receiver_list(rxcomp) print( "\nAdjoint Testing Jvec, Jtvec prob {}, {}".format(self.formulation, rxcomp) ) - m = np.random.rand(self.prob.sigmaMap.nP) - d = np.random.randn(self.prob.survey.nD) + rng = np.random.default_rng(seed=4) + m = rng.uniform(size=self.prob.sigmaMap.nP) + d = rng.normal(size=self.prob.survey.nD) V1 = d.dot(self.prob.Jvec(self.m, m, f=self.fields)) V2 = m.dot(self.prob.Jtvec(self.m, d, f=self.fields)) tol = TOL * (np.abs(V1) + np.abs(V2)) / 2.0 @@ -308,7 +307,7 @@ def test_Jvec_adjoint_j_dhdtz(self): # return Av, ADeriv_dm # print('\n Testing ADeriv {}'.format(prbtype)) -# tests.check_derivative(AderivFun, m0, plotIt=False, num=4, eps=EPS) +# tests.check_derivative(AderivFun, m0, plotIt=False, num=4, eps=EPS, random_seed=512) # def A_adjointTest(self, prbtype): # prb, m0, mesh = setUp_TDEM(prbtype) diff --git a/tests/em/tdem/test_TDEM_DerivAdjoint_galvanic.py b/tests/em/tdem/test_TDEM_DerivAdjoint_galvanic.py index fb764d924b..9d6e5d192e 100644 --- a/tests/em/tdem/test_TDEM_DerivAdjoint_galvanic.py +++ b/tests/em/tdem/test_TDEM_DerivAdjoint_galvanic.py @@ -3,7 +3,6 @@ import discretize from simpeg import maps, tests from simpeg.electromagnetics import time_domain as tdem -from pymatsolver import Pardiso as Solver plotIt = False @@ -14,7 +13,6 @@ def setUp_TDEM(prbtype="ElectricField", rxcomp="ElectricFieldx", src_z=0.0): - np.random.seed(10) cs = 5.0 ncx = 8 ncy = 8 @@ -55,12 +53,12 @@ def setUp_TDEM(prbtype="ElectricField", rxcomp="ElectricFieldx", src_z=0.0): time_steps = [(1e-05, 10), (5e-05, 10), (2.5e-4, 10)] - m = np.log(5e-1) * np.ones(mapping.nP) + 1e-3 * np.random.randn(mapping.nP) + rng = np.random.default_rng(seed=42) + m = np.log(5e-1) * np.ones(mapping.nP) + 1e-3 * rng.normal(size=mapping.nP) prb = getattr(tdem, "Simulation3D{}".format(prbtype))( mesh, survey=survey, time_steps=time_steps, sigmaMap=mapping ) - prb.solver = Solver return prb, m, mesh @@ -77,7 +75,10 @@ def derChk(m): return [prb.dpred(m), lambda mx: prb.Jvec(m, mx)] print("test_Jvec_{prbtype}_{rxcomp}".format(prbtype=prbtype, rxcomp=rxcomp)) - tests.check_derivative(derChk, m, plotIt=False, num=2, eps=1e-20) + + tests.check_derivative( + derChk, m, plotIt=False, num=2, eps=1e-20, random_seed=52135 + ) def test_Jvec_e_dbzdt(self): self.JvecTest("ElectricField", "MagneticFluxTimeDerivativez") @@ -107,8 +108,9 @@ def JvecVsJtvecTest( print("\nAdjoint Testing Jvec, Jtvec prob {}, {}".format(prbtype, rxcomp)) prb, m0, mesh = setUp_TDEM(prbtype, rxcomp, src_z) - m = np.random.rand(prb.sigmaMap.nP) - d = np.random.randn(prb.survey.nD) + rng = np.random.default_rng(seed=42) + m = rng.uniform(size=prb.sigmaMap.nP) + d = rng.normal(size=prb.survey.nD) print(m.shape, d.shape, m0.shape) diff --git a/tests/em/tdem/test_TDEM_crosscheck.py b/tests/em/tdem/test_TDEM_crosscheck.py index ec0742b066..905b1115d9 100644 --- a/tests/em/tdem/test_TDEM_crosscheck.py +++ b/tests/em/tdem/test_TDEM_crosscheck.py @@ -3,11 +3,8 @@ from simpeg import maps from simpeg.electromagnetics import time_domain as tdem -from simpeg.electromagnetics import utils import numpy as np -from pymatsolver import Pardiso as Solver - TOL = 1e-4 FLR = 1e-20 @@ -16,7 +13,6 @@ def setUp_TDEM( prbtype="MagneticFluxDensity", rxcomp="bz", waveform="stepoff", src_type=None ): # set a seed so that the same conductivity model is used for all runs - np.random.seed(25) cs = 10.0 ncx = 4 ncy = 4 @@ -39,13 +35,11 @@ def setUp_TDEM( ) mapping = maps.ExpMap(mesh) * maps.SurjectVertical1D(mesh) * activeMap - rxtimes = np.logspace(-4, -3, 20) + rxtimes = np.hstack([np.r_[0], np.logspace(-4, -3, 20)]) if waveform.upper() == "RAW": - out = utils.VTEMFun(prb.times, 0.00595, 0.006, 100) - wavefun = interp1d(prb.times, out) t0 = 0.006 - waveform = tdem.Src.RawWaveform(off_time=t0, waveform_function=wavefun) + waveform = tdem.sources.VTEMWaveform(off_time=t0) time_steps = [(1e-3, 5), (1e-4, 5), (5e-5, 10), (5e-5, 10), (1e-4, 10)] rxtimes = t0 + rxtimes @@ -74,9 +68,11 @@ def setUp_TDEM( prb = getattr(tdem, "Simulation3D{}".format(prbtype))( mesh, survey=survey, time_steps=time_steps, sigmaMap=mapping ) - prb.solver = Solver - m = np.log(1e-1) * np.ones(prb.sigmaMap.nP) + 1e-2 * np.random.rand(prb.sigmaMap.nP) + rng = np.random.default_rng(seed=42) + m = np.log(1e-1) * np.ones(prb.sigmaMap.nP) + 1e-2 * rng.uniform( + size=prb.sigmaMap.nP + ) return prb, m, mesh diff --git a/tests/em/tdem/test_TDEM_forward_Analytic.py b/tests/em/tdem/test_TDEM_forward_Analytic.py index 1c6e85c18e..8eae1b5da3 100644 --- a/tests/em/tdem/test_TDEM_forward_Analytic.py +++ b/tests/em/tdem/test_TDEM_forward_Analytic.py @@ -3,7 +3,6 @@ import discretize import matplotlib.pyplot as plt import numpy as np -from pymatsolver import Pardiso as Solver from scipy.constants import mu_0 from simpeg import maps from simpeg.electromagnetics import analytics @@ -163,7 +162,6 @@ def analytic_wholespace_dipole_comparison( mesh=mesh, survey=survey, sigmaMap=mapping ) - sim.solver = Solver sim.time_steps = [ (1e-06, 40), (5e-06, 40), @@ -267,7 +265,6 @@ def analytic_halfspace_mag_dipole_comparison( sim = tdem.Simulation3DMagneticFluxDensity( mesh, survey=survey, time_steps=time_steps, sigmaMap=mapping ) - sim.solver = Solver sigma = np.ones(mesh.shape_cells[2]) * 1e-8 sigma[active] = sig_half diff --git a/tests/em/tdem/test_TDEM_forward_Analytic_RawWaveform.py b/tests/em/tdem/test_TDEM_forward_Analytic_RawWaveform.py index c5a8e9ba63..5e25069fc0 100644 --- a/tests/em/tdem/test_TDEM_forward_Analytic_RawWaveform.py +++ b/tests/em/tdem/test_TDEM_forward_Analytic_RawWaveform.py @@ -3,7 +3,6 @@ import discretize import matplotlib.pyplot as plt import numpy as np -from pymatsolver import Pardiso as Solver from scipy.constants import mu_0 from scipy.interpolate import interp1d from simpeg import maps @@ -79,7 +78,6 @@ def halfSpaceProblemAnaDiff( prb = tdem.Simulation3DMagneticFluxDensity( mesh, survey=survey, sigmaMap=mapping, time_steps=time_steps ) - prb.solver = Solver sigma = np.ones(mesh.shape_cells[2]) * 1e-8 sigma[active] = sig_half diff --git a/tests/em/tdem/test_TDEM_grounded.py b/tests/em/tdem/test_TDEM_grounded.py index c85a8807cc..dcd4a451c4 100644 --- a/tests/em/tdem/test_TDEM_grounded.py +++ b/tests/em/tdem/test_TDEM_grounded.py @@ -6,7 +6,6 @@ import discretize from simpeg.electromagnetics import time_domain as tdem from simpeg import maps, tests -from pymatsolver import Pardiso class TestGroundedSourceTDEM_j(unittest.TestCase): @@ -76,7 +75,6 @@ def setUpClass(self): time_steps=time_steps, mu=mu, sigmaMap=maps.ExpMap(mesh), - solver=Pardiso, ) survey = tdem.Survey([src]) @@ -93,11 +91,12 @@ def setUpClass(self): print("Testing problem {} \n\n".format(self.prob_type)) def derivtest(self, deriv_fct): - m0 = np.log(self.sigma) + np.random.rand(self.mesh.nC) + rng = np.random.default_rng(seed=42) + m0 = np.log(self.sigma) + rng.uniform(size=self.mesh.nC) self.prob.model = m0 return tests.check_derivative( - deriv_fct, np.log(self.sigma), num=3, plotIt=False + deriv_fct, np.log(self.sigma), num=3, plotIt=False, random_seed=521 ) def test_deriv_phi(self): @@ -131,22 +130,25 @@ def deriv_check(m): self.derivtest(deriv_check) def test_adjoint_phi(self): - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.mesh.nC) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.mesh.nC) a = w.T.dot(self.src._phiInitialDeriv(self.prob, v=v)) b = v.T.dot(self.src._phiInitialDeriv(self.prob, v=w, adjoint=True)) self.assertTrue(np.allclose(a, b)) def test_adjoint_j(self): - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.mesh.nF) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.mesh.nF) a = w.T.dot(self.src.jInitialDeriv(self.prob, v=v)) b = v.T.dot(self.src.jInitialDeriv(self.prob, v=w, adjoint=True)) self.assertTrue(np.allclose(a, b)) def test_adjoint_h(self): - v = np.random.rand(self.mesh.nC) - w = np.random.rand(self.mesh.nE) + rng = np.random.default_rng(seed=42) + v = rng.uniform(size=self.mesh.nC) + w = rng.uniform(size=self.mesh.nE) a = w.T.dot(self.src.hInitialDeriv(self.prob, v=v)) b = v.T.dot(self.src.hInitialDeriv(self.prob, v=w, adjoint=True)) self.assertTrue(np.allclose(a, b)) diff --git a/tests/em/tdem/test_TDEM_inductive_permeable.py b/tests/em/tdem/test_TDEM_inductive_permeable.py index 8bf243554d..b0bd644f34 100644 --- a/tests/em/tdem/test_TDEM_inductive_permeable.py +++ b/tests/em/tdem/test_TDEM_inductive_permeable.py @@ -10,7 +10,6 @@ from simpeg.electromagnetics import time_domain as tdem from simpeg import utils, maps -from pymatsolver import Pardiso plotIt = False TOL = 1e-4 @@ -158,14 +157,12 @@ def populate_target(mur): survey=survey, time_steps=time_steps, sigmaMap=maps.IdentityMap(mesh), - solver=Pardiso, ) prob_late_ontime = tdem.Simulation3DMagneticFluxDensity( mesh=mesh, survey=survey_late_ontime, time_steps=time_steps, sigmaMap=maps.IdentityMap(mesh), - solver=Pardiso, ) fields_dict = {} @@ -232,8 +229,9 @@ def populate_target(mur): assert all(passed) prob.sigma = 1e-4 * np.ones(mesh.nC) - v = utils.mkvc(np.random.rand(mesh.nE)) - w = utils.mkvc(np.random.rand(mesh.nF)) + rng = np.random.default_rng(seed=42) + v = utils.mkvc(rng.uniform(size=mesh.nE)) + w = utils.mkvc(rng.uniform(size=mesh.nF)) assert np.all( mesh.get_edge_inner_product(1e-4 * np.ones(mesh.nC)) * v == prob.MeSigma * v ) @@ -256,8 +254,9 @@ def populate_target(mur): ) prob.rho = 1.0 / 1e-3 * np.ones(mesh.nC) - v = utils.mkvc(np.random.rand(mesh.nE)) - w = utils.mkvc(np.random.rand(mesh.nF)) + rng = np.random.default_rng(seed=42) + v = utils.mkvc(rng.uniform(size=mesh.nE)) + w = utils.mkvc(rng.uniform(size=mesh.nF)) np.testing.assert_allclose( mesh.get_edge_inner_product(1e-3 * np.ones(mesh.nC)) * v, prob.MeSigma * v diff --git a/tests/em/tdem/test_TDEM_sources.py b/tests/em/tdem/test_TDEM_sources.py index 3d4fff3896..e46dbdc9e2 100644 --- a/tests/em/tdem/test_TDEM_sources.py +++ b/tests/em/tdem/test_TDEM_sources.py @@ -73,7 +73,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=5421) class TestVTEMWaveform(unittest.TestCase): @@ -115,7 +115,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=643) class TestTrapezoidWaveform(unittest.TestCase): @@ -157,7 +157,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=5277) class TestTriangularWaveform(unittest.TestCase): @@ -195,7 +195,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=874) class TestQuarterSineRampOnWaveform(unittest.TestCase): @@ -268,7 +268,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=7564) def test_waveform_without_plateau_derivative(self): # Test the waveform derivative at points between the time_nodes @@ -290,7 +290,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=12) def test_waveform_negative_plateau_derivative(self): # Test the waveform derivative at points between the time_nodes @@ -312,7 +312,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=52) class TestHalfSineWaveform(unittest.TestCase): @@ -372,7 +372,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=5) def test_waveform_without_plateau_derivative(self): # Test the waveform derivative at points between the time_nodes @@ -392,7 +392,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=6) class TestPiecewiseLinearWaveform(unittest.TestCase): @@ -430,7 +430,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=11) class TestExponentialWaveform(unittest.TestCase): @@ -520,7 +520,7 @@ def f(t): ) dt = np.min(np.diff(t0)) * 0.5 * np.ones_like(t0) - assert check_derivative(f, t0, dx=dt, plotIt=False) + assert check_derivative(f, t0, dx=dt, plotIt=False, random_seed=5555) def test_simple_source(): diff --git a/tests/em/vrm/test_vrm_instantiation.py b/tests/em/vrm/test_vrm_instantiation.py new file mode 100644 index 0000000000..91c6af90e0 --- /dev/null +++ b/tests/em/vrm/test_vrm_instantiation.py @@ -0,0 +1,27 @@ +import discretize +import pytest +import simpeg.electromagnetics.viscous_remanent_magnetization as vrm + + +def test_mesh_required(): + with pytest.raises( + TypeError, match=".*missing 1 required positional argument: 'mesh'" + ): + vrm.Simulation3DLinear() + + +def test_bad_mesh_type(): + mesh = discretize.CylindricalMesh([3, 3, 3]) + with pytest.raises( + TypeError, + match="mesh must be an instance of TensorMesh or TreeMesh, not CylindricalMesh", + ): + vrm.Simulation3DLinear(mesh) + + +def test_bad_mesh_dim(): + mesh = discretize.TensorMesh([3, 3]) + with pytest.raises( + ValueError, match="Simulation3DLinear mesh must be 3D, received a 2D mesh." + ): + vrm.Simulation3DLinear(mesh) diff --git a/tests/em/vrm/test_vrmfwd.py b/tests/em/vrm/test_vrmfwd.py index 5e45cdcb6f..772867faa6 100644 --- a/tests/em/vrm/test_vrmfwd.py +++ b/tests/em/vrm/test_vrmfwd.py @@ -1,3 +1,4 @@ +import pytest import unittest import numpy as np import discretize @@ -13,8 +14,6 @@ class VRM_fwd_tests(unittest.TestCase): seed = 518936 def test_predict_dipolar(self): - np.random.seed(self.seed) - h = [0.05, 0.05] meshObj = discretize.TensorMesh((h, h, h), x0="CCC") @@ -26,8 +25,9 @@ def test_predict_dipolar(self): times = np.logspace(-4, -2, 3) waveObj = vrm.waveforms.SquarePulse(delt=0.02) - phi = np.random.uniform(-np.pi, np.pi) - psi = np.random.uniform(-np.pi, np.pi) + rng = np.random.default_rng(seed=self.seed) + phi = rng.uniform(low=-np.pi, high=np.pi) + psi = rng.uniform(low=-np.pi, high=np.pi) R = 2.0 loc_rx = ( R * np.c_[np.sin(phi) * np.cos(psi), np.sin(phi) * np.sin(psi), np.cos(phi)] @@ -43,8 +43,9 @@ def test_predict_dipolar(self): vrm.receivers.Point(loc_rx, times=times, field_type="dhdt", orientation="z") ) - alpha = np.random.uniform(0, np.pi) - beta = np.random.uniform(-np.pi, np.pi) + rng = np.random.default_rng(seed=self.seed) + alpha = rng.uniform(low=0, high=np.pi) + beta = rng.uniform(low=-np.pi, high=np.pi) loc_tx = [0.0, 0.0, 0.0] Src = vrm.sources.CircLoop( receiver_list, loc_tx, 25.0, np.r_[alpha, beta], 1.0, waveObj @@ -94,8 +95,6 @@ def test_sources(self): computed. """ - np.random.seed(self.seed) - h = [0.5, 0.5] meshObj = discretize.TensorMesh((h, h, h), x0="CCC") @@ -107,8 +106,9 @@ def test_sources(self): times = np.logspace(-4, -2, 3) waveObj = vrm.waveforms.SquarePulse(delt=0.02) - phi = np.random.uniform(-np.pi, np.pi) - psi = np.random.uniform(-np.pi, np.pi) + rng = np.random.default_rng(seed=self.seed) + phi = rng.uniform(low=-np.pi, high=np.pi) + psi = rng.uniform(low=-np.pi, high=np.pi) Rrx = 3.0 loc_rx = ( Rrx @@ -125,8 +125,9 @@ def test_sources(self): vrm.receivers.Point(loc_rx, times=times, field_type="dhdt", orientation="z") ) - alpha = np.random.uniform(0, np.pi) - beta = np.random.uniform(-np.pi, np.pi) + rng = np.random.default_rng(seed=self.seed) + alpha = rng.uniform(low=0, high=np.pi) + beta = rng.uniform(low=-np.pi, high=np.pi) Rtx = 4.0 loc_tx = ( Rtx @@ -424,8 +425,6 @@ def test_receiver_types(self): are correct. """ - np.random.seed(self.seed) - h1 = [0.25, 0.25] meshObj_Tensor = discretize.TensorMesh((h1, h1, h1), x0="CCN") @@ -439,8 +438,9 @@ def test_receiver_types(self): times = np.array([1e-3]) waveObj = vrm.waveforms.SquarePulse(delt=0.02) - phi = np.random.uniform(-np.pi, np.pi) - psi = np.random.uniform(-np.pi, np.pi) + rng = np.random.default_rng(seed=self.seed) + phi = rng.uniform(low=-np.pi, high=np.pi) + psi = rng.uniform(low=-np.pi, high=np.pi) R = 5.0 loc_rx = ( R * np.c_[np.sin(phi) * np.cos(psi), np.sin(phi) * np.sin(psi), np.cos(phi)] @@ -524,5 +524,88 @@ def test_receiver_types(self): self.assertTrue(Test) +class TestDeprecatedIndActive: + """Test deprecated ``indActive`` argument in viscous remanent mag simulations.""" + + CLASSES = ( + vrm.BaseVRMSimulation, + vrm.Simulation3DLinear, + vrm.Simulation3DLogUniform, + ) + OLD_NAME = "indActive" + NEW_NAME = "active_cells" + + @pytest.fixture + def mesh(self): + """Sample mesh.""" + return discretize.TensorMesh([10, 10, 10], "CCN") + + @pytest.fixture + def active_cells(self, mesh): + """Sample active cells for the mesh.""" + active_cells = np.ones(mesh.n_cells, dtype=bool) + active_cells[0] = False + return active_cells + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + @pytest.mark.parametrize("simulation", CLASSES) + def test_warning_argument(self, mesh, active_cells, simulation): + """ + Test if warning is raised after passing ``indActive`` to the constructor. + """ + msg = self.get_message_deprecated_warning(self.OLD_NAME, self.NEW_NAME) + with pytest.warns(FutureWarning, match=msg): + sim = simulation(mesh, indActive=active_cells) + np.testing.assert_allclose(sim.active_cells, active_cells) + + @pytest.mark.parametrize("simulation", CLASSES) + def test_error_duplicated_argument(self, mesh, active_cells, simulation): + """ + Test error after passing ``indActive`` and ``active_cells`` to the constructor. + """ + msg = self.get_message_duplicated_error(self.OLD_NAME, self.NEW_NAME) + with pytest.raises(TypeError, match=msg): + simulation(mesh, active_cells=active_cells, indActive=active_cells) + + @pytest.mark.parametrize("simulation", CLASSES) + def test_warning_accessing_property(self, mesh, active_cells, simulation): + """ + Test warning when trying to access the ``indActive`` property. + """ + sim = simulation(mesh, active_cells=active_cells) + msg = f"{self.OLD_NAME} has been deprecated, please use {self.NEW_NAME}" + with pytest.warns(FutureWarning, match=msg): + old_ind_active = sim.indActive + np.testing.assert_allclose(sim.active_cells, old_ind_active) + + @pytest.mark.parametrize("simulation", CLASSES) + def test_warning_setter(self, mesh, active_cells, simulation): + """ + Test warning when trying to set the ``indActive`` property. + """ + sim = simulation(mesh, active_cells=active_cells) + # Define new active cells to pass to the setter + new_active_cells = active_cells.copy() + new_active_cells[-4:] = False + msg = f"{self.OLD_NAME} has been deprecated, please use {self.NEW_NAME}" + with pytest.warns(FutureWarning, match=msg): + sim.indActive = new_active_cells + np.testing.assert_allclose(sim.active_cells, new_active_cells) + + if __name__ == "__main__": unittest.main() diff --git a/tests/em/vrm/test_vrminv.py b/tests/em/vrm/test_vrminv.py index 1b64627490..6882cfd048 100644 --- a/tests/em/vrm/test_vrminv.py +++ b/tests/em/vrm/test_vrminv.py @@ -58,7 +58,7 @@ def test_basic_inversion(self): Survey.t_active = np.zeros(Survey.nD, dtype=bool) Survey.set_active_interval(-1e6, 1e6) Problem = vrm.Simulation3DLinear(meshObj, survey=Survey, refinement_factor=2) - dobs = Problem.make_synthetic_data(mod) + dobs = Problem.make_synthetic_data(mod, random_seed=40) Survey.noise_floor = 1e-11 dmis = data_misfit.L2DataMisfit(data=dobs, simulation=Problem) diff --git a/tests/flow/test_Richards.py b/tests/flow/test_Richards.py index 71e9cc31b0..5cab334437 100644 --- a/tests/flow/test_Richards.py +++ b/tests/flow/test_Richards.py @@ -1,5 +1,6 @@ import unittest import numpy as np +import pytest from discretize.tests import check_derivative import discretize @@ -8,12 +9,6 @@ from simpeg import utils from simpeg.flow import richards -try: - from pymatsolver import Pardiso as Solver -except Exception: - from simpeg import Solver - - TOL = 1e-8 np.random.seed(0) @@ -46,7 +41,6 @@ def setUp(self): method="mixed", ) prob.time_steps = time_steps - prob.solver = Solver self.h0 = h self.mesh = mesh @@ -75,6 +69,7 @@ def _dotest_getResidual(self, newton): self.h0, expectedOrder=2 if newton else 1, plotIt=False, + random_seed=142, ) self.assertTrue(passed, True) @@ -101,6 +96,7 @@ def _dotest_sensitivity(self): self.mtrue, num=3, plotIt=False, + random_seed=6184726, ) self.assertTrue(passed, True) @@ -108,7 +104,11 @@ def _dotest_sensitivity_full(self): print("Testing Richards Derivative FULL dim={}".format(self.mesh.dim)) J = self.prob.Jfull(self.mtrue) passed = check_derivative( - lambda m: [self.prob.dpred(m), J], self.mtrue, num=3, plotIt=False + lambda m: [self.prob.dpred(m), J], + self.mtrue, + num=3, + plotIt=False, + random_seed=97861534, ) self.assertTrue(passed, True) @@ -286,5 +286,21 @@ def test_sensitivity_full(self): self._dotest_sensitivity_full() +def test_bad_mesh_type(): + mesh = discretize.CylindricalMesh([3, 3, 3]) + params = richards.empirical.HaverkampParams().celia1990 + k_fun, theta_fun = richards.empirical.haverkamp(mesh, **params) + + msg = "mesh must be an instance of TensorMesh or TreeMesh, not CylindricalMesh" + with pytest.raises(TypeError, match=msg): + richards.SimulationNDCellCentered( + mesh, + hydraulic_conductivity=k_fun, + water_retention=theta_fun, + boundary_conditions=np.array([1.0]), + initial_conditions=np.array([1.0]), + ) + + if __name__ == "__main__": unittest.main() diff --git a/tests/flow/test_Richards_empirical.py b/tests/flow/test_Richards_empirical.py index 4361621e3f..1f5e8f9178 100644 --- a/tests/flow/test_Richards_empirical.py +++ b/tests/flow/test_Richards_empirical.py @@ -1,4 +1,5 @@ import unittest +import pytest import numpy as np @@ -18,7 +19,10 @@ def test_haverkamp_theta_u(self): mesh = discretize.TensorMesh([50]) hav = richards.empirical.Haverkamp_theta(mesh) passed = check_derivative( - lambda u: (hav(u), hav.derivU(u)), np.random.randn(50), plotIt=False + lambda u: (hav(u), hav.derivU(u)), + np.random.randn(50), + plotIt=False, + random_seed=5662, ) self.assertTrue(passed, True) @@ -53,14 +57,17 @@ def fun(m): print("Haverkamp_theta test m deriv: ", name) - passed = check_derivative(fun, x0, plotIt=False) + passed = check_derivative(fun, x0, plotIt=False, random_seed=444) self.assertTrue(passed, True) def test_vangenuchten_theta_u(self): mesh = discretize.TensorMesh([50]) van = richards.empirical.Vangenuchten_theta(mesh) passed = check_derivative( - lambda u: (van(u), van.derivU(u)), np.random.randn(50), plotIt=False + lambda u: (van(u), van.derivU(u)), + np.random.randn(50), + plotIt=False, + random_seed=5777, ) self.assertTrue(passed, True) @@ -95,7 +102,7 @@ def fun(m): print("Vangenuchten_theta test m deriv: ", name) - passed = check_derivative(fun, x0, plotIt=False) + passed = check_derivative(fun, x0, plotIt=False, random_seed=666) self.assertTrue(passed, True) def test_haverkamp_k_u(self): @@ -104,7 +111,10 @@ def test_haverkamp_k_u(self): hav = richards.empirical.Haverkamp_k(mesh) print("Haverkamp_k test u deriv") passed = check_derivative( - lambda u: (hav(u), hav.derivU(u)), np.random.randn(mesh.nC), plotIt=False + lambda u: (hav(u), hav.derivU(u)), + np.random.randn(mesh.nC), + plotIt=False, + random_seed=5662, ) self.assertTrue(passed, True) @@ -152,7 +162,9 @@ def fun(m): print("Haverkamp_k test m deriv: ", name) - passed = check_derivative(fun, np.random.randn(mesh.nC * nM), plotIt=False) + passed = check_derivative( + fun, np.random.randn(mesh.nC * nM), plotIt=False, random_seed=65 + ) self.assertTrue(passed, True) def test_vangenuchten_k_u(self): @@ -162,7 +174,10 @@ def test_vangenuchten_k_u(self): print("Vangenuchten_k test u deriv") passed = check_derivative( - lambda u: (van(u), van.derivU(u)), np.random.randn(mesh.nC), plotIt=False + lambda u: (van(u), van.derivU(u)), + np.random.randn(mesh.nC), + plotIt=False, + random_seed=777, ) self.assertTrue(passed, True) @@ -201,9 +216,27 @@ def fun(m): print("Vangenuchten_k test m deriv: ", name) - passed = check_derivative(fun, x0, plotIt=False) + passed = check_derivative(fun, x0, plotIt=False, random_seed=918724) self.assertTrue(passed, True) +@pytest.mark.parametrize( + "empirical_class", + [ + richards.empirical.NonLinearModel, + richards.empirical.BaseWaterRetention, + richards.empirical.BaseHydraulicConductivity, + richards.empirical.Haverkamp_theta, + richards.empirical.Haverkamp_k, + richards.empirical.Vangenuchten_theta, + richards.empirical.Vangenuchten_k, + ], +) +def test_bad_mesh_type(empirical_class): + msg = "mesh must be an instance of BaseMesh, not ndarray" + with pytest.raises(TypeError, match=msg): + empirical_class(np.array([1, 2, 3])) + + if __name__ == "__main__": unittest.main() diff --git a/tests/meta/test_dask_meta.py b/tests/meta/test_dask_meta.py index 5feb5f6c75..bca049224a 100644 --- a/tests/meta/test_dask_meta.py +++ b/tests/meta/test_dask_meta.py @@ -5,6 +5,7 @@ from discretize import TensorMesh import scipy.sparse as sp import pytest +import time from simpeg.meta import ( MetaSimulation, @@ -289,6 +290,7 @@ def test_dask_meta_errors(cluster): # incompatible length of mappings and simulations lists with pytest.raises(ValueError): DaskMetaSimulation(sims[:-1], mappings, client) + time.sleep(0.1) # sleep for a bit to let the communicator catch up # Bad Simulation type? with pytest.raises(TypeError): @@ -300,16 +302,19 @@ def test_dask_meta_errors(cluster): mappings, client, ) + time.sleep(0.1) # sleep for a bit to let the communicator catch up # mappings have incompatible input lengths: mappings[0] = maps.Projection(mesh.n_cells + 10, np.arange(mesh.n_cells) + 1) with pytest.raises(ValueError): DaskMetaSimulation(sims, mappings, client) + time.sleep(0.1) # sleep for a bit to let the communicator catch up # incompatible mapping and simulation mappings[0] = maps.Projection(mesh.n_cells, [0, 1, 3, 5, 10]) with pytest.raises(ValueError): DaskMetaSimulation(sims, mappings, client) + time.sleep(0.1) # sleep for a bit to let the communicator catch up def test_sum_errors(cluster): @@ -351,6 +356,7 @@ def test_sum_errors(cluster): # Test simulations with different numbers of data. with pytest.raises(ValueError): DaskSumMetaSimulation(sims, mappings, client) + time.sleep(0.1) # sleep for a half second to let the communicator catch up def test_repeat_errors(cluster): @@ -382,12 +388,15 @@ def test_repeat_errors(cluster): mappings[0] = maps.Projection(mesh.n_cells + 1, np.arange(mesh.n_cells) + 1) with pytest.raises(ValueError): DaskRepeatedSimulation(sim, mappings, client) + time.sleep(0.1) # sleep for a half second to let the communicator catch up # incompatible mappings and simulations mappings[0] = maps.Projection(mesh.n_cells, [0, 1, 3, 5, 10]) with pytest.raises(ValueError): DaskRepeatedSimulation(sim, mappings, client) + time.sleep(0.1) # sleep for a half second to let the communicator catch up # Bad Simulation type? with pytest.raises(TypeError): DaskRepeatedSimulation(lambda x: x * 2, mappings, client) + time.sleep(0.1) # sleep for a half second to let the communicator catch up diff --git a/tests/meta/test_multiprocessing_sim.py b/tests/meta/test_multiprocessing_sim.py index eaabf64f6f..be2431fb10 100644 --- a/tests/meta/test_multiprocessing_sim.py +++ b/tests/meta/test_multiprocessing_sim.py @@ -1,6 +1,4 @@ import numpy as np -import multiprocessing as mp -import sys from simpeg.potential_fields import gravity from simpeg.electromagnetics.static import resistivity as dc @@ -17,9 +15,6 @@ MultiprocessingRepeatedSimulation, ) -if sys.version_info[0] == 3 and sys.version_info[1] <= 8: - mp.set_start_method("spawn") - def test_meta_correctness(): mesh = TensorMesh([16, 16, 16], origin="CCN") diff --git a/tests/pf/test_base_pf_simulation.py b/tests/pf/test_base_pf_simulation.py index 9cf7964ee4..fc05eafdca 100644 --- a/tests/pf/test_base_pf_simulation.py +++ b/tests/pf/test_base_pf_simulation.py @@ -2,6 +2,7 @@ Test BasePFSimulation class """ +import re import pytest import numpy as np from discretize import CylindricalMesh, TensorMesh, TreeMesh @@ -93,7 +94,9 @@ def test_sensitivity_path_as_dir(self, tensor_mesh, mock_simulation_class, tmpdi ``store_sensitivities="disk"``. """ sensitivity_path = str(tmpdir.mkdir("sensitivities")) - msg = f"The passed sensitivity_path '{sensitivity_path}' is a directory." + msg = re.escape( + f"The passed sensitivity_path '{sensitivity_path}' is a directory." + ) with pytest.raises(ValueError, match=msg): mock_simulation_class( tensor_mesh, @@ -108,19 +111,6 @@ class TestGetActiveNodes: Tests _get_active_nodes private method """ - def test_invalid_mesh(self, tensor_mesh, mock_simulation_class): - """ - Test error on invalid mesh class - """ - # Initialize base simulation with valid mesh (so we don't trigger - # errors in the constructor) - simulation = mock_simulation_class(tensor_mesh) - # Assign an invalid mesh to the simulation - simulation.mesh = CylindricalMesh(tensor_mesh.h) - msg = "Invalid mesh of type CylindricalMesh." - with pytest.raises(TypeError, match=msg): - simulation._get_active_nodes() - def test_no_inactive_cells_tensor(self, tensor_mesh, mock_simulation_class): """ Test _get_active_nodes when all cells are active on a tensor mesh @@ -147,7 +137,7 @@ def test_inactive_cells_tensor(self, tensor_mesh, mock_simulation_class): active_cells = np.zeros(tensor_mesh.n_cells, dtype=bool) active_cells[0] = True # Initialize simulation - simulation = mock_simulation_class(tensor_mesh, ind_active=active_cells) + simulation = mock_simulation_class(tensor_mesh, active_cells=active_cells) # Build expected active_nodes and active_cell_nodes expected_active_nodes = tensor_mesh.nodes[tensor_mesh[0].nodes] expected_active_cell_nodes = np.atleast_2d(np.arange(8, dtype=int)) @@ -165,7 +155,7 @@ def test_inactive_cells_tree(self, tree_mesh, mock_simulation_class): active_cells[0] = True # Initialize simulation - simulation = mock_simulation_class(tree_mesh, ind_active=active_cells) + simulation = mock_simulation_class(tree_mesh, active_cells=active_cells) # Build expected active_nodes (in the right order for a single cell) expected_active_nodes = [ @@ -281,9 +271,13 @@ def test_components_and_receivers_magnetics( np.testing.assert_equal(receivers, receiver_locations) -class TestInvalidMeshChoclo: +class TestInvalidMesh: + """ + Test if errors are raised after invalid mesh are passed to the base simulation. + """ + @pytest.fixture(params=("tensormesh", "treemesh")) - def mesh(self, request): + def mesh_2d(self, request): """Sample 2D mesh.""" hx, hy = [(0.1, 8)], [(0.1, 8)] h = (hx, hy) @@ -294,13 +288,61 @@ def mesh(self, request): mesh.finalize() return mesh - def test_invalid_mesh_with_choclo(self, mesh, mock_simulation_class): + @pytest.mark.parametrize("engine", ("choclo", "geoana")) + def test_invalid_mesh_dimensions(self, mesh_2d, mock_simulation_class, engine): """ - Test if simulation raises error when passing an invalid mesh and using choclo + Test error when passing a mesh with invalid dimensions. """ + msg = re.escape("MockSimulation mesh must be 3D, received a 2D mesh.") + with pytest.raises(ValueError, match=msg): + mock_simulation_class(mesh_2d, engine=engine) + + def test_invalid_mesh_type(self, mock_simulation_class): + """ + Test error when passing an invalid mesh class. + """ + h = (3, 3, 3) + msg = re.escape( + "mesh must be an instance of TensorMesh or TreeMesh, not CylindricalMesh" + ) + with pytest.raises(TypeError, match=msg): + mock_simulation_class(CylindricalMesh(h)) + + +class TestDeprecationIndActive: + """ + Test if using the deprecated ind_active argument/property raise warnings/errors + """ + + def test_deprecated_argument(self, tensor_mesh, mock_simulation_class): + """Test if passing ind_active argument raises warning.""" + ind_active = np.ones(tensor_mesh.n_cells, dtype=bool) + version_regex = "v[0-9]+.[0-9]+.[0-9]+" msg = ( - "Invalid mesh with 2 dimensions. " - "Only 3D meshes are supported when using 'choclo' as engine." + "'ind_active' has been deprecated and will be removed in " + f" SimPEG {version_regex}, please use 'active_cells' instead." ) - with pytest.raises(ValueError, match=msg): - mock_simulation_class(mesh, engine="choclo") + with pytest.warns(FutureWarning, match=msg): + sim = mock_simulation_class(tensor_mesh, ind_active=ind_active) + np.testing.assert_allclose(sim.active_cells, ind_active) + + def test_error_both_args(self, tensor_mesh, mock_simulation_class): + """Test if passing both ind_active and active_cells raises error.""" + ind_active = np.ones(tensor_mesh.n_cells, dtype=bool) + version_regex = "v[0-9]+.[0-9]+.[0-9]+" + msg = ( + f"Cannot pass both 'active_cells' and 'ind_active'." + "'ind_active' has been deprecated and will be removed in " + f" SimPEG {version_regex}, please use 'active_cells' instead." + ) + with pytest.raises(TypeError, match=msg): + mock_simulation_class( + tensor_mesh, active_cells=ind_active, ind_active=ind_active + ) + + def test_deprecated_property(self, tensor_mesh, mock_simulation_class): + """Test if passing both ind_active and active_cells raises error.""" + ind_active = np.ones(tensor_mesh.n_cells, dtype=bool) + simulation = mock_simulation_class(tensor_mesh, active_cells=ind_active) + with pytest.warns(FutureWarning): + simulation.ind_active diff --git a/tests/pf/test_equivalent_sources.py b/tests/pf/test_equivalent_sources.py new file mode 100644 index 0000000000..84339d8db4 --- /dev/null +++ b/tests/pf/test_equivalent_sources.py @@ -0,0 +1,839 @@ +import pytest + +from collections.abc import Iterable +import numpy as np +from discretize import TensorMesh +from discretize.utils import mesh_builder_xyz, mkvc +import simpeg +from simpeg.optimization import ProjectedGNCG +from simpeg.potential_fields import gravity, magnetics, base + +GRAVITY_COMPONENTS = ["gx", "gy", "gz", "gxx", "gyy", "gzz", "gxy", "gxz", "gyz", "guv"] +MAGNETIC_COMPONENTS = [ + "tmi", + "bx", + "by", + "bz", + "bxx", + "byy", + "bzz", + "bxy", + "bxz", + "byz", + "tmi_x", + "tmi_y", + "tmi_z", +] + + +def create_grid(x_range, y_range, size): + """Create a 2D horizontal coordinates grid.""" + x_start, x_end = x_range + y_start, y_end = y_range + x, y = np.meshgrid( + np.linspace(x_start, x_end, size), np.linspace(y_start, y_end, size) + ) + return x, y + + +@pytest.fixture() +def mesh_params(): + """Parameters for building the sample meshes.""" + h = [5, 5] + padding_distances = np.ones((2, 2)) * 50 + return h, padding_distances + + +@pytest.fixture() +def tensor_mesh(mesh_params, coordinates): + """Sample 2D tensor mesh to use with equivalent sources.""" + mesh_type = "tensor" + h, padding_distance = mesh_params + mesh = mesh_builder_xyz( + coordinates[:, :2], h, padding_distance=padding_distance, mesh_type=mesh_type + ) + return mesh + + +@pytest.fixture() +def tree_mesh(mesh_params, coordinates): + """Sample 2D tree mesh to use with equivalent sources.""" + mesh_type = "tree" + h, padding_distance = mesh_params + mesh = mesh_builder_xyz( + coordinates[:, :2], h, padding_distance=padding_distance, mesh_type=mesh_type + ) + mesh.refine_points(coordinates[:, :2], padding_cells_by_level=[2, 4]) + return mesh + + +@pytest.fixture(params=["tensor", "tree"]) +def mesh(tensor_mesh, tree_mesh, request): + """Sample 2D mesh to use with equivalent sources.""" + mesh_type = request.param + if mesh_type == "tree": + return tree_mesh + elif mesh_type == "tensor": + return tensor_mesh + else: + raise ValueError(f"Invalid mesh type: '{mesh_type}'") + + +@pytest.fixture +def mesh_top(): + """Top boundary of the mesh.""" + return -20.0 + + +@pytest.fixture +def mesh_bottom(): + """Bottom boundary of the mesh.""" + return -50.0 + + +@pytest.fixture +def coordinates(): + """Synthetic observation points grid.""" + x, y = create_grid(x_range=(-50, 50), y_range=(-50, 50), size=11) + z = np.full_like(x, fill_value=5.0) + return np.c_[mkvc(x), mkvc(y), mkvc(z)] + + +def get_block_model(mesh, phys_property: float | tuple): + """ + Build a block model. + + Parameters + ---------- + mesh : discretize.BaseMesh + Mesh. + phys_property : float or tuple of floats + Pass a tuple of floats if you want to generate a vector model. + + Returns + ------- + model : np.ndarray + """ + if not isinstance(phys_property, Iterable): + model = simpeg.utils.model_builder.add_block( + mesh.cell_centers, + np.zeros(mesh.n_cells), + np.r_[-20, -20], + np.r_[20, 20], + phys_property, + ) + else: + models = tuple( + simpeg.utils.model_builder.add_block( + mesh.cell_centers, + np.zeros(mesh.n_cells), + np.r_[-20, -20], + np.r_[20, 20], + p, + ) + for p in phys_property + ) + model = np.hstack(models) + return model + + +def get_mapping(mesh): + """Get an identity map for the given mesh.""" + return simpeg.maps.IdentityMap(nP=mesh.n_cells) + + +def get_mesh_3d(mesh, top: float, bottom: float): + """ + Build a 3D mesh analogous to the 2D mesh + the top and bottom bounds. + """ + origin = (*mesh.origin, bottom) + h = (*mesh.h, np.array([top - bottom], dtype=np.float64)) + mesh_3d = TensorMesh(h=h, origin=origin) + return mesh_3d + + +@pytest.fixture +def gravity_survey(coordinates): + """ + Sample survey for the gravity equivalent sources. + """ + return build_gravity_survey(coordinates, components="gz") + + +@pytest.fixture +def magnetic_survey(coordinates): + """ + Sample survey for the magnetic equivalent sources. + """ + return build_magnetic_survey(coordinates, components="tmi") + + +def build_gravity_survey(coordinates, components): + """ + Build a gravity survey. + """ + receivers = gravity.Point(coordinates, components=components) + source_field = gravity.SourceField([receivers]) + survey = gravity.Survey(source_field) + return survey + + +def build_magnetic_survey( + coordinates, components, amplitude=51_000.0, inclination=71.0, declination=12.0 +): + """ + Build a magnetic survey. + """ + receivers = magnetics.Point(coordinates, components=components) + source_field = magnetics.UniformBackgroundField( + [receivers], + amplitude=amplitude, + inclination=inclination, + declination=declination, + ) + survey = magnetics.Survey(source_field) + return survey + + +class Test3DMeshError: + """ + Test if error is raised after passing a 3D mesh to equivalent sources. + """ + + @pytest.fixture + def mesh_3d(self): + mesh = TensorMesh([2, 3, 4]) + return mesh + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + def test_error_on_gravity(self, mesh_3d, engine): + """ + Test error is raised after passing a 3D mesh to gravity eq source class. + """ + msg = "SimulationEquivalentSourceLayer mesh must be 2D, received a 3D mesh." + with pytest.raises(ValueError, match=msg): + gravity.SimulationEquivalentSourceLayer( + mesh=mesh_3d, cell_z_top=0.0, cell_z_bottom=-2.0, engine=engine + ) + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + def test_error_on_mag(self, mesh_3d, engine): + """ + Test error is raised after passing a 3D mesh to magnetic eq source class. + """ + msg = "SimulationEquivalentSourceLayer mesh must be 2D, received a 3D mesh." + with pytest.raises(ValueError, match=msg): + magnetics.SimulationEquivalentSourceLayer( + mesh=mesh_3d, cell_z_top=0.0, cell_z_bottom=-2.0, engine=engine + ) + + def test_error_on_base_class(self, mesh_3d): + """ + Test error is raised after passing a 3D mesh to the eq source base class. + """ + msg = "BaseEquivalentSourceLayerSimulation mesh must be 2D, received a 3D mesh." + with pytest.raises(ValueError, match=msg): + base.BaseEquivalentSourceLayerSimulation( + mesh=mesh_3d, cell_z_top=0.0, cell_z_bottom=-2.0 + ) + + +class TestGravityEquivalentSourcesForward: + """ + Test the forward capabilities of the gravity equivalent sources. + """ + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + def test_forward_vs_simulation( + self, + tensor_mesh, + mesh_bottom, + mesh_top, + gravity_survey, + engine, + store_sensitivities, + ): + """ + Test forward of the eq sources vs. using the integral 3d simulation. + """ + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + # Build simulations + mapping = get_mapping(tensor_mesh) + sim_3d = gravity.Simulation3DIntegral( + survey=gravity_survey, mesh=mesh_3d, rhoMap=mapping + ) + eq_sources = gravity.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=gravity_survey, + rhoMap=mapping, + engine=engine, + store_sensitivities=store_sensitivities, + ) + # Compare predictions of both simulations + model = get_block_model(tensor_mesh, 2.67) + np.testing.assert_allclose( + sim_3d.dpred(model), eq_sources.dpred(model), atol=1e-7 + ) + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + @pytest.mark.parametrize("components", GRAVITY_COMPONENTS + [["gz", "gzz"]]) + def test_forward_vs_simulation_with_components( + self, + coordinates, + tensor_mesh, + mesh_bottom, + mesh_top, + engine, + store_sensitivities, + components, + ): + """ + Test forward vs simulation using different gravity components. + """ + # Build survey + survey = build_gravity_survey(coordinates, components) + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + # Build simulations + mapping = get_mapping(tensor_mesh) + sim_3d = gravity.Simulation3DIntegral( + survey=survey, mesh=mesh_3d, rhoMap=mapping + ) + eq_sources = gravity.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=survey, + rhoMap=mapping, + engine=engine, + store_sensitivities=store_sensitivities, + ) + # Compare predictions of both simulations + model = get_block_model(tensor_mesh, 2.67) + np.testing.assert_allclose( + sim_3d.dpred(model), eq_sources.dpred(model), atol=5e-6 + ) + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + def test_forward_vs_simulation_on_disk( + self, + tensor_mesh, + mesh_bottom, + mesh_top, + gravity_survey, + engine, + tmp_path, + ): + """ + Test forward vs simulation storing sensitivities on disk. + """ + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + # Define sensitivity_dir + if engine == "geoana": + sensitivity_path = tmp_path / "sensitivities_geoana" + sensitivity_path.mkdir() + elif engine == "choclo": + sensitivity_path = tmp_path / "sensitivities_choclo" + # Build simulations + mapping = get_mapping(tensor_mesh) + sim_3d = gravity.Simulation3DIntegral( + survey=gravity_survey, mesh=mesh_3d, rhoMap=mapping + ) + eq_sources = gravity.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=gravity_survey, + rhoMap=mapping, + engine=engine, + store_sensitivities="disk", + sensitivity_path=str(sensitivity_path), + ) + # Compare predictions of both simulations + model = get_block_model(tensor_mesh, 2.67) + np.testing.assert_allclose(sim_3d.dpred(model), eq_sources.dpred(model)) + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + def test_forward_vs_simulation_with_active_cells( + self, + tensor_mesh, + mesh_bottom, + mesh_top, + gravity_survey, + engine, + store_sensitivities, + ): + """ + Test forward vs simulation using active cells. + """ + model = get_block_model(tensor_mesh, 2.67) + + # Define some inactive cells inside the block + block_cells_indices = np.indices(model.shape).ravel()[model != 0] + inactive_indices = block_cells_indices[ + : block_cells_indices.size // 2 + ] # mark half of the cells in the block as inactive + active_cells = np.ones_like(model, dtype=bool) + active_cells[inactive_indices] = False + assert not np.all(active_cells) # check we do have inactive cells + + # Keep only values of the model in the active cells + model = model[active_cells] + + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + + # Build simulations + mapping = simpeg.maps.IdentityMap(nP=model.size) + sim_3d = gravity.Simulation3DIntegral( + survey=gravity_survey, + mesh=mesh_3d, + rhoMap=mapping, + active_cells=active_cells, + ) + eq_sources = gravity.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=gravity_survey, + rhoMap=mapping, + engine=engine, + store_sensitivities=store_sensitivities, + active_cells=active_cells, + ) + # Compare predictions of both simulations + np.testing.assert_allclose( + sim_3d.dpred(model), eq_sources.dpred(model), atol=1e-7 + ) + + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + def test_forward_geoana_choclo( + self, mesh, mesh_bottom, mesh_top, gravity_survey, store_sensitivities + ): + """Compare forwards using geoana and choclo.""" + # Build simulations + mapping = get_mapping(mesh) + kwargs = dict( + mesh=mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=gravity_survey, + rhoMap=mapping, + store_sensitivities=store_sensitivities, + ) + sim_geoana = gravity.SimulationEquivalentSourceLayer(engine="geoana", **kwargs) + sim_choclo = gravity.SimulationEquivalentSourceLayer(engine="choclo", **kwargs) + model = get_block_model(mesh, 2.67) + np.testing.assert_allclose(sim_geoana.dpred(model), sim_choclo.dpred(model)) + + def test_forward_choclo_serial_parallel( + self, mesh, mesh_bottom, mesh_top, gravity_survey + ): + """Test forward using choclo in serial and in parallel.""" + # Build simulations + mapping = get_mapping(mesh) + kwargs = dict( + mesh=mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=gravity_survey, + rhoMap=mapping, + engine="choclo", + ) + sim_parallel = gravity.SimulationEquivalentSourceLayer( + numba_parallel=True, **kwargs + ) + sim_serial = gravity.SimulationEquivalentSourceLayer( + numba_parallel=False, **kwargs + ) + model = get_block_model(mesh, 2.67) + np.testing.assert_allclose(sim_parallel.dpred(model), sim_serial.dpred(model)) + + +class TestMagneticEquivalentSourcesForward: + """ + Test the forward capabilities of the magnetic equivalent sources. + """ + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + @pytest.mark.parametrize("model_type", ("scalar", "vector")) + @pytest.mark.parametrize("components", MAGNETIC_COMPONENTS + [["tmi", "bx"]]) + def test_forward_vs_simulation( + self, + coordinates, + tensor_mesh, + mesh_bottom, + mesh_top, + engine, + store_sensitivities, + model_type, + components, + ): + """ + Test forward of the eq sources vs. using the integral 3d simulation. + """ + # Build survey + survey = build_magnetic_survey(coordinates, components) + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + # Build model and mapping + if model_type == "scalar": + model = get_block_model(tensor_mesh, 0.2e-3) + else: + model = get_block_model(tensor_mesh, (0.2e-3, -0.1e-3, 0.5e-3)) + mapping = simpeg.maps.IdentityMap(nP=model.size) + # Build simulations + sim_3d = magnetics.Simulation3DIntegral( + survey=survey, + mesh=mesh_3d, + chiMap=mapping, + model_type=model_type, + ) + eq_sources = magnetics.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=survey, + chiMap=mapping, + engine=engine, + store_sensitivities=store_sensitivities, + model_type=model_type, + ) + # Compare predictions of both simulations + np.testing.assert_allclose( + sim_3d.dpred(model), eq_sources.dpred(model), atol=1e-7 + ) + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + def test_forward_vs_simulation_on_disk( + self, + tensor_mesh, + mesh_bottom, + mesh_top, + magnetic_survey, + engine, + tmp_path, + ): + """ + Test forward vs simulation storing sensitivities on disk. + """ + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + # Define sensitivity_dir + if engine == "geoana": + sensitivity_path = tmp_path / "sensitivities_geoana" + sensitivity_path.mkdir() + elif engine == "choclo": + sensitivity_path = tmp_path / "sensitivities_choclo" + # Build simulations + mapping = get_mapping(tensor_mesh) + sim_3d = magnetics.Simulation3DIntegral( + survey=magnetic_survey, mesh=mesh_3d, chiMap=mapping + ) + eq_sources = magnetics.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=magnetic_survey, + chiMap=mapping, + engine=engine, + store_sensitivities="disk", + sensitivity_path=str(sensitivity_path), + ) + # Compare predictions of both simulations + model = get_block_model(tensor_mesh, 0.2e-3) + np.testing.assert_allclose(sim_3d.dpred(model), eq_sources.dpred(model)) + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + def test_forward_vs_simulation_with_active_cells( + self, + tensor_mesh, + mesh_bottom, + mesh_top, + magnetic_survey, + engine, + store_sensitivities, + ): + """ + Test forward vs simulation using active cells. + """ + model = get_block_model(tensor_mesh, 0.2e-3) + + # Define some inactive cells inside the block + block_cells_indices = np.indices(model.shape).ravel()[model != 0] + inactive_indices = block_cells_indices[ + : block_cells_indices.size // 2 + ] # mark half of the cells in the block as inactive + active_cells = np.ones_like(model, dtype=bool) + active_cells[inactive_indices] = False + assert not np.all(active_cells) # check we do have inactive cells + + # Keep only values of the model in the active cells + model = model[active_cells] + + # Build 3D mesh that is analogous to the 2D mesh with bottom and top + mesh_3d = get_mesh_3d(tensor_mesh, top=mesh_top, bottom=mesh_bottom) + + # Build simulations + mapping = simpeg.maps.IdentityMap(nP=model.size) + sim_3d = magnetics.Simulation3DIntegral( + survey=magnetic_survey, + mesh=mesh_3d, + chiMap=mapping, + active_cells=active_cells, + ) + eq_sources = magnetics.SimulationEquivalentSourceLayer( + mesh=tensor_mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=magnetic_survey, + chiMap=mapping, + engine=engine, + store_sensitivities=store_sensitivities, + active_cells=active_cells, + ) + # Compare predictions of both simulations + np.testing.assert_allclose( + sim_3d.dpred(model), eq_sources.dpred(model), atol=1e-7 + ) + + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + def test_forward_geoana_choclo( + self, mesh, mesh_bottom, mesh_top, magnetic_survey, store_sensitivities + ): + """Compare forwards using geoana and choclo.""" + # Build simulations + mapping = get_mapping(mesh) + kwargs = dict( + mesh=mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=magnetic_survey, + chiMap=mapping, + store_sensitivities=store_sensitivities, + ) + sim_geoana = magnetics.SimulationEquivalentSourceLayer( + engine="geoana", **kwargs + ) + sim_choclo = magnetics.SimulationEquivalentSourceLayer( + engine="choclo", **kwargs + ) + model = get_block_model(mesh, 0.2e-3) + np.testing.assert_allclose(sim_geoana.dpred(model), sim_choclo.dpred(model)) + + @pytest.mark.parametrize("store_sensitivities", ("ram", "forward_only")) + def test_forward_choclo_serial_parallel( + self, mesh, mesh_bottom, mesh_top, magnetic_survey, store_sensitivities + ): + """Test forward using choclo in serial and in parallel.""" + # Build simulations + mapping = get_mapping(mesh) + kwargs = dict( + mesh=mesh, + cell_z_top=mesh_top, + cell_z_bottom=mesh_bottom, + survey=magnetic_survey, + chiMap=mapping, + engine="choclo", + store_sensitivities=store_sensitivities, + ) + sim_parallel = magnetics.SimulationEquivalentSourceLayer( + numba_parallel=True, **kwargs + ) + sim_serial = magnetics.SimulationEquivalentSourceLayer( + numba_parallel=False, **kwargs + ) + model = get_block_model(mesh, 0.2e-3) + np.testing.assert_allclose(sim_parallel.dpred(model), sim_serial.dpred(model)) + + +class BaseFittingEquivalentSources: + """ + Base class to test the fitting of equivalent sources with synthetic data. + """ + + def get_mesh_top_bottom(self, mesh, array=False): + """Build the top and bottom boundaries of the mesh. + + If array is True, the outputs are going to be arrays, otherwise they'll + be floats. + """ + top, bottom = -20.0, -50.0 + if array: + rng = np.random.default_rng(seed=42) + mesh_top = np.full(mesh.n_cells, fill_value=top) + rng.normal( + scale=0.5, size=mesh.n_cells + ) + mesh_bottom = np.full(mesh.n_cells, fill_value=bottom) + rng.normal( + scale=0.5, size=mesh.n_cells + ) + else: + mesh_top, mesh_bottom = top, bottom + return mesh_top, mesh_bottom + + def build_synthetic_data(self, simulation, model): + data = simulation.make_synthetic_data( + model, + relative_error=0.0, + noise_floor=1e-3, + add_noise=True, + random_seed=1, + ) + return data + + def build_inversion(self, mesh, simulation, synthetic_data): + """Build inversion problem.""" + # Build data misfit and regularization terms + data_misfit = simpeg.data_misfit.L2DataMisfit( + simulation=simulation, data=synthetic_data + ) + regularization = simpeg.regularization.WeightedLeastSquares(mesh=mesh) + # Choose optimization + optimization = ProjectedGNCG( + maxIterLS=5, + maxIterCG=20, + tolCG=1e-4, + ) + # Build inverse problem + inverse_problem = simpeg.inverse_problem.BaseInvProblem( + data_misfit, regularization, optimization + ) + # Define directives + starting_beta = simpeg.directives.BetaEstimate_ByEig( + beta0_ratio=1e-1, random_seed=42 + ) + beta_schedule = simpeg.directives.BetaSchedule(coolingFactor=3, coolingRate=1) + update_jacobi = simpeg.directives.UpdatePreconditioner() + target_misfit = simpeg.directives.TargetMisfit(chifact=1) + sensitivity_weights = simpeg.directives.UpdateSensitivityWeights( + every_iteration=False + ) + directives = [ + sensitivity_weights, + starting_beta, + beta_schedule, + update_jacobi, + target_misfit, + ] + # Define inversion + inversion = simpeg.inversion.BaseInversion(inverse_problem, directives) + return inversion + + +class TestGravityEquivalentSources(BaseFittingEquivalentSources): + """ + Test fitting gravity equivalent sources with synthetic data. + """ + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize( + "top_bottom_as_array", + (False, True), + ids=("top-bottom-float", "top-bottom-array"), + ) + def test_predictions_on_data_points( + self, + tree_mesh, + gravity_survey, + top_bottom_as_array, + engine, + ): + """ + Test eq sources predictions on the same data points. + + The equivalent sources should be able to reproduce the same data with + which they were trained. + """ + # Get mesh top and bottom + mesh_top, mesh_bottom = self.get_mesh_top_bottom( + tree_mesh, array=top_bottom_as_array + ) + # Build simulation + mapping = get_mapping(tree_mesh) + simulation = gravity.SimulationEquivalentSourceLayer( + tree_mesh, + mesh_top, + mesh_bottom, + survey=gravity_survey, + rhoMap=mapping, + engine=engine, + ) + # Generate synthetic data + model = get_block_model(tree_mesh, 2.67) + synthetic_data = self.build_synthetic_data(simulation, model) + # Build inversion + inversion = self.build_inversion(tree_mesh, simulation, synthetic_data) + # Run inversion + starting_model = np.zeros(tree_mesh.n_cells) + recovered_model = inversion.run(starting_model) + # Predict data + prediction = simulation.dpred(recovered_model) + # Check if prediction is close to the synthetic data + atol, rtol = 0.005, 1e-5 + np.testing.assert_allclose( + prediction, synthetic_data.dobs, atol=atol, rtol=rtol + ) + + +class TestMagneticEquivalentSources(BaseFittingEquivalentSources): + """ + Test fitting magnetic equivalent sources with synthetic data. + """ + + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize( + "top_bottom_as_array", + (False, True), + ids=("top-bottom-float", "top-bottom-array"), + ) + def test_predictions_on_data_points( + self, + tree_mesh, + magnetic_survey, + top_bottom_as_array, + engine, + ): + """ + Test eq sources predictions on the same data points. + + The equivalent sources should be able to reproduce the same data with + which they were trained. + """ + # Get mesh top and bottom + mesh_top, mesh_bottom = self.get_mesh_top_bottom( + tree_mesh, array=top_bottom_as_array + ) + # Build simulation + mapping = get_mapping(tree_mesh) + simulation = magnetics.SimulationEquivalentSourceLayer( + tree_mesh, + mesh_top, + mesh_bottom, + survey=magnetic_survey, + chiMap=mapping, + engine=engine, + ) + # Generate synthetic data + model = get_block_model(tree_mesh, 1e-3) + synthetic_data = self.build_synthetic_data(simulation, model) + # Build inversion + inversion = self.build_inversion(tree_mesh, simulation, synthetic_data) + # Run inversion + starting_model = np.zeros(tree_mesh.n_cells) + recovered_model = inversion.run(starting_model) + # Predict data + prediction = simulation.dpred(recovered_model) + # Check if prediction is close to the synthetic data + atol, rtol = 0.005, 1e-5 + np.testing.assert_allclose( + prediction, synthetic_data.dobs, atol=atol, rtol=rtol + ) diff --git a/tests/pf/test_forward_Grav_Linear.py b/tests/pf/test_forward_Grav_Linear.py index 32a964710a..063fff9904 100644 --- a/tests/pf/test_forward_Grav_Linear.py +++ b/tests/pf/test_forward_Grav_Linear.py @@ -1,3 +1,5 @@ +import re + import pytest import discretize import simpeg @@ -143,7 +145,7 @@ def test_accelerations_vs_analytic( mesh, survey=survey, rhoMap=idenMap, - ind_active=active_cells, + active_cells=active_cells, store_sensitivities=store_sensitivities, engine=engine, sensitivity_path=str(sensitivity_path), @@ -199,7 +201,7 @@ def test_tensor_vs_analytic( mesh, survey=survey, rhoMap=idenMap, - ind_active=active_cells, + active_cells=active_cells, store_sensitivities=store_sensitivities, engine=engine, sensitivity_path=str(sensitivity_path), @@ -259,7 +261,7 @@ def test_guv_vs_analytic( mesh, survey=survey, rhoMap=idenMap, - ind_active=active_cells, + active_cells=active_cells, store_sensitivities=store_sensitivities, engine=engine, sensitivity_path=str(sensitivity_path), @@ -301,7 +303,7 @@ def test_sensitivity_dtype( simple_mesh, survey=survey, rhoMap=idenMap, - ind_active=active_cells, + active_cells=active_cells, engine=engine, store_sensitivities=store_sensitivities, sensitivity_path=str(sensitivity_path), @@ -351,7 +353,9 @@ def test_choclo_and_sensitivity_path_as_dir(self, simple_mesh, tmp_path): sensitivity_path = tmp_path / "sensitivity_dummy" sensitivity_path.mkdir() # Check if error is raised - msg = f"The passed sensitivity_path '{str(sensitivity_path)}' is a directory" + msg = re.escape( + f"The passed sensitivity_path '{str(sensitivity_path)}' is a directory" + ) with pytest.raises(ValueError, match=msg): gravity.Simulation3DIntegral( simple_mesh, @@ -437,34 +441,3 @@ def test_invalid_conversion_factor(self): component = "invalid-component" with pytest.raises(ValueError, match=f"Invalid component '{component}'"): gravity.simulation._get_conversion_factor(component) - - -class TestInvalidMeshChoclo: - @pytest.fixture(params=("tensormesh", "treemesh")) - def mesh(self, request): - """Sample 2D mesh.""" - hx, hy = [(0.1, 8)], [(0.1, 8)] - h = (hx, hy) - if request.param == "tensormesh": - mesh = discretize.TensorMesh(h, "CC") - else: - mesh = discretize.TreeMesh(h, origin="CC") - mesh.finalize() - return mesh - - def test_invalid_mesh_with_choclo(self, mesh): - """ - Test if simulation raises error when passing an invalid mesh and using choclo - """ - # Build survey - receivers_locations = np.array([[0, 0, 0]]) - receivers = gravity.Point(receivers_locations) - sources = gravity.SourceField([receivers]) - survey = gravity.Survey(sources) - # Check if error is raised - msg = ( - "Invalid mesh with 2 dimensions. " - "Only 3D meshes are supported when using 'choclo' as engine." - ) - with pytest.raises(ValueError, match=msg): - gravity.Simulation3DIntegral(mesh, survey, engine="choclo") diff --git a/tests/pf/test_forward_Mag_Linear.py b/tests/pf/test_forward_Mag_Linear.py index 9cf3498238..596813ff09 100644 --- a/tests/pf/test_forward_Mag_Linear.py +++ b/tests/pf/test_forward_Mag_Linear.py @@ -1,5 +1,7 @@ from __future__ import annotations +import re + import discretize import numpy as np import pytest @@ -102,7 +104,6 @@ def create_mag_survey( mag.Survey a magnetic Survey instance """ - receivers = mag.Point(receiver_locations, components=components) strenght, inclination, declination = inducing_field_params source_field = mag.UniformBackgroundField( @@ -114,6 +115,26 @@ def create_mag_survey( return mag.Survey(source_field) +def get_shifted_locations( + receiver_locations: np.ndarray, delta: float, direction: str +) -> tuple[np.ndarray, np.ndarray]: + """ + Shift the locations of receivers along a particular direction. + """ + if direction == "x": + index = 0 + elif direction == "y": + index = 1 + elif direction == "z": + index = 2 + else: + raise ValueError(f"Invalid direction '{direction}'") + plus, minus = receiver_locations.copy(), receiver_locations.copy() + plus[:, index] += delta / 2.0 + minus[:, index] -= delta / 2.0 + return plus, minus + + class TestsMagSimulation: """ Test mag simulation against the analytic solutions single prisms @@ -140,7 +161,10 @@ def mag_mesh(self) -> discretize.TensorMesh: @pytest.fixture def two_blocks(self) -> tuple[np.ndarray, np.ndarray]: """ - The parameters defining two blocks + The parameters defining two blocks. + + The boundaries of the prism should match nodes in the mesh, otherwise + these blocks won't be exactly represented in the mesh model. Returns ------- @@ -148,8 +172,8 @@ def two_blocks(self) -> tuple[np.ndarray, np.ndarray]: Tuple of (3, 2) arrays of (xmin, xmax), (ymin, ymax), (zmin, zmax) dimensions of each block. """ - block1 = np.array([[-1.5, 1.5], [-1.5, 1.5], [-1.5, 1.5]]) - block2 = np.array([[-0.7, 0.7], [-0.7, 0.7], [-0.7, 0.7]]) + block1 = np.array([[-2.5, 0.5], [-3.1, 1.3], [-3.7, 1.5]]) + block2 = np.array([[0.7, 1.9], [-0.7, 2.7], [-1.7, 0.7]]) return block1, block2 @pytest.fixture @@ -232,7 +256,7 @@ def test_magnetic_field_and_tmi_w_susceptibility( mag_mesh, survey=survey, chiMap=identity_map, - ind_active=active_cells, + active_cells=active_cells, sensitivity_path=str(tmp_path / f"{engine}"), store_sensitivities=store_sensitivities, engine=engine, @@ -248,21 +272,18 @@ def test_magnetic_field_and_tmi_w_susceptibility( # Compute analytical response from magnetic prism block1, block2 = two_blocks prism_1 = MagneticPrism(block1[:, 0], block1[:, 1], chi1 * b0 / mu_0) - prism_2 = MagneticPrism(block2[:, 0], block2[:, 1], -chi1 * b0 / mu_0) - prism_3 = MagneticPrism(block2[:, 0], block2[:, 1], chi2 * b0 / mu_0) + prism_2 = MagneticPrism(block2[:, 0], block2[:, 1], chi2 * b0 / mu_0) - d = ( - prism_1.magnetic_flux_density(receiver_locations) - + prism_2.magnetic_flux_density(receiver_locations) - + prism_3.magnetic_flux_density(receiver_locations) - ) + d = prism_1.magnetic_flux_density( + receiver_locations + ) + prism_2.magnetic_flux_density(receiver_locations) # TMI projection tmi = sim.tmi_projection d_t2 = d_x * tmi[0] + d_y * tmi[1] + d_z * tmi[2] # Check results - rtol, atol = 1e-7, 1e-6 + rtol, atol = 2e-6, 1e-6 np.testing.assert_allclose( d_t, d_t2, rtol=rtol, atol=atol ) # double check internal projection @@ -313,45 +334,117 @@ def test_magnetic_gradiometry_w_susceptibility( mag_mesh, survey=survey, chiMap=identity_map, - ind_active=active_cells, + active_cells=active_cells, sensitivity_path=str(tmp_path / f"{engine}"), store_sensitivities=store_sensitivities, engine=engine, **parallel_kwargs, ) - if engine == "choclo": - # gradient simulation not implemented for choclo yet - with pytest.raises(NotImplementedError): - data = sim.dpred(model_reduced) - else: - data = sim.dpred(model_reduced) - d_xx = data[0::6] - d_xy = data[1::6] - d_xz = data[2::6] - d_yy = data[3::6] - d_yz = data[4::6] - d_zz = data[5::6] - - # Compute analytical response from magnetic prism - block1, block2 = two_blocks - prism_1 = MagneticPrism(block1[:, 0], block1[:, 1], chi1 * b0 / mu_0) - prism_2 = MagneticPrism(block2[:, 0], block2[:, 1], -chi1 * b0 / mu_0) - prism_3 = MagneticPrism(block2[:, 0], block2[:, 1], chi2 * b0 / mu_0) - - d = ( - prism_1.magnetic_field_gradient(receiver_locations) - + prism_2.magnetic_field_gradient(receiver_locations) - + prism_3.magnetic_field_gradient(receiver_locations) - ) * mu_0 - - # Check results - rtol, atol = 5e-7, 1e-6 - np.testing.assert_allclose(d_xx, d[..., 0, 0], rtol=rtol, atol=atol) - np.testing.assert_allclose(d_xy, d[..., 0, 1], rtol=rtol, atol=atol) - np.testing.assert_allclose(d_xz, d[..., 0, 2], rtol=rtol, atol=atol) - np.testing.assert_allclose(d_yy, d[..., 1, 1], rtol=rtol, atol=atol) - np.testing.assert_allclose(d_yz, d[..., 1, 2], rtol=rtol, atol=atol) - np.testing.assert_allclose(d_zz, d[..., 2, 2], rtol=rtol, atol=atol) + data = sim.dpred(model_reduced) + d_xx = data[0::6] + d_xy = data[1::6] + d_xz = data[2::6] + d_yy = data[3::6] + d_yz = data[4::6] + d_zz = data[5::6] + + # Compute analytical response from magnetic prism + block1, block2 = two_blocks + prism_1 = MagneticPrism(block1[:, 0], block1[:, 1], chi1 * b0 / mu_0) + prism_2 = MagneticPrism(block2[:, 0], block2[:, 1], chi2 * b0 / mu_0) + + d = ( + prism_1.magnetic_field_gradient(receiver_locations) + + prism_2.magnetic_field_gradient(receiver_locations) + ) * mu_0 + + # Check results + rtol, atol = 5e-7, 1e-6 + np.testing.assert_allclose(d_xx, d[..., 0, 0], rtol=rtol, atol=atol) + np.testing.assert_allclose(d_xy, d[..., 0, 1], rtol=rtol, atol=atol) + np.testing.assert_allclose(d_xz, d[..., 0, 2], rtol=rtol, atol=atol) + np.testing.assert_allclose(d_yy, d[..., 1, 1], rtol=rtol, atol=atol) + np.testing.assert_allclose(d_yz, d[..., 1, 2], rtol=rtol, atol=atol) + np.testing.assert_allclose(d_zz, d[..., 2, 2], rtol=rtol, atol=atol) + + @pytest.mark.parametrize( + "engine, parallel_kwargs", + [ + ("geoana", {"n_processes": None}), + ("geoana", {"n_processes": 1}), + ("choclo", {"numba_parallel": False}), + ("choclo", {"numba_parallel": True}), + ], + ids=["geoana_serial", "geoana_parallel", "choclo_serial", "choclo_parallel"], + ) + @pytest.mark.parametrize("store_sensitivities", ("ram", "disk", "forward_only")) + def test_tmi_derivatives_w_susceptibility( + self, + engine, + parallel_kwargs, + store_sensitivities, + tmp_path, + mag_mesh, + two_blocks, + receiver_locations, + inducing_field, + ): + """ + Test TMI derivatives (with susceptibility as model) + """ + (h0_amplitude, h0_inclination, h0_declination), b0 = inducing_field + chi1 = 0.01 + chi2 = 0.02 + model, active_cells = create_block_model(mag_mesh, two_blocks, (chi1, chi2)) + model_reduced = model[active_cells] + # Create reduced identity map for Linear Problem + identity_map = maps.IdentityMap(nP=int(sum(active_cells))) + + components = ["tmi_x", "tmi_y", "tmi_z"] + survey = create_mag_survey( + components=components, + receiver_locations=receiver_locations, + inducing_field_params=(h0_amplitude, h0_inclination, h0_declination), + ) + sim = mag.Simulation3DIntegral( + mag_mesh, + survey=survey, + chiMap=identity_map, + active_cells=active_cells, + sensitivity_path=str(tmp_path / f"{engine}"), + store_sensitivities=store_sensitivities, + engine=engine, + **parallel_kwargs, + ) + data = sim.dpred(model_reduced).reshape(-1, len(components)) + tmi_x = data[:, 0] + tmi_y = data[:, 1] + tmi_z = data[:, 2] + + # Compute analytical response from magnetic prism + block1, block2 = two_blocks + prism_1 = MagneticPrism(block1[:, 0], block1[:, 1], chi1 * b0 / mu_0) + prism_2 = MagneticPrism(block2[:, 0], block2[:, 1], chi2 * b0 / mu_0) + + d = ( + prism_1.magnetic_field_gradient(receiver_locations) + + prism_2.magnetic_field_gradient(receiver_locations) + ) * mu_0 + + # Check results + rtol, atol = 5e-7, 1e-6 + expected_tmi_x = ( + d[:, 0, 0] * b0[0] + d[:, 0, 1] * b0[1] + d[:, 0, 2] * b0[2] + ) / h0_amplitude + expected_tmi_y = ( + d[:, 1, 0] * b0[0] + d[:, 1, 1] * b0[1] + d[:, 1, 2] * b0[2] + ) / h0_amplitude + expected_tmi_z = ( + d[:, 2, 0] * b0[0] + d[:, 2, 1] * b0[1] + d[:, 2, 2] * b0[2] + ) / h0_amplitude + np.testing.assert_allclose(tmi_x, expected_tmi_x, rtol=rtol, atol=atol) + np.testing.assert_allclose(tmi_y, expected_tmi_y, rtol=rtol, atol=atol) + np.testing.assert_allclose(tmi_z, expected_tmi_z, rtol=rtol, atol=atol) @pytest.mark.parametrize( "engine, parallel_kwargs", @@ -397,7 +490,7 @@ def test_magnetic_vector_and_tmi_w_magnetization( mag_mesh, survey=survey, chiMap=identity_map, - ind_active=active_cells, + active_cells=active_cells, sensitivity_path=str(tmp_path / f"{engine}"), store_sensitivities=store_sensitivities, model_type="vector", @@ -413,17 +506,12 @@ def test_magnetic_vector_and_tmi_w_magnetization( block1[:, 0], block1[:, 1], M1 * np.linalg.norm(b0) / mu_0 ) prism_2 = MagneticPrism( - block2[:, 0], block2[:, 1], -M1 * np.linalg.norm(b0) / mu_0 - ) - prism_3 = MagneticPrism( block2[:, 0], block2[:, 1], M2 * np.linalg.norm(b0) / mu_0 ) - d = ( - prism_1.magnetic_flux_density(receiver_locations) - + prism_2.magnetic_flux_density(receiver_locations) - + prism_3.magnetic_flux_density(receiver_locations) - ) + d = prism_1.magnetic_flux_density( + receiver_locations + ) + prism_2.magnetic_flux_density(receiver_locations) tmi = sim.tmi_projection # Check results @@ -433,6 +521,93 @@ def test_magnetic_vector_and_tmi_w_magnetization( np.testing.assert_allclose(data[:, 2], d[:, 2], rtol=rtol, atol=atol) np.testing.assert_allclose(data[:, 3], d @ tmi, rtol=rtol, atol=atol) + @pytest.mark.parametrize( + "engine, parallel_kwargs", + [ + ("geoana", {"n_processes": None}), + ("geoana", {"n_processes": 1}), + ("choclo", {"numba_parallel": False}), + ("choclo", {"numba_parallel": True}), + ], + ids=["geoana_serial", "geoana_parallel", "choclo_serial", "choclo_parallel"], + ) + @pytest.mark.parametrize("store_sensitivities", ("ram", "disk", "forward_only")) + def test_tmi_derivatives_w_magnetization( + self, + engine, + parallel_kwargs, + store_sensitivities, + tmp_path, + mag_mesh, + two_blocks, + receiver_locations, + inducing_field, + ): + """ + Test TMI derivatives (using magnetization vectors as model) + """ + (h0_amplitude, h0_inclination, h0_declination), b0 = inducing_field + M1 = (utils.mat_utils.dip_azimuth2cartesian(45, -40) * 0.05).squeeze() + M2 = (utils.mat_utils.dip_azimuth2cartesian(120, 32) * 0.1).squeeze() + + model, active_cells = create_block_model(mag_mesh, two_blocks, (M1, M2)) + model_reduced = model[active_cells].reshape(-1, order="F") + # Create reduced identity map for Linear Problem + identity_map = maps.IdentityMap(nP=int(sum(active_cells)) * 3) + + components = ["tmi_x", "tmi_y", "tmi_z"] + survey = create_mag_survey( + components=components, + receiver_locations=receiver_locations, + inducing_field_params=(h0_amplitude, h0_inclination, h0_declination), + ) + + sim = mag.Simulation3DIntegral( + mag_mesh, + survey=survey, + chiMap=identity_map, + active_cells=active_cells, + sensitivity_path=str(tmp_path / f"{engine}"), + store_sensitivities=store_sensitivities, + model_type="vector", + engine=engine, + **parallel_kwargs, + ) + + data = sim.dpred(model_reduced).reshape(-1, len(components)) + tmi_x = data[:, 0] + tmi_y = data[:, 1] + tmi_z = data[:, 2] + + # Compute analytical response from magnetic prism + block1, block2 = two_blocks + prism_1 = MagneticPrism( + block1[:, 0], block1[:, 1], M1 * np.linalg.norm(b0) / mu_0 + ) + prism_2 = MagneticPrism( + block2[:, 0], block2[:, 1], M2 * np.linalg.norm(b0) / mu_0 + ) + + d = ( + prism_1.magnetic_field_gradient(receiver_locations) + + prism_2.magnetic_field_gradient(receiver_locations) + ) * mu_0 + + # Check results + rtol, atol = 5e-7, 1e-6 + expected_tmi_x = ( + d[:, 0, 0] * b0[0] + d[:, 0, 1] * b0[1] + d[:, 0, 2] * b0[2] + ) / h0_amplitude + expected_tmi_y = ( + d[:, 1, 0] * b0[0] + d[:, 1, 1] * b0[1] + d[:, 1, 2] * b0[2] + ) / h0_amplitude + expected_tmi_z = ( + d[:, 2, 0] * b0[0] + d[:, 2, 1] * b0[1] + d[:, 2, 2] * b0[2] + ) / h0_amplitude + np.testing.assert_allclose(tmi_x, expected_tmi_x, rtol=rtol, atol=atol) + np.testing.assert_allclose(tmi_y, expected_tmi_y, rtol=rtol, atol=atol) + np.testing.assert_allclose(tmi_z, expected_tmi_z, rtol=rtol, atol=atol) + @pytest.mark.parametrize( "engine, parallel_kwargs", [ @@ -477,7 +652,7 @@ def test_magnetic_field_amplitude_w_magnetization( mag_mesh, survey=survey, chiMap=identity_map, - ind_active=active_cells, + active_cells=active_cells, sensitivity_path=str(tmp_path / f"{engine}"), store_sensitivities=store_sensitivities, model_type="vector", @@ -494,23 +669,85 @@ def test_magnetic_field_amplitude_w_magnetization( block1[:, 0], block1[:, 1], M1 * np.linalg.norm(b0) / mu_0 ) prism_2 = MagneticPrism( - block2[:, 0], block2[:, 1], -M1 * np.linalg.norm(b0) / mu_0 - ) - prism_3 = MagneticPrism( block2[:, 0], block2[:, 1], M2 * np.linalg.norm(b0) / mu_0 ) - d = ( - prism_1.magnetic_flux_density(receiver_locations) - + prism_2.magnetic_flux_density(receiver_locations) - + prism_3.magnetic_flux_density(receiver_locations) - ) + d = prism_1.magnetic_flux_density( + receiver_locations + ) + prism_2.magnetic_flux_density(receiver_locations) d_amp = np.linalg.norm(d, axis=1) # Check results rtol, atol = 5e-7, 1e-6 np.testing.assert_allclose(data, d_amp, rtol=rtol, atol=atol) + @pytest.mark.parametrize("engine", ("geoana", "choclo")) + @pytest.mark.parametrize("direction", ("x", "y", "z")) + def test_tmi_derivatives_finite_diff( + self, + engine, + direction, + mag_mesh, + two_blocks, + receiver_locations, + inducing_field, + ): + """ + Test tmi derivatives against finite differences. + + Use float64 elements in the sensitivity matrix to avoid numerical + instabilities due to small values of delta. + """ + # Get inducing field and two blocks model + inducing_field_params, b0 = inducing_field + chi1, chi2 = 0.01, 0.02 + model, active_cells = create_block_model(mag_mesh, two_blocks, (chi1, chi2)) + model_reduced = model[active_cells] + identity_map = maps.IdentityMap(nP=int(sum(active_cells))) + # Create survey to compute tmi derivative through analytic solution + survey = create_mag_survey( + components=f"tmi_{direction}", + receiver_locations=receiver_locations, + inducing_field_params=inducing_field_params, + ) + kwargs = dict( + chiMap=identity_map, + active_cells=active_cells, + engine=engine, + sensitivity_dtype=np.float64, + ) + simulation = mag.Simulation3DIntegral( + mag_mesh, + survey=survey, + **kwargs, + ) + # Create shifted surveys to compute tmi derivatives through finite differences + delta = 1e-6 + shifted_surveys = [ + create_mag_survey( + components="tmi", + receiver_locations=shifted_locations, + inducing_field_params=inducing_field_params, + ) + for shifted_locations in get_shifted_locations( + receiver_locations, delta, direction + ) + ] + simulations_tmi = [ + mag.Simulation3DIntegral(mag_mesh, survey=shifted_survey, **kwargs) + for shifted_survey in shifted_surveys + ] + # Compute tmi derivatives + tmi_derivative = simulation.dpred(model_reduced) + # Compute tmi derivatives with finite differences + tmis = [sim.dpred(model_reduced) for sim in simulations_tmi] + tmi_derivative_finite_diff = (tmis[0] - tmis[1]) / delta + # Compare results + rtol, atol = 1e-6, 5e-6 + np.testing.assert_allclose( + tmi_derivative, tmi_derivative_finite_diff, rtol=rtol, atol=atol + ) + @pytest.mark.parametrize("engine", ("choclo", "geoana")) @pytest.mark.parametrize("store_sensitivities", ("ram", "disk", "forward_only")) def test_sensitivity_dtype( @@ -539,7 +776,7 @@ def test_sensitivity_dtype( mag_mesh, survey=survey, chiMap=idenMap, - ind_active=active_cells, + active_cells=active_cells, engine=engine, store_sensitivities=store_sensitivities, sensitivity_path=str(sensitivity_path), @@ -587,7 +824,9 @@ def test_choclo_and_sensitivity_path_as_dir(self, mag_mesh, tmp_path): sensitivity_path = tmp_path / "sensitivity_dummy" sensitivity_path.mkdir() # Check if error is raised - msg = f"The passed sensitivity_path '{str(sensitivity_path)}' is a directory" + msg = re.escape( + f"The passed sensitivity_path '{str(sensitivity_path)}' is a directory" + ) with pytest.raises(ValueError, match=msg): mag.Simulation3DIntegral( mag_mesh, @@ -620,7 +859,7 @@ def test_sensitivities_on_disk(self, mag_mesh, receiver_locations, tmp_path): assert sensitivities_path.is_file() assert type(simulation.G) is np.memmap - def test_sensitivities_on_ram(self, mag_mesh, receiver_locations, tmp_path): + def test_sensitivities_on_ram(self, mag_mesh, receiver_locations): """ Test if sensitivity matrix is correctly being allocated in memory when asked """ @@ -653,164 +892,6 @@ def test_choclo_missing(self, mag_mesh, monkeypatch): mag.Simulation3DIntegral(mag_mesh, engine="choclo") -def test_ana_mag_tmi_grad_forward(): - """ - Test TMI gradiometry using susceptibilities as model - """ - nx = 61 - ny = 61 - - h0_amplitude, h0_inclination, h0_declination = (50000.0, 60.0, 250.0) - b0 = mag.analytics.IDTtoxyz(-h0_inclination, h0_declination, h0_amplitude) - chi1 = 0.01 - chi2 = 0.02 - - # Define a mesh - cs = 0.2 - hxind = [(cs, 41)] - hyind = [(cs, 41)] - hzind = [(cs, 41)] - mesh = discretize.TensorMesh([hxind, hyind, hzind], "CCC") - - # create a model of two blocks, 1 inside the other - block1 = np.array([[-1.5, 1.5], [-1.5, 1.5], [-1.5, 1.5]]) - block2 = np.array([[-0.7, 0.7], [-0.7, 0.7], [-0.7, 0.7]]) - - def get_block_inds(grid, block): - return np.where( - (grid[:, 0] > block[0, 0]) - & (grid[:, 0] < block[0, 1]) - & (grid[:, 1] > block[1, 0]) - & (grid[:, 1] < block[1, 1]) - & (grid[:, 2] > block[2, 0]) - & (grid[:, 2] < block[2, 1]) - ) - - block1_inds = get_block_inds(mesh.cell_centers, block1) - block2_inds = get_block_inds(mesh.cell_centers, block2) - - model = np.zeros(mesh.n_cells) - model[block1_inds] = chi1 - model[block2_inds] = chi2 - - active_cells = model != 0.0 - model_reduced = model[active_cells] - - # Create reduced identity map for Linear Problem - idenMap = maps.IdentityMap(nP=int(sum(active_cells))) - - # Create plane of observations - xr = np.linspace(-20, 20, nx) - dxr = xr[1] - xr[0] - yr = np.linspace(-20, 20, ny) - dyr = yr[1] - yr[0] - X, Y = np.meshgrid(xr, yr) - Z = np.ones_like(X) * 3.0 - locXyz = np.c_[X.reshape(-1), Y.reshape(-1), Z.reshape(-1)] - components = ["tmi", "tmi_x", "tmi_y", "tmi_z"] - - rxLoc = mag.Point(locXyz, components=components) - srcField = mag.UniformBackgroundField( - receiver_list=[rxLoc], - amplitude=h0_amplitude, - inclination=h0_inclination, - declination=h0_declination, - ) - survey = mag.Survey(srcField) - - # Create reduced identity map for Linear Problem - idenMap = maps.IdentityMap(nP=int(sum(active_cells))) - - sim = mag.Simulation3DIntegral( - mesh, - survey=survey, - chiMap=idenMap, - ind_active=active_cells, - store_sensitivities="forward_only", - n_processes=None, - ) - - data = sim.dpred(model_reduced) - tmi = data[0::4] - d_x = data[1::4] - d_y = data[2::4] - d_z = data[3::4] - - # Compute analytical response from magnetic prism - prism_1 = MagneticPrism(block1[:, 0], block1[:, 1], chi1 * b0 / mu_0) - prism_2 = MagneticPrism(block2[:, 0], block2[:, 1], -chi1 * b0 / mu_0) - prism_3 = MagneticPrism(block2[:, 0], block2[:, 1], chi2 * b0 / mu_0) - - d = ( - prism_1.magnetic_field_gradient(locXyz) - + prism_2.magnetic_field_gradient(locXyz) - + prism_3.magnetic_field_gradient(locXyz) - ) * mu_0 - tmi_x = ( - d[:, 0, 0] * b0[0] + d[:, 0, 1] * b0[1] + d[:, 0, 2] * b0[2] - ) / h0_amplitude - tmi_y = ( - d[:, 1, 0] * b0[0] + d[:, 1, 1] * b0[1] + d[:, 1, 2] * b0[2] - ) / h0_amplitude - tmi_z = ( - d[:, 2, 0] * b0[0] + d[:, 2, 1] * b0[1] + d[:, 2, 2] * b0[2] - ) / h0_amplitude - np.testing.assert_allclose(d_x, tmi_x, rtol=1e-10, atol=1e-12) - np.testing.assert_allclose(d_y, tmi_y, rtol=1e-10, atol=1e-12) - np.testing.assert_allclose(d_z, tmi_z, rtol=1e-10, atol=1e-12) - - # finite difference test y-grad - np.testing.assert_allclose( - np.diff(tmi.reshape(nx, ny, order="F")[:, ::2], axis=1) / (2 * dyr), - tmi_y.reshape(nx, ny, order="F")[:, 1::2], - atol=1.0, - rtol=1e-1, - ) - # finite difference test x-grad - np.testing.assert_allclose( - np.diff(tmi.reshape(nx, ny, order="F")[::2, :], axis=0) / (2 * dxr), - tmi_x.reshape(nx, ny, order="F")[1::2, :], - atol=1.0, - rtol=1e-1, - ) - - -class TestInvalidMeshChoclo: - @pytest.fixture(params=("tensormesh", "treemesh")) - def mesh(self, request): - """Sample 2D mesh.""" - hx, hy = [(0.1, 8)], [(0.1, 8)] - h = (hx, hy) - if request.param == "tensormesh": - mesh = discretize.TensorMesh(h, "CC") - else: - mesh = discretize.TreeMesh(h, origin="CC") - mesh.finalize() - return mesh - - def test_invalid_mesh_with_choclo(self, mesh): - """ - Test if simulation raises error when passing an invalid mesh and using choclo - """ - # Build survey - receivers_locations = np.array([[0, 0, 0]]) - receivers = mag.Point(receivers_locations) - sources = mag.UniformBackgroundField( - receiver_list=[receivers], - amplitude=50_000, - inclination=45.0, - declination=12.0, - ) - survey = mag.Survey(sources) - # Check if error is raised - msg = ( - "Invalid mesh with 2 dimensions. " - "Only 3D meshes are supported when using 'choclo' as engine." - ) - with pytest.raises(ValueError, match=msg): - mag.Simulation3DIntegral(mesh, survey, engine="choclo") - - def test_removed_modeltype(): """Test if accesing removed modelType property raises error.""" h = [[(2, 2)], [(2, 2)], [(2, 2)]] diff --git a/tests/pf/test_forward_PFproblem.py b/tests/pf/test_forward_PFproblem.py index 0777e45c56..2c54300d7a 100644 --- a/tests/pf/test_forward_PFproblem.py +++ b/tests/pf/test_forward_PFproblem.py @@ -4,7 +4,6 @@ from simpeg.utils.model_builder import get_indices_sphere from simpeg.potential_fields import magnetics as mag import numpy as np -from pymatsolver import Pardiso class MagFwdProblemTests(unittest.TestCase): @@ -52,7 +51,6 @@ def setUp(self): M, survey=self.survey, muMap=maps.ChiMap(M), - solver=Pardiso, ) self.M = M self.chi = chi diff --git a/tests/pf/test_grav_inversion_linear.py b/tests/pf/test_grav_inversion_linear.py index 3657c4668d..1dfabebaee 100644 --- a/tests/pf/test_grav_inversion_linear.py +++ b/tests/pf/test_grav_inversion_linear.py @@ -77,7 +77,7 @@ def test_gravity_inversion_linear(engine): mesh, survey=survey, rhoMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="ram", engine=engine, **kwargs, @@ -104,7 +104,7 @@ def test_gravity_inversion_linear(engine): # Here is where the norms are applied starting_beta = directives.BetaEstimateMaxDerivative(10.0) - IRLS = directives.Update_IRLS() + IRLS = directives.UpdateIRLS() update_Jacobi = directives.UpdatePreconditioner() sensitivity_weights = directives.UpdateSensitivityWeights(every_iteration=False) inv = inversion.BaseInversion( diff --git a/tests/pf/test_mag_MVI_Octree.py b/tests/pf/test_mag_MVI_Octree.py index 48aa8e26bb..f03df665f1 100644 --- a/tests/pf/test_mag_MVI_Octree.py +++ b/tests/pf/test_mag_MVI_Octree.py @@ -98,7 +98,7 @@ def setUp(self): survey=survey, model_type="vector", chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="disk", ) self.sim = sim @@ -146,8 +146,8 @@ def setUp(self): # Here is where the norms are applied # Use pick a treshold parameter empirically based on the distribution of # model parameters - IRLS = directives.Update_IRLS( - f_min_change=1e-3, max_irls_iterations=0, beta_tol=5e-1 + IRLS = directives.UpdateIRLS( + f_min_change=1e-3, max_irls_iterations=0, misfit_tolerance=5e-1 ) # Pre-conditioner @@ -207,14 +207,13 @@ def setUp(self): invProb = inverse_problem.BaseInvProblem(dmis, reg, opt, beta=beta) # Here is where the norms are applied - IRLS = directives.Update_IRLS( + IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=5, - minGNiter=1, - beta_tol=0.5, - coolingRate=1, - coolEps_q=True, - sphericalDomain=True, + misfit_tolerance=0.5, + ) + spherical_scale = directives.SphericalUnitsWeights( + amplitude=wires.amp, angles=[reg_t, reg_p] ) # Special directive specific to the mag amplitude problem. The sensitivity @@ -225,7 +224,13 @@ def setUp(self): self.inv = inversion.BaseInversion( invProb, - directiveList=[ProjSpherical, IRLS, sensitivity_weights, update_Jacobi], + directiveList=[ + spherical_scale, + ProjSpherical, + IRLS, + sensitivity_weights, + update_Jacobi, + ], ) def test_mag_inverse(self): diff --git a/tests/pf/test_mag_inversion_linear.py b/tests/pf/test_mag_inversion_linear.py index 47d8df2321..e19c4b492b 100644 --- a/tests/pf/test_mag_inversion_linear.py +++ b/tests/pf/test_mag_inversion_linear.py @@ -1,6 +1,8 @@ import unittest import discretize from discretize.utils import active_from_xyz +import pytest +import matplotlib.pyplot as plt from simpeg import ( utils, maps, @@ -83,7 +85,7 @@ def setUp(self): self.mesh, survey=survey, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="disk", n_processes=None, ) @@ -93,7 +95,7 @@ def setUp(self): data = sim.make_synthetic_data( self.model, relative_error=0.0, - noise_floor=1.0, + noise_floor=2.0, add_noise=True, random_seed=2, ) @@ -115,11 +117,17 @@ def setUp(self): betaest = directives.BetaEstimate_ByEig() # Here is where the norms are applied - IRLS = directives.Update_IRLS(f_min_change=1e-4, minGNiter=1) + IRLS = directives.UpdateIRLS(f_min_change=1e-4) update_Jacobi = directives.UpdatePreconditioner() sensitivity_weights = directives.UpdateSensitivityWeights(every_iteration=False) self.inv = inversion.BaseInversion( - invProb, directiveList=[IRLS, sensitivity_weights, betaest, update_Jacobi] + invProb, + directiveList=[ + IRLS, + sensitivity_weights, + betaest, + update_Jacobi, + ], ) def test_mag_inverse(self): @@ -127,19 +135,30 @@ def test_mag_inverse(self): mrec = self.inv.run(self.model) residual = np.linalg.norm(mrec - self.model) / np.linalg.norm(self.model) - # plt.figure() - # ax = plt.subplot(1, 2, 1) - # midx = int(self.mesh.shape_cells[0]/2) - # self.mesh.plot_slice(self.actvMap*mrec, ax=ax, normal='Y', ind=midx, - # grid=True, clim=(0, 0.02)) + self.assertTrue(residual < 0.05) - # ax = plt.subplot(1, 2, 2) - # midx = int(self.mesh.shape_cells[0]/2) - # self.mesh.plot_slice(self.actvMap*self.model, ax=ax, normal='Y', ind=midx, - # grid=True, clim=(0, 0.02)) - # plt.show() + @pytest.mark.skip(reason="For validation only.") + def test_plot_results(self): + self.sim.store_sensitivities = "ram" + mrec = self.inv.run(self.model) + plt.figure() + ax = plt.subplot(1, 2, 1) + midx = int(self.mesh.shape_cells[0] / 2) + self.mesh.plot_slice( + self.actvMap * mrec, ax=ax, normal="Y", ind=midx, grid=True, clim=(0, 0.02) + ) - self.assertTrue(residual < 0.05) + ax = plt.subplot(1, 2, 2) + midx = int(self.mesh.shape_cells[0] / 2) + self.mesh.plot_slice( + self.actvMap * self.model, + ax=ax, + normal="Y", + ind=midx, + grid=True, + clim=(0, 0.02), + ) + plt.show() def tearDown(self): # Clean up the working directory diff --git a/tests/pf/test_mag_inversion_linear_Octree.py b/tests/pf/test_mag_inversion_linear_Octree.py index d754d64e5c..af6f7c929f 100644 --- a/tests/pf/test_mag_inversion_linear_Octree.py +++ b/tests/pf/test_mag_inversion_linear_Octree.py @@ -1,7 +1,8 @@ import shutil import unittest import numpy as np - +import pytest +import matplotlib.pyplot as plt from discretize.utils import mesh_builder_xyz, refine_tree_xyz, active_from_xyz from simpeg import ( directives, @@ -103,7 +104,7 @@ def setUp(self): self.mesh, survey=survey, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="ram", n_processes=None, ) @@ -136,7 +137,7 @@ def setUp(self): ) invProb = inverse_problem.BaseInvProblem(dmis, reg, opt, beta=1e6) - IRLS = directives.Update_IRLS() + IRLS = directives.UpdateIRLS() update_Jacobi = directives.UpdatePreconditioner() sensitivity_weights = directives.UpdateSensitivityWeights() self.inv = inversion.BaseInversion( @@ -147,16 +148,19 @@ def test_mag_inverse(self): # Run the inversion mrec = self.inv.run(self.model * 1e-4) residual = np.linalg.norm(mrec - self.model) / np.linalg.norm(self.model) + self.assertLess(residual, 0.5) - # import matplotlib.pyplot as plt - # plt.figure() - # ax = plt.subplot(1, 2, 1) - # self.mesh.plot_slice(self.actvMap*mrec, ax=ax, normal="Y", grid=True) - # ax = plt.subplot(1, 2, 2) - # self.mesh.plot_slice(self.actvMap*self.model, ax=ax, normal="Y", grid=True) - # plt.show() + @pytest.mark.skip(reason="For validation only.") + def test_plot_results(self): + self.sim.store_sensitivities = "ram" + mrec = self.inv.run(self.model * 1e-4) - self.assertLess(residual, 0.5) + plt.figure() + ax = plt.subplot(1, 2, 1) + self.mesh.plot_slice(self.actvMap * mrec, ax=ax, normal="Y", grid=True) + ax = plt.subplot(1, 2, 2) + self.mesh.plot_slice(self.actvMap * self.model, ax=ax, normal="Y", grid=True) + plt.show() def tearDown(self): # Clean up the working directory diff --git a/tests/pf/test_mag_nonLinear_Amplitude.py b/tests/pf/test_mag_nonLinear_Amplitude.py index d4f11f6ce8..b9156246d5 100644 --- a/tests/pf/test_mag_nonLinear_Amplitude.py +++ b/tests/pf/test_mag_nonLinear_Amplitude.py @@ -1,4 +1,6 @@ import numpy as np +import pytest +import matplotlib.pyplot as plt from simpeg import ( data, data_misfit, @@ -100,7 +102,7 @@ def setUp(self): survey=survey, mesh=mesh, chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="forward_only", ) simulation.M = M_xyz @@ -134,7 +136,7 @@ def setUp(self): mesh=mesh, survey=survey, chiMap=idenMap, - ind_active=surf, + active_cells=surf, store_sensitivities="ram", ) simulation.model = mstart @@ -166,9 +168,10 @@ def setUp(self): # Target misfit to stop the inversion, # try to fit as much as possible of the signal, we don't want to lose anything - IRLS = directives.Update_IRLS( - f_min_change=1e-3, minGNiter=1, beta_tol=1e-1, max_irls_iterations=5 + IRLS = directives.UpdateIRLS( + f_min_change=1e-3, misfit_tolerance=1e-1, max_irls_iterations=5 ) + update_Jacobi = directives.UpdatePreconditioner() # Put all the parts together inv = inversion.BaseInversion( @@ -200,7 +203,7 @@ def setUp(self): mesh=mesh, survey=surveyAmp, chiMap=idenMap, - ind_active=surf, + active_cells=surf, is_amplitude_data=True, store_sensitivities="forward_only", ) @@ -227,7 +230,7 @@ def setUp(self): survey=surveyAmp, mesh=mesh, chiMap=idenMap, - ind_active=actv, + active_cells=actv, is_amplitude_data=True, ) @@ -252,14 +255,10 @@ def setUp(self): betaest = directives.BetaEstimate_ByEig(beta0_ratio=1) # Specify the sparse norms - IRLS = directives.Update_IRLS( + IRLS = directives.UpdateIRLS( max_irls_iterations=5, f_min_change=1e-3, - minGNiter=1, - coolingRate=1, - beta_search=False, ) - # Special directive specific to the mag amplitude problem. The sensitivity # weights are update between each iteration. update_SensWeight = directives.UpdateSensitivityWeights() @@ -267,7 +266,13 @@ def setUp(self): # Put all together self.inv = inversion.BaseInversion( - invProb, directiveList=[update_SensWeight, betaest, IRLS, update_Jacobi] + invProb, + directiveList=[ + update_SensWeight, + betaest, + IRLS, + update_Jacobi, + ], ) self.mstart = mstart @@ -279,37 +284,47 @@ def test_mag_inverse(self): mrec_Amp = self.inv.run(self.mstart) residual = np.linalg.norm(mrec_Amp - self.model) / np.linalg.norm(self.model) - # print(residual) - # import matplotlib.pyplot as plt - - # # Plot the amplitude model - # plt.figure() - # ax = plt.subplot(2, 1, 1) - # im = self.mesh.plot_slice(self.actvPlot*self.model, - # ax=ax, normal='Y', ind=66, - # pcolor_opts={"vmin":0., "vmax":0.01} - # ) - # plt.colorbar(im[0]) - # ax.set_xlim([-200, 200]) - # ax.set_ylim([-100, 75]) - # ax.set_xlabel('x') - # ax.set_ylabel('y') - # plt.gca().set_aspect('equal', adjustable='box') - - # ax = plt.subplot(2, 1, 2) - # im = self.mesh.plot_slice(self.actvPlot*mrec_Amp, ax=ax, normal='Y', ind=66, - # pcolor_opts={"vmin":0., "vmax":0.01} - # ) - # plt.colorbar(im[0]) - # ax.set_xlim([-200, 200]) - # ax.set_ylim([-100, 75]) - # ax.set_xlabel('x') - # ax.set_ylabel('y') - # plt.gca().set_aspect('equal', adjustable='box') - - # plt.show() self.assertTrue(residual < 1.0) + @pytest.mark.skip(reason="For validation only.") + def test_plot_results(self): + self.sim.store_sensitivities = "ram" + mrec = self.inv.run(self.model) + + # Plot the amplitude model + plt.figure() + ax = plt.subplot(2, 1, 1) + im = self.mesh.plot_slice( + self.actvPlot * self.model, + ax=ax, + normal="Y", + ind=66, + pcolor_opts={"vmin": 0.0, "vmax": 0.01}, + ) + plt.colorbar(im[0]) + ax.set_xlim([-200, 200]) + ax.set_ylim([-100, 75]) + ax.set_xlabel("x") + ax.set_ylabel("y") + plt.gca().set_aspect("equal", adjustable="box") + + ax = plt.subplot(2, 1, 2) + im = self.mesh.plot_slice( + self.actvPlot * mrec, + ax=ax, + normal="Y", + ind=66, + pcolor_opts={"vmin": 0.0, "vmax": 0.01}, + ) + plt.colorbar(im[0]) + ax.set_xlim([-200, 200]) + ax.set_ylim([-100, 75]) + ax.set_xlabel("x") + ax.set_ylabel("y") + plt.gca().set_aspect("equal", adjustable="box") + + plt.show() + def tearDown(self): # Clean up the working directory if self.sim.store_sensitivities == "disk": diff --git a/tests/pf/test_mag_vector_amplitude.py b/tests/pf/test_mag_vector_amplitude.py index 5115e4a22a..3c949e22c5 100644 --- a/tests/pf/test_mag_vector_amplitude.py +++ b/tests/pf/test_mag_vector_amplitude.py @@ -1,4 +1,6 @@ import unittest +import pytest +import matplotlib.pyplot as plt from simpeg import ( directives, maps, @@ -98,7 +100,7 @@ def setUp(self): survey=survey, model_type="vector", chiMap=idenMap, - ind_active=actv, + active_cells=actv, store_sensitivities="disk", ) self.sim = sim @@ -138,8 +140,8 @@ def setUp(self): # Here is where the norms are applied # Use pick a treshold parameter empirically based on the distribution of # model parameters - IRLS = directives.Update_IRLS( - f_min_change=1e-3, max_irls_iterations=10, beta_tol=5e-1 + IRLS = directives.UpdateIRLS( + f_min_change=1e-3, max_irls_iterations=10, misfit_tolerance=5e-1 ) # Pre-conditioner @@ -159,28 +161,30 @@ def test_vector_amplitude_inverse(self): nC = int(mrec.shape[0] / 3) vec_xyz = mrec.reshape((nC, 3), order="F") residual = np.linalg.norm(vec_xyz - self.model) / np.linalg.norm(self.model) + self.assertLess(residual, 1) + + @pytest.mark.skip(reason="For validation only.") + def test_plot_results(self): + self.sim.store_sensitivities = "ram" + mrec = self.inv.run(self.mstart) - # import matplotlib.pyplot as plt - # ax = plt.subplot() - # self.mesh.plot_slice( - # self.actvMap * mrec.reshape((-1, 3), order="F"), - # v_type="CCv", - # view="vec", - # ax=ax, - # normal="Y", - # grid=True, - # quiver_opts={ - # "pivot": "mid", - # "scale": 8 * np.abs(mrec).max(), - # "scale_units": "inches", - # }, - # ) - # plt.gca().set_aspect("equal", adjustable="box") - # - # plt.show() + ax = plt.subplot() + self.mesh.plot_slice( + self.actvMap * mrec.reshape((-1, 3), order="F"), + v_type="CCv", + view="vec", + ax=ax, + normal="Y", + grid=True, + quiver_opts={ + "pivot": "mid", + "scale": 8 * np.abs(mrec).max(), + "scale_units": "inches", + }, + ) + plt.gca().set_aspect("equal", adjustable="box") - self.assertLess(residual, 1) - # self.assertTrue(residual < 0.05) + plt.show() def tearDown(self): # Clean up the working directory diff --git a/tests/pf/test_pf_quadtree_inversion_linear.py b/tests/pf/test_pf_quadtree_inversion_linear.py index c6c7f64d8f..32450621cd 100644 --- a/tests/pf/test_pf_quadtree_inversion_linear.py +++ b/tests/pf/test_pf_quadtree_inversion_linear.py @@ -209,7 +209,7 @@ def create_gravity_sim_active(self, block_value=1.0, noise_floor=0.01): survey=grav_survey, rhoMap=self.idenMap_active, store_sensitivities="ram", - ind_active=self.active_cells, + active_cells=self.active_cells, ) # Already defined @@ -243,7 +243,7 @@ def create_magnetics_sim_active(self, block_value=1.0, noise_floor=0.01): survey=mag_survey, chiMap=self.idenMap_active, store_sensitivities="ram", - ind_active=self.active_cells, + active_cells=self.active_cells, ) # Already defined @@ -291,11 +291,10 @@ def create_inversion(self, sim, data, beta=1e3, all_active=True): invProb = inverse_problem.BaseInvProblem(dmis, reg, opt, beta=beta) # Build directives - IRLS = directives.Update_IRLS( + IRLS = directives.UpdateIRLS( f_min_change=1e-3, max_irls_iterations=30, - beta_tol=1e-1, - beta_search=False, + misfit_tolerance=1e-1, ) sensitivity_weights = directives.UpdateSensitivityWeights() update_Jacobi = directives.UpdatePreconditioner() @@ -421,7 +420,7 @@ def create_xyz_points_flat(x_range, y_range, spacing, altitude=0.0): grav_survey = gravity.Survey(grav_srcField) self.assertRaises( - AttributeError, + ValueError, gravity.SimulationEquivalentSourceLayer, mesh3D, 0.0, @@ -458,7 +457,7 @@ def create_xyz_points_flat(x_range, y_range, spacing, altitude=0.0): -5.0 * np.ones(self.mesh.nC), survey=grav_survey, rhoMap=subset_idenMap, - ind_active=ind_active, + active_cells=ind_active, ) print("Z_TOP OR Z_BOTTOM LENGTH MATCHING NACTIVE-CELLS ERROR TEST PASSED.") diff --git a/tests/pf/test_sensitivity_PFproblem.py b/tests/pf/test_sensitivity_PFproblem.py index eb39c97485..c7f00c03c7 100644 --- a/tests/pf/test_sensitivity_PFproblem.py +++ b/tests/pf/test_sensitivity_PFproblem.py @@ -4,7 +4,6 @@ # #from simpegPF import BaseMag # #import matplotlib.pyplot as plt # import discretize -# from pymatsolver import Pardiso # #import simpeg.PF as PF # from simpeg import maps, utils # from simpeg.potential_fields import magnetics as mag @@ -49,7 +48,6 @@ # M, # survey=self.survey, # muMap=maps.ChiMap(M), -# solver=Pardiso, # ) # dpre = self.sim.dpred(chi) # @@ -79,7 +77,7 @@ # # d_mu = mu*0.8 # derChk = lambda m: [MfmuI(m), lambda mx: dMfmuI(self.chi, mx)] -# passed = Tests.check_derivative(derChk, mu, num=4, dx = d_mu, plotIt=False) +# passed = Tests.check_derivative(derChk, mu, num=4, dx = d_mu, plotIt=False, random_seed=0) # # self.assertTrue(passed) # @@ -121,7 +119,7 @@ # # d_chi = self.chi*0.8 # derChk = lambda m: [Cm_A(m), lambda mx: dCdm_A(self.chi, mx)] -# passed = Tests.check_derivative(derChk, self.chi, num=4, dx = d_chi, plotIt=False) +# passed = Tests.check_derivative(derChk, self.chi, num=4, dx = d_chi, plotIt=False, random_seed=0) # self.assertTrue(passed) # # @@ -169,7 +167,7 @@ # # d_chi = self.chi*0.8 # derChk = lambda m: [Cm_RHS(m), lambda mx: dCdm_RHS(self.chi, mx)] -# passed = Tests.check_derivative(derChk, self.chi, num=4, dx = d_chi, plotIt=False) +# passed = Tests.check_derivative(derChk, self.chi, num=4, dx = d_chi, plotIt=False, random_seed=0) # self.assertTrue(passed) # # @@ -218,7 +216,7 @@ # # # derChk = lambda m: [ufun(m), lambda mx: dudm(self.chi, mx)] # # # TODO: I am not sure why the order get worse as step decreases .. --; -# # passed = Tests.check_derivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False) +# # passed = Tests.check_derivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False, random_seed=0) # # self.assertTrue(passed) # # @@ -270,7 +268,7 @@ # # # derChk = lambda m: [Bfun(m), lambda mx: dBdm(self.chi, mx)] # # # TODO: I am not sure why the order get worse as step decreases .. --; -# # passed = Tests.check_derivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False) +# # passed = Tests.check_derivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False, random_seed=0) # # self.assertTrue(passed) # # @@ -284,7 +282,7 @@ # # derChk = lambda m: (self.survey.dpred(m), lambda v: self.prob.Jvec(m, v)) # # TODO: I am not sure why the order get worse as step decreases .. --; -# passed = Tests.check_derivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False) +# passed = Tests.check_derivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False, random_seed=0) # self.assertTrue(passed) # # def test_Jtvec(self): @@ -300,7 +298,7 @@ # return misfit, dmisfit # # # TODO: I am not sure why the order get worse as step decreases .. --; -# passed = Tests.check_derivative(misfit, self.chi, num=4, plotIt=False) +# passed = Tests.check_derivative(misfit, self.chi, num=4, plotIt=False, random_seed=0) # self.assertTrue(passed) # # if __name__ == '__main__': diff --git a/tests/seis/test_tomo.py b/tests/seis/test_tomo.py index e7125d70fa..d9aca46768 100644 --- a/tests/seis/test_tomo.py +++ b/tests/seis/test_tomo.py @@ -1,9 +1,14 @@ +import re + import numpy as np import unittest import discretize +import pytest + from simpeg.seismic import straight_ray_tomography as tomo from simpeg import tests, maps, utils +from simpeg.seismic.straight_ray_tomography.simulation import Simulation2DIntegral TOL = 1e-5 FLR = 1e-14 @@ -35,7 +40,29 @@ def test_deriv(self): def fun(x): return self.problem.dpred(x), lambda x: self.problem.Jvec(s, x) - return tests.check_derivative(fun, s, num=4, plotIt=False, eps=FLR) + return tests.check_derivative( + fun, s, num=4, plotIt=False, eps=FLR, random_seed=664 + ) + + +def test_required_mesh_arg(): + msg = ".*missing 1 required positional argument: 'mesh'" + with pytest.raises(TypeError, match=msg): + Simulation2DIntegral() + + +def test_bad_mesh_type(): + mesh = discretize.CylindricalMesh([3, 3, 3]) + msg = "mesh must be an instance of TensorMesh, not CylindricalMesh" + with pytest.raises(TypeError, match=msg): + Simulation2DIntegral(mesh) + + +def test_bad_mesh_dim(): + mesh = discretize.TensorMesh([3, 3, 3]) + msg = re.escape("Simulation2DIntegral mesh must be 2D, received a 3D mesh.") + with pytest.raises(ValueError, match=msg): + Simulation2DIntegral(mesh) if __name__ == "__main__": diff --git a/tests/utils/test_default_solver.py b/tests/utils/test_default_solver.py new file mode 100644 index 0000000000..e8e2fc3ba1 --- /dev/null +++ b/tests/utils/test_default_solver.py @@ -0,0 +1,56 @@ +import warnings +import pytest +from pymatsolver import SolverCG + +from simpeg.utils.solver_utils import ( + get_default_solver, + set_default_solver, + DefaultSolverWarning, +) + + +@pytest.fixture(autouse=True) +def reset_default_solver(): + # This should get automatically used + initial_default = get_default_solver() + yield + set_default_solver(initial_default) + + +def test_default_setting(): + set_default_solver(SolverCG) + new_default = get_default_solver() + assert new_default == SolverCG + + +def test_default_error(): + class Temp: + pass + + with pytest.warns(DefaultSolverWarning): + initial_default = get_default_solver(warn=True) + + with pytest.raises( + TypeError, + match="Default solver must be a subclass of pymatsolver.solvers.Base.", + ): + set_default_solver(Temp) + + with pytest.warns(DefaultSolverWarning): + after_default = get_default_solver(warn=True) + + # make sure we didn't accidentally set the default. + assert initial_default == after_default + + +def test_warning(): + """Test if warning is raised when warn=True.""" + with pytest.warns(DefaultSolverWarning, match="Using the default solver"): + get_default_solver(warn=True) + + +def test_no_warning(): + """Test if no warning is issued with default parameters.""" + with warnings.catch_warnings(): + warnings.simplefilter("error") # raise error if warning was raised + get_default_solver() diff --git a/tests/utils/test_io_utils.py b/tests/utils/test_io_utils.py index 105ade7451..ef6fc2d473 100644 --- a/tests/utils/test_io_utils.py +++ b/tests/utils/test_io_utils.py @@ -400,8 +400,8 @@ def setUp(self): pp_sources.append(dc.sources.Pole(pp_receivers, a_loc)) dpdp_sources.append(dc.sources.Dipole(dpdp_receivers, a_loc, b_loc)) - self.pp_survey = dc.survey.Survey(pp_sources, survey_type="pole-pole") - self.dpdp_survey = dc.survey.Survey(dpdp_sources, survey_type="dipole-dipole") + self.pp_survey = dc.survey.Survey(pp_sources) + self.dpdp_survey = dc.survey.Survey(dpdp_sources) # Define data and uncertainties. In this case nD = 6 n_data = len(xa) * len(xm) diff --git a/tests/utils/test_mat_utils.py b/tests/utils/test_mat_utils.py index 5d85f51804..c194cfc61b 100644 --- a/tests/utils/test_mat_utils.py +++ b/tests/utils/test_mat_utils.py @@ -1,7 +1,9 @@ +import pytest import unittest import numpy as np from scipy.sparse.linalg import eigsh from discretize import TensorMesh +from simpeg.objective_function import BaseObjectiveFunction from simpeg import simulation, data_misfit from simpeg.maps import IdentityMap from simpeg.regularization import WeightedLeastSquares @@ -51,6 +53,7 @@ def g(k): relative_error=relative_error, noise_floor=noise_floor, add_noise=True, + random_seed=40, ) dmis = data_misfit.L2DataMisfit(simulation=sim, data=data_obj) self.dmis = dmis @@ -79,7 +82,7 @@ def test_dm_eigenvalue_by_power_iteration(self): field = self.dmis.simulation.fields(self.true_model) max_eigenvalue_numpy, _ = eigsh(dmis_matrix, k=1) max_eigenvalue_directive = eigenvalue_by_power_iteration( - self.dmis, self.true_model, fields_list=field, n_pw_iter=30, seed=42 + self.dmis, self.true_model, fields_list=field, n_pw_iter=30, random_seed=42 ) passed = np.isclose(max_eigenvalue_numpy, max_eigenvalue_directive, rtol=1e-2) self.assertTrue(passed, True) @@ -92,7 +95,7 @@ def test_dm_eigenvalue_by_power_iteration(self): dmiscombo_matrix = 2 * self.G.T.dot(WtW.dot(self.G)) max_eigenvalue_numpy, _ = eigsh(dmiscombo_matrix, k=1) max_eigenvalue_directive = eigenvalue_by_power_iteration( - self.dmiscombo, self.true_model, n_pw_iter=30, seed=42 + self.dmiscombo, self.true_model, n_pw_iter=30, random_seed=42 ) passed = np.isclose(max_eigenvalue_numpy, max_eigenvalue_directive, rtol=1e-2) self.assertTrue(passed, True) @@ -102,7 +105,7 @@ def test_reg_eigenvalue_by_power_iteration(self): reg_maxtrix = self.reg.deriv2(self.true_model) max_eigenvalue_numpy, _ = eigsh(reg_maxtrix, k=1) max_eigenvalue_directive = eigenvalue_by_power_iteration( - self.reg, self.true_model, n_pw_iter=100, seed=42 + self.reg, self.true_model, n_pw_iter=100, random_seed=42 ) passed = np.isclose(max_eigenvalue_numpy, max_eigenvalue_directive, rtol=1e-2) self.assertTrue(passed, True) @@ -114,12 +117,72 @@ def test_combo_eigenvalue_by_power_iteration(self): combo_matrix = dmis_matrix + self.beta * reg_maxtrix max_eigenvalue_numpy, _ = eigsh(combo_matrix, k=1) max_eigenvalue_directive = eigenvalue_by_power_iteration( - self.mixcombo, self.true_model, n_pw_iter=100, seed=42 + self.mixcombo, self.true_model, n_pw_iter=100, random_seed=42 ) passed = np.isclose(max_eigenvalue_numpy, max_eigenvalue_directive, rtol=1e-2) self.assertTrue(passed, True) print("Eigenvalue Utils for a mixed ComboObjectiveFunction is validated.") +class TestDeprecatedSeed: + """Test deprecation of ``seed`` argument.""" + + @pytest.fixture + def mock_objfun(self): + """ + Mock objective function class as child of ``BaseObjectiveFunction`` + """ + + class MockObjectiveFunction(BaseObjectiveFunction): + + def deriv2(self, m, v=None, **kwargs): + return np.ones(self.nP) + + return MockObjectiveFunction + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def test_warning_argument(self, mock_objfun): + """ + Test if warning is raised after passing ``seed``. + """ + msg = self.get_message_deprecated_warning("seed", "random_seed") + n_params = 5 + combo = mock_objfun(nP=n_params) + 3.0 * mock_objfun(nP=n_params) + model = np.ones(n_params) + with pytest.warns(FutureWarning, match=msg): + result_seed = eigenvalue_by_power_iteration( + combo_objfct=combo, model=model, seed=42 + ) + # Ensure that using `seed` and `random_seed` generate the same output + result_random_seed = eigenvalue_by_power_iteration( + combo_objfct=combo, model=model, random_seed=42 + ) + np.testing.assert_allclose(result_seed, result_random_seed) + + def test_error_duplicated_argument(self): + """ + Test error after passing ``seed`` and ``random_seed``. + """ + msg = self.get_message_duplicated_error("seed", "random_seed") + with pytest.raises(TypeError, match=msg): + eigenvalue_by_power_iteration( + combo_objfct=None, model=None, random_seed=42, seed=42 + ) + + if __name__ == "__main__": unittest.main() diff --git a/tests/utils/test_model_builder.py b/tests/utils/test_model_builder.py new file mode 100644 index 0000000000..d35d5901dc --- /dev/null +++ b/tests/utils/test_model_builder.py @@ -0,0 +1,60 @@ +""" +Test functions in model_builder. +""" + +import pytest +import numpy as np +from simpeg.utils.model_builder import create_random_model + + +class TestDeprecateSeedProperty: + """ + Test deprecation of seed property. + """ + + def get_message_duplicated_error(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"Cannot pass both '{new_name}' and '{old_name}'." + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + def get_message_deprecated_warning(self, old_name, new_name, version="v0.24.0"): + msg = ( + f"'{old_name}' has been deprecated and will be removed in " + f" SimPEG {version}, please use '{new_name}' instead." + ) + return msg + + @pytest.fixture + def shape(self): + return (5, 5) + + def test_warning_argument(self, shape): + """ + Test if warning is raised after passing ``seed`` as argument. + """ + msg = self.get_message_deprecated_warning("seed", "random_seed") + seed = 42135 + with pytest.warns(FutureWarning, match=msg): + result = create_random_model(shape, seed=seed) + np.testing.assert_allclose(result, create_random_model(shape, random_seed=seed)) + + def test_error_duplicated_argument(self, shape): + """ + Test error after passing ``seed`` and ``random_seed`` as arguments. + """ + msg = self.get_message_duplicated_error("seed", "random_seed") + with pytest.raises(TypeError, match=msg): + create_random_model(shape, seed=42, random_seed=42) + + def test_error_invalid_kwarg(self, shape): + """ + Test error after passing invalid kwargs to the function. + """ + kwargs = {"foo": 1, "bar": 2} + msg = "Invalid arguments 'foo', 'bar'." + with pytest.raises(TypeError, match=msg): + with pytest.warns(FutureWarning): + create_random_model(shape, seed=10, **kwargs) diff --git a/tests/utils/test_report.py b/tests/utils/test_report.py index 828d06ec3f..2f38f361c5 100644 --- a/tests/utils/test_report.py +++ b/tests/utils/test_report.py @@ -15,11 +15,9 @@ def test_version_defaults(self): "pymatsolver", "numpy", "scipy", - "sklearn", "matplotlib", - "empymod", "geoana", - "pandas", + "libdlf", ], # Optional packages. optional=[ @@ -27,6 +25,8 @@ def test_version_defaults(self): "pydiso", "numba", "dask", + "sklearn", + "pandas", "sympy", "IPython", "ipywidgets", diff --git a/tests/utils/test_solverwrap.py b/tests/utils/test_solverwrap.py deleted file mode 100644 index 126f4466ee..0000000000 --- a/tests/utils/test_solverwrap.py +++ /dev/null @@ -1,64 +0,0 @@ -import unittest -from simpeg.utils.solver_utils import Solver, SolverLU, SolverCG, SolverBiCG, SolverDiag -import scipy.sparse as sp -import numpy as np - - -class TestSolve(unittest.TestCase): - def setUp(self): - # Create a random matrix - n = 400 - A = sp.random(n, n, density=0.25) - - self.n = n - self.A = 0.5 * (A + A.T) + n * sp.eye(n) - - def test_Solver(self): - x = np.random.rand(self.n) - b = self.A @ x - - with self.assertWarns(Warning): - Ainv = Solver(self.A, bad_kwarg=312) - x2 = Ainv @ b - np.testing.assert_almost_equal(x, x2) - - def test_SolverLU(self): - x = np.random.rand(self.n) - b = self.A @ x - - with self.assertWarns(Warning): - Ainv = SolverLU(self.A, bad_kwarg=312) - x2 = Ainv @ b - np.testing.assert_almost_equal(x, x2) - - def test_SolverCG(self): - x = np.random.rand(self.n) - b = self.A @ x - - with self.assertWarns(Warning): - Ainv = SolverCG(self.A, bad_kwarg=312) - x2 = Ainv @ b - np.testing.assert_almost_equal(x, x2, decimal=4) - - def test_SolverBiCG(self): - x = np.random.rand(self.n) - b = self.A @ x - - with self.assertWarns(Warning): - Ainv = SolverBiCG(self.A, bad_kwarg=312) - x2 = Ainv @ b - np.testing.assert_almost_equal(x, x2, decimal=4) - - def test_SolverDiag(self): - x = np.random.rand(self.n) - A = sp.diags(np.random.randn(self.n)) - b = A @ x - - with self.assertWarns(Warning): - Ainv = SolverDiag(A, bad_kwarg=312) - x2 = Ainv @ b - np.testing.assert_almost_equal(x, x2) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/base/test_validators.py b/tests/utils/test_validators.py similarity index 90% rename from tests/base/test_validators.py rename to tests/utils/test_validators.py index 2d2df0eb87..2a6d1bc0dd 100644 --- a/tests/base/test_validators.py +++ b/tests/utils/test_validators.py @@ -223,6 +223,12 @@ def test_ndarray_validation(): assert np.issubdtype(out.dtype, complex) np.testing.assert_equal(out, np.array([3.0j, 4.0j, 5.0j])) + out = validate_ndarray_with_shape( + "array_prop", np.array([3j, 4j, 5j]), dtype=(float, complex) + ) + assert np.issubdtype(out.dtype, complex) + np.testing.assert_equal(out, np.array([3.0j, 4.0j, 5.0j])) + # Valid any shaped arrays assert validate_ndarray_with_shape( "NDarrayProperty", np.random.rand(3, 3, 3), ("*", "*", "*"), float @@ -301,31 +307,66 @@ def test_ndarray_validation(): ) -def test_type_validation(): +def test_type_validation_casting(): # should try to cast to type assert type(validate_type("type_prop", 4.0, int)) == int + # should be okay if only able to cast to one of the possible types + assert type(validate_type("type_prop", "four", (float, str))) == str + + # should error if unable to cast to single type + with pytest.raises(TypeError): + validate_type("type_prop", "four", float) + # isinstance without casting should pass through assert type(validate_type("type_prop", 4.0, object, cast=False)) == float - # should return object without casting if isinstance - assert type(validate_type("type_prop", True, int, cast=False)) == bool + # should error if unable to cast to multiple types + with pytest.raises(TypeError): + validate_type("type_prop", "four", (float, int, complex)) + + +def test_type_validation_strict(): # strict type checking - assert type(validate_type("type_prop", 4.0, float, strict=True)) == float + assert ( + type(validate_type("type_prop", 4.0, float, cast=False, strict=True)) == float + ) - # should error if unable to cast to type - with pytest.raises(TypeError): - validate_type("type_prop", "four", float) + # should ok if strict and is exact of one of the classes + assert ( + type( + validate_type( + "type_prop", True, (int, float, bool), cast=False, strict=True + ) + ) + == bool + ) # should error if strict and not an exact same class with pytest.raises(TypeError): validate_type("type_prop", True, int, cast=False, strict=True) + # should error if strict and not any class + with pytest.raises(TypeError): + validate_type("type_prop", True, (int, float, complex), cast=False, strict=True) + + +def test_type_validation_subclasses(): + + # should return object without casting if isinstance + assert type(validate_type("type_prop", True, int, cast=False)) == bool + + # ok if object without casting isinstance of one of multiple classes + assert type(validate_type("type_prop", True, (int, float, str), cast=False)) == bool + # should error if not strict and not subclass with pytest.raises(TypeError): validate_type("type_prop", True, float, cast=False) + with pytest.raises(TypeError): + validate_type("type_prop", True, (float, complex, str), cast=False) + def test_callable_validation(): def func(x): diff --git a/tutorials/01-models_mapping/plot_1_tensor_models.py b/tutorials/01-models_mapping/plot_1_tensor_models.py index ebcf496e95..d2a06ca020 100644 --- a/tutorials/01-models_mapping/plot_1_tensor_models.py +++ b/tutorials/01-models_mapping/plot_1_tensor_models.py @@ -263,7 +263,9 @@ def make_example_mesh(): # Define the model on subsurface cells model = np.r_[background_value, block_value, xc, dx, yc, dy, zc, dz] -parametric_map = maps.ParametricBlock(mesh, indActive=ind_active, epsilon=1e-10, p=5.0) +parametric_map = maps.ParametricBlock( + mesh, active_cells=ind_active, epsilon=1e-10, p=5.0 +) # Define a single mapping from model to mesh model_map = active_map * parametric_map diff --git a/tutorials/01-models_mapping/plot_2_cyl_models.py b/tutorials/01-models_mapping/plot_2_cyl_models.py index cb118b43f9..89f1ab42d4 100644 --- a/tutorials/01-models_mapping/plot_2_cyl_models.py +++ b/tutorials/01-models_mapping/plot_2_cyl_models.py @@ -161,7 +161,9 @@ def make_example_mesh(): model = np.r_[ background_value, pipe_value, rc, dr, 0.0, 1.0, zc, dz ] # add dummy values for phi -parametric_map = maps.ParametricBlock(mesh, indActive=ind_active, epsilon=1e-10, p=8.0) +parametric_map = maps.ParametricBlock( + mesh, active_cells=ind_active, epsilon=1e-10, p=8.0 +) # Define a single mapping from model to mesh model_map = active_map * parametric_map diff --git a/tutorials/01-models_mapping/plot_3_tree_models.py b/tutorials/01-models_mapping/plot_3_tree_models.py index 2a8549aa6a..252e3ec95d 100644 --- a/tutorials/01-models_mapping/plot_3_tree_models.py +++ b/tutorials/01-models_mapping/plot_3_tree_models.py @@ -279,7 +279,9 @@ def refine_box(mesh): # Define the model on subsurface cells model = np.r_[background_value, block_value, xc, dx, yc, dy, zc, dz] -parametric_map = maps.ParametricBlock(mesh, indActive=ind_active, epsilon=1e-10, p=5.0) +parametric_map = maps.ParametricBlock( + mesh, active_cells=ind_active, epsilon=1e-10, p=5.0 +) # Define a single mapping from model to mesh model_map = active_map * parametric_map diff --git a/tutorials/02-linear_inversion/plot_inv_2_inversion_irls.py b/tutorials/02-linear_inversion/plot_inv_2_inversion_irls.py index 4715d3937b..b835433f55 100644 --- a/tutorials/02-linear_inversion/plot_inv_2_inversion_irls.py +++ b/tutorials/02-linear_inversion/plot_inv_2_inversion_irls.py @@ -174,7 +174,7 @@ def g(k): sensitivity_weights = directives.UpdateSensitivityWeights(every_iteration=False) # Reach target misfit for L2 solution, then use IRLS until model stops changing. -IRLS = directives.Update_IRLS(max_irls_iterations=40, minGNiter=1, f_min_change=1e-4) +IRLS = directives.UpdateIRLS(max_irls_iterations=40, f_min_change=1e-4) # Defining a starting value for the trade-off parameter (beta) between the data # misfit and the regularization. @@ -187,7 +187,13 @@ def g(k): saveDict = directives.SaveOutputEveryIteration(save_txt=False) # Define the directives as a list -directives_list = [sensitivity_weights, IRLS, starting_beta, update_Jacobi, saveDict] +directives_list = [ + sensitivity_weights, + IRLS, + starting_beta, + update_Jacobi, + saveDict, +] ##################################################################### @@ -233,9 +239,13 @@ def g(k): twin = ax.twinx() twin.plot(saveDict.phi_m, "k--", lw=2) -ax.plot(np.r_[IRLS.iterStart, IRLS.iterStart], np.r_[0, np.max(saveDict.phi_d)], "k:") +ax.plot( + np.r_[IRLS.metrics.start_irls_iter, IRLS.metrics.start_irls_iter], + np.r_[0, np.max(saveDict.phi_d)], + "k:", +) ax.text( - IRLS.iterStart, + IRLS.metrics.start_irls_iter, 0.0, "IRLS Start", va="bottom", diff --git a/tutorials/03-gravity/plot_1a_gravity_anomaly.py b/tutorials/03-gravity/plot_1a_gravity_anomaly.py index d2d8aacfd6..25e442ed45 100644 --- a/tutorials/03-gravity/plot_1a_gravity_anomaly.py +++ b/tutorials/03-gravity/plot_1a_gravity_anomaly.py @@ -190,7 +190,7 @@ survey=survey, mesh=mesh, rhoMap=model_map, - ind_active=ind_active, + active_cells=ind_active, store_sensitivities="forward_only", engine="choclo", ) @@ -214,14 +214,22 @@ # Plot fig = plt.figure(figsize=(7, 5)) +v_max = np.max(np.abs(dpred)) + ax1 = fig.add_axes([0.1, 0.1, 0.75, 0.85]) -plot2Ddata(receiver_list[0].locations, dpred, ax=ax1, contourOpts={"cmap": "bwr"}) +plot2Ddata( + receiver_list[0].locations, + dpred, + clim=(-v_max, v_max), + ax=ax1, + contourOpts={"cmap": "bwr"}, +) ax1.set_title("Gravity Anomaly (Z-component)") ax1.set_xlabel("x (m)") ax1.set_ylabel("y (m)") ax2 = fig.add_axes([0.82, 0.1, 0.03, 0.85]) -norm = mpl.colors.Normalize(vmin=-np.max(np.abs(dpred)), vmax=np.max(np.abs(dpred))) +norm = mpl.colors.Normalize(vmin=-v_max, vmax=v_max) cbar = mpl.colorbar.ColorbarBase( ax2, norm=norm, orientation="vertical", cmap=mpl.cm.bwr, format="%.1e" ) diff --git a/tutorials/03-gravity/plot_1b_gravity_gradiometry.py b/tutorials/03-gravity/plot_1b_gravity_gradiometry.py index 84e4227cf3..8bb79ffb17 100644 --- a/tutorials/03-gravity/plot_1b_gravity_gradiometry.py +++ b/tutorials/03-gravity/plot_1b_gravity_gradiometry.py @@ -211,7 +211,7 @@ survey=survey, mesh=mesh, rhoMap=model_map, - ind_active=ind_active, + active_cells=ind_active, store_sensitivities="forward_only", engine="choclo", ) diff --git a/tutorials/03-gravity/plot_inv_1a_gravity_anomaly.py b/tutorials/03-gravity/plot_inv_1a_gravity_anomaly.py index 89d043d65d..27e679db43 100644 --- a/tutorials/03-gravity/plot_inv_1a_gravity_anomaly.py +++ b/tutorials/03-gravity/plot_inv_1a_gravity_anomaly.py @@ -218,7 +218,7 @@ survey=survey, mesh=mesh, rhoMap=model_map, - ind_active=ind_active, + active_cells=ind_active, engine="choclo", ) diff --git a/tutorials/03-gravity/plot_inv_1b_gravity_anomaly_irls.py b/tutorials/03-gravity/plot_inv_1b_gravity_anomaly_irls.py index 7bfd6da31f..322afbd08e 100644 --- a/tutorials/03-gravity/plot_inv_1b_gravity_anomaly_irls.py +++ b/tutorials/03-gravity/plot_inv_1b_gravity_anomaly_irls.py @@ -220,7 +220,7 @@ survey=survey, mesh=mesh, rhoMap=model_map, - ind_active=ind_active, + active_cells=ind_active, engine="choclo", ) @@ -271,13 +271,12 @@ # Defines the directives for the IRLS regularization. This includes setting # the cooling schedule for the trade-off parameter. -update_IRLS = directives.Update_IRLS( +update_IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=30, - coolEpsFact=1.5, - beta_tol=1e-2, + irls_cooling_factor=1.5, + misfit_tolerance=1e-2, ) - # Options for outputting recovered models and predicted data for each beta. save_iteration = directives.SaveOutputEveryIteration(save_txt=False) diff --git a/tutorials/03-gravity/plot_inv_1c_gravity_anomaly_irls_compare_weighting.py b/tutorials/03-gravity/plot_inv_1c_gravity_anomaly_irls_compare_weighting.py new file mode 100644 index 0000000000..2fc2d9210d --- /dev/null +++ b/tutorials/03-gravity/plot_inv_1c_gravity_anomaly_irls_compare_weighting.py @@ -0,0 +1,576 @@ +""" +Compare weighting strategy with Inversion of surface Gravity Anomaly Data +========================================================================= + +Here we invert gravity anomaly data to recover a density contrast model. We formulate the inverse problem as an iteratively +re-weighted least-squares (IRLS) optimization problem. For this tutorial, we +focus on the following: + + - Setting regularization weights + - Defining the survey from xyz formatted data + - Generating a mesh based on survey geometry + - Including surface topography + - Defining the inverse problem (data misfit, regularization, optimization) + - Specifying directives for the inversion + - Setting sparse and blocky norms + - Plotting the recovered model and data misfit + +Although we consider gravity anomaly data in this tutorial, the same approach +can be used to invert gradiometry and other types of geophysical data. +""" + +######################################################################### +# Import modules +# -------------- +# + +import os +import tarfile + +import matplotlib as mpl +import matplotlib.pyplot as plt +import numpy as np +from discretize import TensorMesh +from discretize.utils import active_from_xyz + +from simpeg import ( + data, + data_misfit, + directives, + inverse_problem, + inversion, + maps, + optimization, + regularization, + utils, +) +from simpeg.potential_fields import gravity +from simpeg.utils import model_builder, plot2Ddata + +# sphinx_gallery_thumbnail_number = 3 + +############################################# +# Define File Names +# ----------------- +# +# File paths for assets we are loading. To set up the inversion, we require +# topography and field observations. The true model defined on the whole mesh +# is loaded to compare with the inversion result. These files are stored as a +# tar-file on our google cloud bucket: +# "https://storage.googleapis.com/simpeg/doc-assets/gravity.tar.gz" +# + +# storage bucket where we have the data +data_source = "https://storage.googleapis.com/simpeg/doc-assets/gravity.tar.gz" + +# download the data +downloaded_data = utils.download(data_source, overwrite=True) + +# unzip the tarfile +tar = tarfile.open(downloaded_data, "r") +tar.extractall() +tar.close() + +# path to the directory containing our data +dir_path = downloaded_data.split(".")[0] + os.path.sep + +# files to work with +topo_filename = dir_path + "gravity_topo.txt" +data_filename = dir_path + "gravity_data.obs" + + +############################################# +# Load Data and Plot +# ------------------ +# +# Here we load and plot synthetic gravity anomaly data. Topography is generally +# defined as an (N, 3) array. Gravity data is generally defined with 4 columns: +# x, y, z and data. +# + +# Load topography +xyz_topo = np.loadtxt(str(topo_filename)) + +# Load field data +dobs = np.loadtxt(str(data_filename)) + +# Define receiver locations and observed data +receiver_locations = dobs[:, 0:3] +dobs = dobs[:, -1] + +# Plot +mpl.rcParams.update({"font.size": 12}) +fig = plt.figure(figsize=(7, 5)) + +ax1 = fig.add_axes([0.1, 0.1, 0.73, 0.85]) +plot2Ddata( + receiver_locations, + dobs, + ax=ax1, + contourOpts={"cmap": "bwr"}, + shade=True, + nx=20, + ny=20, + dataloc=True, +) +ax1.set_title("Gravity Anomaly") +ax1.set_xlabel("x (m)") +ax1.set_ylabel("y (m)") + +ax2 = fig.add_axes([0.8, 0.1, 0.03, 0.85]) +norm = mpl.colors.Normalize(vmin=-np.max(np.abs(dobs)), vmax=np.max(np.abs(dobs))) +cbar = mpl.colorbar.ColorbarBase( + ax2, norm=norm, orientation="vertical", cmap=mpl.cm.bwr, format="%.1e" +) +cbar.set_label("$mGal$", rotation=270, labelpad=15, size=12) + +plt.show() + +############################################# +# Assign Uncertainties +# -------------------- +# +# Inversion with simpeg requires that we define the standard deviation of our data. +# This represents our estimate of the noise in our data. For a gravity inversion, +# a constant floor value is generally applied to all data. For this tutorial, +# the standard deviation on each datum will be 1% of the maximum observed +# gravity anomaly value. +# + +maximum_anomaly = np.max(np.abs(dobs)) + +uncertainties = 0.01 * maximum_anomaly * np.ones(np.shape(dobs)) + +############################################# +# Defining the Survey +# ------------------- +# +# Here, we define the survey that will be used for this tutorial. Gravity +# surveys are simple to create. The user only needs an (N, 3) array to define +# the xyz locations of the observation locations. From this, the user can +# define the receivers and the source field. +# + +# Define the receivers. The data consists of vertical gravity anomaly measurements. +# The set of receivers must be defined as a list. +receiver_list = gravity.receivers.Point(receiver_locations, components="gz") + +receiver_list = [receiver_list] + +# Define the source field +source_field = gravity.sources.SourceField(receiver_list=receiver_list) + +# Define the survey +survey = gravity.survey.Survey(source_field) + +############################################# +# Defining the Data +# ----------------- +# +# Here is where we define the data that is inverted. The data is defined by +# the survey, the observation values and the standard deviation. +# + +data_object = data.Data(survey, dobs=dobs, standard_deviation=uncertainties) + + +############################################# +# Defining a Tensor Mesh +# ---------------------- +# +# Here, we create the tensor mesh that will be used to invert gravity anomaly +# data. If desired, we could define an OcTree mesh. +# + +dh = 5.0 +hx = [(dh, 5, -1.3), (dh, 40), (dh, 5, 1.3)] +hy = [(dh, 5, -1.3), (dh, 40), (dh, 5, 1.3)] +hz = [(dh, 5, -1.3), (dh, 15)] +mesh = TensorMesh([hx, hy, hz], "CCN") + +######################################################## +# Starting/Reference Model and Mapping on Tensor Mesh +# --------------------------------------------------- +# +# Here, we create starting and/or reference models for the inversion as +# well as the mapping from the model space to the active cells. Starting and +# reference models can be a constant background value or contain a-priori +# structures. +# + +# Find the indices of the active cells in forward model (ones below surface) +ind_active = active_from_xyz(mesh, xyz_topo) + +# Define mapping from model to active cells +nC = int(ind_active.sum()) +model_map = maps.IdentityMap(nP=nC) # model consists of a value for each active cell + +# Define and plot starting model +starting_model = np.zeros(nC) + + +############################################## +# Define the Physics and data misfit +# ---------------------------------- +# +# Here, we define the physics of the gravity problem by using the simulation +# class. +# + +simulation = gravity.simulation.Simulation3DIntegral( + survey=survey, mesh=mesh, rhoMap=model_map, ind_active=ind_active +) + +# Define the data misfit. Here the data misfit is the L2 norm of the weighted +# residual between the observed data and the data predicted for a given model. +# Within the data misfit, the residual between predicted and observed data are +# normalized by the data's standard deviation. +dmis = data_misfit.L2DataMisfit(data=data_object, simulation=simulation) + + +####################################################################### +# Running the Depth Weighted inversion +# ------------------------------------ +# +# Here we define the directives, weights, regularization, and optimization +# for a depth-weighted inversion +# + +# inversion directives +# Defining a starting value for the trade-off parameter (beta) between the data +# misfit and the regularization. +starting_beta = directives.BetaEstimate_ByEig(beta0_ratio=1e0) + +# Defines the directives for the IRLS regularization. This includes setting +# the cooling schedule for the trade-off parameter. +update_IRLS = directives.Update_IRLS( + f_min_change=1e-4, + max_irls_iterations=30, + coolEpsFact=1.5, + beta_tol=1e-2, +) + +# Options for outputting recovered models and predicted data for each beta. +save_iteration = directives.SaveOutputEveryIteration(save_txt=False) + +# Updating the preconditionner if it is model dependent. +update_jacobi = directives.UpdatePreconditioner() + +# The directives are defined as a list +directives_list = [ + update_IRLS, + starting_beta, + save_iteration, + update_jacobi, +] + +# Define the regularization (model objective function) with depth weighting. +reg_dpth = regularization.Sparse(mesh, active_cells=ind_active, mapping=model_map) +reg_dpth.norms = [0, 2, 2, 2] +depth_weights = utils.depth_weighting( + mesh, receiver_locations, active_cells=ind_active, exponent=2 +) +reg_dpth.set_weights(depth_weights=depth_weights) + +# Define how the optimization problem is solved. Here we will use a projected +# Gauss-Newton approach that employs the conjugate gradient solver. +opt = optimization.ProjectedGNCG( + maxIter=100, lower=-1.0, upper=1.0, maxIterLS=20, maxIterCG=10, tolCG=1e-3 +) + +# Here we define the inverse problem that is to be solved +inv_prob = inverse_problem.BaseInvProblem(dmis, reg_dpth, opt) + +# Here we combine the inverse problem and the set of directives +inv = inversion.BaseInversion(inv_prob, directives_list) + +# Run inversion +recovered_model_dpth = inv.run(starting_model) + +####################################################################### +# Running the Distance Weighted inversion +# --------------------------------------- +# +# Here we define the directives, weights, regularization, and optimization +# for a distance-weighted inversion +# + +# inversion directives +# Defining a starting value for the trade-off parameter (beta) between the data +# misfit and the regularization. +starting_beta = directives.BetaEstimate_ByEig(beta0_ratio=1e0) + +# Defines the directives for the IRLS regularization. This includes setting +# the cooling schedule for the trade-off parameter. +update_IRLS = directives.Update_IRLS( + f_min_change=1e-4, + max_irls_iterations=30, + coolEpsFact=1.5, + beta_tol=1e-2, +) + +# Options for outputting recovered models and predicted data for each beta. +save_iteration = directives.SaveOutputEveryIteration(save_txt=False) + +# Updating the preconditionner if it is model dependent. +update_jacobi = directives.UpdatePreconditioner() + +# The directives are defined as a list +directives_list = [ + update_IRLS, + starting_beta, + save_iteration, + update_jacobi, +] + +# Define the regularization (model objective function) with distance weighting. +reg_dist = regularization.Sparse(mesh, active_cells=ind_active, mapping=model_map) +reg_dist.norms = [0, 2, 2, 2] +distance_weights = utils.distance_weighting( + mesh, receiver_locations, active_cells=ind_active, exponent=2 +) +reg_dist.set_weights(distance_weights=distance_weights) + +# Define how the optimization problem is solved. Here we will use a projected +# Gauss-Newton approach that employs the conjugate gradient solver. +opt = optimization.ProjectedGNCG( + maxIter=100, lower=-1.0, upper=1.0, maxIterLS=20, maxIterCG=10, tolCG=1e-3 +) + +# Here we define the inverse problem that is to be solved +inv_prob = inverse_problem.BaseInvProblem(dmis, reg_dist, opt) + +# Here we combine the inverse problem and the set of directives +inv = inversion.BaseInversion(inv_prob, directives_list) + +# Run inversion +recovered_model_dist = inv.run(starting_model) + +####################################################################### +# Running the Distance Weighted inversion +# --------------------------------------- +# +# Here we define the directives, weights, regularization, and optimization +# for a sensitivity weighted inversion +# + +# inversion directives +# Defining a starting value for the trade-off parameter (beta) between the data +# misfit and the regularization. +starting_beta = directives.BetaEstimate_ByEig(beta0_ratio=1e0) + +# Defines the directives for the IRLS regularization. This includes setting +# the cooling schedule for the trade-off parameter. +update_IRLS = directives.Update_IRLS( + f_min_change=1e-4, + max_irls_iterations=30, + coolEpsFact=1.5, + beta_tol=1e-2, +) + +# Options for outputting recovered models and predicted data for each beta. +save_iteration = directives.SaveOutputEveryIteration(save_txt=False) + +# Updating the preconditionner if it is model dependent. +update_jacobi = directives.UpdatePreconditioner() + +# Add sensitivity weights +sensitivity_weights = directives.UpdateSensitivityWeights(every_iteration=False) + +# The directives are defined as a list +directives_list = [ + update_IRLS, + sensitivity_weights, + starting_beta, + save_iteration, + update_jacobi, +] + +# Define the regularization (model objective function) for sensitivity weighting. +reg_sensw = regularization.Sparse(mesh, active_cells=ind_active, mapping=model_map) +reg_sensw.norms = [0, 2, 2, 2] + +# Define how the optimization problem is solved. Here we will use a projected +# Gauss-Newton approach that employs the conjugate gradient solver. +opt = optimization.ProjectedGNCG( + maxIter=100, lower=-1.0, upper=1.0, maxIterLS=20, maxIterCG=10, tolCG=1e-3 +) + +# Here we define the inverse problem that is to be solved +inv_prob = inverse_problem.BaseInvProblem(dmis, reg_sensw, opt) + +# Here we combine the inverse problem and the set of directives +inv = inversion.BaseInversion(inv_prob, directives_list) + +# Run inversion +recovered_model_sensw = inv.run(starting_model) + +############################################################ +# Recreate True Model +# ------------------- +# + +# Define density contrast values for each unit in g/cc +background_density = 0.0 +block_density = -0.2 +sphere_density = 0.2 + +# Define model. Models in simpeg are vector arrays. +true_model = background_density * np.ones(nC) + +# You could find the indicies of specific cells within the model and change their +# value to add structures. +ind_block = ( + (mesh.gridCC[ind_active, 0] > -50.0) + & (mesh.gridCC[ind_active, 0] < -20.0) + & (mesh.gridCC[ind_active, 1] > -15.0) + & (mesh.gridCC[ind_active, 1] < 15.0) + & (mesh.gridCC[ind_active, 2] > -50.0) + & (mesh.gridCC[ind_active, 2] < -30.0) +) +true_model[ind_block] = block_density + +# You can also use simpeg utilities to add structures to the model more concisely +ind_sphere = model_builder.get_indices_sphere( + np.r_[35.0, 0.0, -40.0], 15.0, mesh.gridCC +) +ind_sphere = ind_sphere[ind_active] +true_model[ind_sphere] = sphere_density + + +############################################################ +# Plotting True Model and Recovered Models +# ---------------------------------------- +# + +# Plot Models +fig, ax = plt.subplots(2, 2, figsize=(20, 10), sharex=True, sharey=True) +ax = ax.flatten() +plotting_map = maps.InjectActiveCells(mesh, ind_active, np.nan) +cmap = "coolwarm" +slice_y_loc = 0.0 + +mm = mesh.plot_slice( + plotting_map * true_model, + normal="Y", + ax=ax[0], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap, "norm": norm}, +) +ax[0].set_title(f"True model slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="$g/cm^3$", ax=ax[0]) + +# plot depth weighting result +vmax = np.abs(recovered_model_dpth).max() +norm = mpl.colors.TwoSlopeNorm(vcenter=0, vmin=-vmax, vmax=vmax) +mm = mesh.plot_slice( + plotting_map * recovered_model_dpth, + normal="Y", + ax=ax[1], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap, "norm": norm}, +) +ax[1].set_title(f"Depth weighting Model slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="$g/cm^3$", ax=ax[1]) + +# plot distance weighting result +vmax = np.abs(recovered_model_dist).max() +norm = mpl.colors.TwoSlopeNorm(vcenter=0, vmin=-vmax, vmax=vmax) +mm = mesh.plot_slice( + plotting_map * recovered_model_dist, + normal="Y", + ax=ax[2], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap, "norm": norm}, +) +ax[2].set_title(f"Distance weighting Model slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="$g/cm^3$", ax=ax[2]) + +# plot sensitivity weighting result +vmax = np.abs(recovered_model_sensw).max() +norm = mpl.colors.TwoSlopeNorm(vcenter=0, vmin=-vmax, vmax=vmax) +mm = mesh.plot_slice( + plotting_map * recovered_model_sensw, + normal="Y", + ax=ax[3], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap, "norm": norm}, +) +ax[3].set_title(f"Sensitivity weighting Model slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="$g/cm^3$", ax=ax[3]) + +# shared plotting +plotting_map = maps.InjectActiveCells(mesh, ind_active, 0.0) +slice_y_ind = ( + mesh.cell_centers[:, 1] == np.abs(mesh.cell_centers[:, 1] - slice_y_loc).min() +) +for axx in ax: + utils.plot2Ddata( + mesh.cell_centers[slice_y_ind][:, [0, 2]], + (plotting_map * true_model)[slice_y_ind], + contourOpts={"alpha": 0}, + level=True, + ncontour=2, + levelOpts={"colors": "grey", "linewidths": 2, "linestyles": "--"}, + method="nearest", + ax=axx, + ) + axx.set_aspect(1) + +plt.tight_layout() + +############################################################ +# Visualize weights +# ----------------- +# +# Plot Weights +fig, ax = plt.subplots(1, 3, figsize=(20, 4), sharex=True, sharey=True) +plotting_map = maps.InjectActiveCells(mesh, ind_active, np.nan) +cmap = "magma" +slice_y_loc = 0.0 + +# plot depth weights +mm = mesh.plot_slice( + plotting_map * np.log10(depth_weights), + normal="Y", + ax=ax[0], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap}, +) +ax[0].set_title(f"log10(depth weights) slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="log10(depth weights)", ax=ax[0]) + +# plot distance weights +mm = mesh.plot_slice( + plotting_map * np.log10(distance_weights), + normal="Y", + ax=ax[1], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap}, +) +ax[1].set_title(f"log10(distance weights) slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="log10(distance weights)", ax=ax[1]) + +# plot sensitivity weights +mm = mesh.plot_slice( + plotting_map * np.log10(reg_sensw.objfcts[0].get_weights(key="sensitivity")), + normal="Y", + ax=ax[2], + grid=False, + slice_loc=slice_y_loc, + pcolor_opts={"cmap": cmap}, +) +ax[2].set_title(f"log10(sensitivity weights) slice at y = {slice_y_loc} m") +plt.colorbar(mm[0], label="log10(sensitivity weights)", ax=ax[2]) + +# shared plotting +for axx in ax: + axx.set_aspect(1) + +plt.tight_layout() diff --git a/tutorials/04-magnetics/plot_2a_magnetics_induced.py b/tutorials/04-magnetics/plot_2a_magnetics_induced.py index 67889ba62a..9f3ece6ae3 100644 --- a/tutorials/04-magnetics/plot_2a_magnetics_induced.py +++ b/tutorials/04-magnetics/plot_2a_magnetics_induced.py @@ -178,7 +178,7 @@ mesh=mesh, model_type="scalar", chiMap=model_map, - ind_active=ind_active, + active_cells=ind_active, store_sensitivities="forward_only", engine="choclo", ) diff --git a/tutorials/04-magnetics/plot_2b_magnetics_mvi.py b/tutorials/04-magnetics/plot_2b_magnetics_mvi.py index 70c9621221..51c5610f5b 100644 --- a/tutorials/04-magnetics/plot_2b_magnetics_mvi.py +++ b/tutorials/04-magnetics/plot_2b_magnetics_mvi.py @@ -233,7 +233,7 @@ survey=survey, mesh=mesh, chiMap=model_map, - ind_active=ind_active, + active_cells=ind_active, model_type="vector", store_sensitivities="forward_only", ) diff --git a/tutorials/04-magnetics/plot_inv_2a_magnetics_induced.py b/tutorials/04-magnetics/plot_inv_2a_magnetics_induced.py index 92ab0691e0..61eeae9497 100644 --- a/tutorials/04-magnetics/plot_inv_2a_magnetics_induced.py +++ b/tutorials/04-magnetics/plot_inv_2a_magnetics_induced.py @@ -237,7 +237,7 @@ mesh=mesh, model_type="scalar", chiMap=model_map, - ind_active=active_cells, + active_cells=active_cells, engine="choclo", ) @@ -307,11 +307,11 @@ # Defines the directives for the IRLS regularization. This includes setting # the cooling schedule for the trade-off parameter. -update_IRLS = directives.Update_IRLS( +update_IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=30, - coolEpsFact=1.5, - beta_tol=1e-2, + cooling_factor=1.5, + misfit_tolerance=1e-2, ) # Updating the preconditioner if it is model dependent. diff --git a/tutorials/05-dcr/plot_fwd_2_dcr2d.py b/tutorials/05-dcr/plot_fwd_2_dcr2d.py index 8095504f90..89f0556cb8 100644 --- a/tutorials/05-dcr/plot_fwd_2_dcr2d.py +++ b/tutorials/05-dcr/plot_fwd_2_dcr2d.py @@ -40,10 +40,6 @@ import matplotlib.pyplot as plt from matplotlib.colors import LogNorm -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver write_output = False mpl.rcParams.update({"font.size": 16}) @@ -102,7 +98,7 @@ ) # Define survey -survey = dc.survey.Survey(source_list, survey_type=survey_type) +survey = dc.survey.Survey(source_list) ############################################################### # Create Tree Mesh @@ -233,7 +229,7 @@ # simulation = dc.simulation_2d.Simulation2DNodal( - mesh, survey=survey, sigmaMap=conductivity_map, solver=Solver + mesh, survey=survey, sigmaMap=conductivity_map ) # Predict the data by running the simulation. The data are the raw voltage in diff --git a/tutorials/05-dcr/plot_fwd_3_dcr3d.py b/tutorials/05-dcr/plot_fwd_3_dcr3d.py index ea7293d267..b6ee498bde 100644 --- a/tutorials/05-dcr/plot_fwd_3_dcr3d.py +++ b/tutorials/05-dcr/plot_fwd_3_dcr3d.py @@ -54,10 +54,6 @@ has_plotly = False pass -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver mpl.rcParams.update({"font.size": 16}) write_output = False @@ -257,7 +253,9 @@ # Define the DC simulation simulation = dc.simulation.Simulation3DNodal( - mesh, survey=survey, sigmaMap=conductivity_map, solver=Solver + mesh, + survey=survey, + sigmaMap=conductivity_map, ) # Predict the data by running the simulation. The data are the measured voltage diff --git a/tutorials/05-dcr/plot_inv_1_dcr_sounding_irls.py b/tutorials/05-dcr/plot_inv_1_dcr_sounding_irls.py index f461b716dd..a9e751bbb4 100644 --- a/tutorials/05-dcr/plot_inv_1_dcr_sounding_irls.py +++ b/tutorials/05-dcr/plot_inv_1_dcr_sounding_irls.py @@ -255,7 +255,7 @@ update_sensitivity_weights = directives.UpdateSensitivityWeights() # Reach target misfit for L2 solution, then use IRLS until model stops changing. -IRLS = directives.Update_IRLS(max_irls_iterations=40, minGNiter=1, f_min_change=1e-5) +IRLS = directives.UpdateIRLS(max_irls_iterations=40, f_min_change=1e-5) # Defining a starting value for the trade-off parameter (beta) between the data # misfit and the regularization. diff --git a/tutorials/05-dcr/plot_inv_2_dcr2d.py b/tutorials/05-dcr/plot_inv_2_dcr2d.py index f28bb8d26d..063ccedc70 100644 --- a/tutorials/05-dcr/plot_inv_2_dcr2d.py +++ b/tutorials/05-dcr/plot_inv_2_dcr2d.py @@ -48,10 +48,6 @@ ) from simpeg.utils.io_utils.io_utils_electromagnetics import read_dcip2d_ubc -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver mpl.rcParams.update({"font.size": 16}) # sphinx_gallery_thumbnail_number = 4 @@ -262,7 +258,7 @@ # Define the problem. Define the cells below topography and the mapping simulation = dc.simulation_2d.Simulation2DNodal( - mesh, survey=survey, sigmaMap=conductivity_map, solver=Solver, storeJ=True + mesh, survey=survey, sigmaMap=conductivity_map, storeJ=True ) ####################################################################### @@ -371,7 +367,7 @@ ind_resistor = model_builder.get_indices_sphere(np.r_[120.0, -180.0], 60.0, mesh.gridCC) true_conductivity_model[ind_resistor] = true_resistor_conductivity -true_conductivity_model[~ind_active] = np.NaN +true_conductivity_model[~ind_active] = np.nan ############################################################ # Plotting True and Recovered Conductivity Model @@ -402,7 +398,7 @@ fig = plt.figure(figsize=(9, 4)) recovered_conductivity = conductivity_map * recovered_conductivity_model -recovered_conductivity[~ind_active] = np.NaN +recovered_conductivity[~ind_active] = np.nan ax1 = fig.add_axes([0.14, 0.17, 0.68, 0.7]) mesh.plot_image( diff --git a/tutorials/05-dcr/plot_inv_2_dcr2d_irls.py b/tutorials/05-dcr/plot_inv_2_dcr2d_irls.py index f84891fb15..d030b52a0f 100644 --- a/tutorials/05-dcr/plot_inv_2_dcr2d_irls.py +++ b/tutorials/05-dcr/plot_inv_2_dcr2d_irls.py @@ -49,11 +49,6 @@ ) from simpeg.utils.io_utils.io_utils_electromagnetics import read_dcip2d_ubc -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - mpl.rcParams.update({"font.size": 16}) # sphinx_gallery_thumbnail_number = 3 @@ -268,7 +263,7 @@ # Define the problem. Define the cells below topography and the mapping simulation = dc.simulation_2d.Simulation2DNodal( - mesh, survey=survey, sigmaMap=conductivity_map, solver=Solver, storeJ=True + mesh, survey=survey, sigmaMap=conductivity_map, storeJ=True ) ####################################################################### @@ -332,9 +327,7 @@ update_sensitivity_weighting = directives.UpdateSensitivityWeights() # Reach target misfit for L2 solution, then use IRLS until model stops changing. -update_IRLS = directives.Update_IRLS( - max_irls_iterations=25, minGNiter=1, chifact_start=1.0 -) +update_IRLS = directives.UpdateIRLS(max_irls_iterations=25, chifact_start=1.0) # Defining a starting value for the trade-off parameter (beta) between the data # misfit and the regularization. @@ -387,7 +380,7 @@ ind_resistor = model_builder.get_indices_sphere(np.r_[120.0, -180.0], 60.0, mesh.gridCC) true_conductivity_model[ind_resistor] = true_resistor_conductivity -true_conductivity_model[~ind_active] = np.NaN +true_conductivity_model[~ind_active] = np.nan ############################################################ # Plotting True and Recovered Conductivity Model @@ -396,10 +389,10 @@ # Get L2 and sparse recovered model in base 10 l2_conductivity = conductivity_map * inv_prob.l2model -l2_conductivity[~ind_active] = np.NaN +l2_conductivity[~ind_active] = np.nan recovered_conductivity = conductivity_map * recovered_conductivity_model -recovered_conductivity[~ind_active] = np.NaN +recovered_conductivity[~ind_active] = np.nan # Plot True Model norm = LogNorm(vmin=1e-3, vmax=1e-1) diff --git a/tutorials/05-dcr/plot_inv_3_dcr3d.py b/tutorials/05-dcr/plot_inv_3_dcr3d.py index 4ca93a6106..60675957c9 100644 --- a/tutorials/05-dcr/plot_inv_3_dcr3d.py +++ b/tutorials/05-dcr/plot_inv_3_dcr3d.py @@ -61,10 +61,6 @@ has_plotly = False pass -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver mpl.rcParams.update({"font.size": 16}) @@ -275,7 +271,7 @@ # dc_simulation = dc.simulation.Simulation3DNodal( - mesh, survey=dc_survey, sigmaMap=conductivity_map, solver=Solver, storeJ=True + mesh, survey=dc_survey, sigmaMap=conductivity_map, storeJ=True ) ################################################################# diff --git a/tutorials/06-ip/plot_fwd_2_dcip2d.py b/tutorials/06-ip/plot_fwd_2_dcip2d.py index 4e1add360e..4c89e6bf83 100644 --- a/tutorials/06-ip/plot_fwd_2_dcip2d.py +++ b/tutorials/06-ip/plot_fwd_2_dcip2d.py @@ -49,11 +49,6 @@ import matplotlib.pyplot as plt from matplotlib.colors import LogNorm -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - mpl.rcParams.update({"font.size": 16}) write_output = False @@ -245,9 +240,7 @@ # argument *rhoMap* is defined, the simulation will expect a resistivity model. # -dc_simulation = dc.Simulation2DNodal( - mesh, survey=dc_survey, sigmaMap=conductivity_map, solver=Solver -) +dc_simulation = dc.Simulation2DNodal(mesh, survey=dc_survey, sigmaMap=conductivity_map) # Predict the data by running the simulation. The data are the raw voltage in # units of volts. @@ -320,7 +313,7 @@ ) # Define survey -ip_survey = ip.survey.Survey(source_list, survey_type=survey_type) +ip_survey = ip.survey.Survey(source_list) # Drape over discrete topography ip_survey.drape_electrodes_on_topography(mesh, ind_active, option="top") @@ -397,7 +390,6 @@ survey=ip_survey, etaMap=chargeability_map, sigma=conductivity_map * conductivity_model, - solver=Solver, ) # Run forward simulation and predicted IP data. The data are the voltage (V) diff --git a/tutorials/06-ip/plot_fwd_3_dcip3d.py b/tutorials/06-ip/plot_fwd_3_dcip3d.py index dc5a07db96..3a6f1a2ff7 100644 --- a/tutorials/06-ip/plot_fwd_3_dcip3d.py +++ b/tutorials/06-ip/plot_fwd_3_dcip3d.py @@ -57,10 +57,6 @@ has_plotly = False pass -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver mpl.rcParams.update({"font.size": 16}) write_output = False @@ -262,9 +258,7 @@ # # Define the DC simulation -dc_simulation = dc.Simulation3DNodal( - mesh, survey=dc_survey, sigmaMap=conductivity_map, solver=Solver -) +dc_simulation = dc.Simulation3DNodal(mesh, survey=dc_survey, sigmaMap=conductivity_map) # Predict the data by running the simulation. The data are the measured voltage # normalized by the source current in units of V/A. @@ -360,7 +354,7 @@ ) # Define survey -ip_survey = ip.survey.Survey(source_list, survey_type=survey_type) +ip_survey = ip.survey.Survey(source_list) # Drape to discretized topography as before ip_survey.drape_electrodes_on_topography(mesh, ind_active, option="top") @@ -439,7 +433,6 @@ survey=ip_survey, etaMap=chargeability_map, sigma=conductivity_map * conductivity_model, - solver=Solver, ) # Run forward simulation and predicted IP data. The data are the voltage (V) diff --git a/tutorials/06-ip/plot_inv_2_dcip2d.py b/tutorials/06-ip/plot_inv_2_dcip2d.py index 72cf5c2639..ccf1aba74e 100644 --- a/tutorials/06-ip/plot_inv_2_dcip2d.py +++ b/tutorials/06-ip/plot_inv_2_dcip2d.py @@ -54,10 +54,6 @@ ) from simpeg.utils.io_utils.io_utils_electromagnetics import read_dcip2d_ubc -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver mpl.rcParams.update({"font.size": 16}) # sphinx_gallery_thumbnail_number = 7 @@ -280,7 +276,7 @@ # Define the problem. Define the cells below topography and the mapping dc_simulation = dc.Simulation2DNodal( - mesh, survey=dc_survey, sigmaMap=conductivity_map, solver=Solver, storeJ=True + mesh, survey=dc_survey, sigmaMap=conductivity_map, storeJ=True ) ####################################################################### @@ -395,7 +391,7 @@ ind_resistor = model_builder.get_indices_sphere(np.r_[120.0, -180.0], 60.0, mesh.gridCC) true_conductivity_model[ind_resistor] = true_resistor_conductivity -true_conductivity_model[~ind_active] = np.NaN +true_conductivity_model[~ind_active] = np.nan # Plot True Model norm = LogNorm(vmin=1e-3, vmax=1e-1) @@ -421,7 +417,7 @@ fig = plt.figure(figsize=(9, 4)) recovered_conductivity = conductivity_map * recovered_conductivity_model -recovered_conductivity[~ind_active] = np.NaN +recovered_conductivity[~ind_active] = np.nan ax1 = fig.add_axes([0.14, 0.17, 0.68, 0.7]) mesh.plot_image( @@ -519,7 +515,6 @@ survey=ip_survey, etaMap=chargeability_map, sigma=conductivity_map * recovered_conductivity_model, - solver=Solver, storeJ=True, ) @@ -601,10 +596,10 @@ true_chargeability_model = np.zeros(len(mesh)) true_chargeability_model[ind_conductor] = sphere_chargeability -true_chargeability_model[~ind_active] = np.NaN +true_chargeability_model[~ind_active] = np.nan recovered_chargeability = chargeability_map * recovered_chargeability_model -recovered_chargeability[~ind_active] = np.NaN +recovered_chargeability[~ind_active] = np.nan # Plot True Model fig = plt.figure(figsize=(9, 4)) diff --git a/tutorials/06-ip/plot_inv_3_dcip3d.py b/tutorials/06-ip/plot_inv_3_dcip3d.py index 94b4cd9407..bde2f90ed2 100644 --- a/tutorials/06-ip/plot_inv_3_dcip3d.py +++ b/tutorials/06-ip/plot_inv_3_dcip3d.py @@ -63,11 +63,6 @@ has_plotly = False pass -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - mpl.rcParams.update({"font.size": 16}) # sphinx_gallery_thumbnail_number = 7 @@ -323,7 +318,7 @@ # dc_simulation = dc.Simulation3DNodal( - mesh, survey=dc_survey, sigmaMap=conductivity_map, solver=Solver, storeJ=True + mesh, survey=dc_survey, sigmaMap=conductivity_map, storeJ=True ) ################################################################# @@ -591,7 +586,6 @@ survey=ip_survey, etaMap=chargeability_map, sigma=conductivity_map * recovered_conductivity_model, - solver=Solver, storeJ=True, ) diff --git a/tutorials/07-fdem/plot_fwd_2_fem_cyl.py b/tutorials/07-fdem/plot_fwd_2_fem_cyl.py index 9bace19d92..450db8f27c 100644 --- a/tutorials/07-fdem/plot_fwd_2_fem_cyl.py +++ b/tutorials/07-fdem/plot_fwd_2_fem_cyl.py @@ -34,11 +34,6 @@ import matplotlib as mpl import matplotlib.pyplot as plt -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - write_file = False # sphinx_gallery_thumbnail_number = 2 @@ -184,7 +179,9 @@ # simulation = fdem.simulation.Simulation3DMagneticFluxDensity( - mesh, survey=survey, sigmaMap=model_map, solver=Solver + mesh, + survey=survey, + sigmaMap=model_map, ) ###################################################### diff --git a/tutorials/07-fdem/plot_fwd_3_fem_3d.py b/tutorials/07-fdem/plot_fwd_3_fem_3d.py index f49bb96056..b7c4345257 100644 --- a/tutorials/07-fdem/plot_fwd_3_fem_3d.py +++ b/tutorials/07-fdem/plot_fwd_3_fem_3d.py @@ -40,10 +40,6 @@ import matplotlib as mpl import matplotlib.pyplot as plt -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver save_file = False @@ -224,7 +220,7 @@ # simulation = fdem.simulation.Simulation3DMagneticFluxDensity( - mesh, survey=survey, sigmaMap=model_map, solver=Solver + mesh, survey=survey, sigmaMap=model_map ) ###################################################### diff --git a/tutorials/07-fdem/plot_inv_1_em1dfm.py b/tutorials/07-fdem/plot_inv_1_em1dfm.py index f5e5366765..17a2564cee 100644 --- a/tutorials/07-fdem/plot_inv_1_em1dfm.py +++ b/tutorials/07-fdem/plot_inv_1_em1dfm.py @@ -270,9 +270,7 @@ save_iteration = directives.SaveOutputEveryIteration(save_txt=False) # Directive for the IRLS -update_IRLS = directives.Update_IRLS( - max_irls_iterations=30, minGNiter=1, coolEpsFact=1.5, update_beta=True -) +update_IRLS = directives.UpdateIRLS(max_irls_iterations=30, irls_cooling_factor=1.5) # Updating the preconditionner if it is model dependent. update_jacobi = directives.UpdatePreconditioner() diff --git a/tutorials/08-tdem/plot_fwd_2_tem_cyl.py b/tutorials/08-tdem/plot_fwd_2_tem_cyl.py index f3b81c0361..fe6da5d38c 100644 --- a/tutorials/08-tdem/plot_fwd_2_tem_cyl.py +++ b/tutorials/08-tdem/plot_fwd_2_tem_cyl.py @@ -36,11 +36,6 @@ import matplotlib as mpl import matplotlib.pyplot as plt -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - write_file = False # sphinx_gallery_thumbnail_number = 2 @@ -204,7 +199,7 @@ # simulation = tdem.simulation.Simulation3DMagneticFluxDensity( - mesh, survey=survey, sigmaMap=model_map, solver=Solver + mesh, survey=survey, sigmaMap=model_map ) # Set the time-stepping for the simulation diff --git a/tutorials/08-tdem/plot_fwd_3_tem_3d.py b/tutorials/08-tdem/plot_fwd_3_tem_3d.py index 9b9aecbf79..ab7423170a 100644 --- a/tutorials/08-tdem/plot_fwd_3_tem_3d.py +++ b/tutorials/08-tdem/plot_fwd_3_tem_3d.py @@ -40,10 +40,6 @@ import matplotlib.pyplot as plt import os -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver save_file = False @@ -284,7 +280,7 @@ # simulation = tdem.simulation.Simulation3DMagneticFluxDensity( - mesh, survey=survey, sigmaMap=model_map, solver=Solver, t0=-0.002 + mesh, survey=survey, sigmaMap=model_map, t0=-0.002 ) # Set the time-stepping for the simulation diff --git a/tutorials/08-tdem/plot_inv_1_em1dtm.py b/tutorials/08-tdem/plot_inv_1_em1dtm.py index e0dcede58a..2c2cfc7d4c 100644 --- a/tutorials/08-tdem/plot_inv_1_em1dtm.py +++ b/tutorials/08-tdem/plot_inv_1_em1dtm.py @@ -250,7 +250,7 @@ # Defining a starting value for the trade-off parameter (beta) between the data # misfit and the regularization. -starting_beta = directives.BetaEstimate_ByEig(beta0_ratio=1e1) +starting_beta = directives.BetaEstimate_ByEig(beta0_ratio=1e2) # Update the preconditionner update_Jacobi = directives.UpdatePreconditioner() @@ -259,9 +259,7 @@ save_iteration = directives.SaveOutputEveryIteration(save_txt=False) # Directives for the IRLS -update_IRLS = directives.Update_IRLS( - max_irls_iterations=30, minGNiter=1, coolEpsFact=1.5, update_beta=True -) +update_IRLS = directives.UpdateIRLS(max_irls_iterations=30, irls_cooling_factor=1.5) # Updating the preconditionner if it is model dependent. update_jacobi = directives.UpdatePreconditioner() diff --git a/tutorials/10-vrm/plot_fwd_1_vrm_layer.py b/tutorials/10-vrm/plot_fwd_1_vrm_layer.py index b783113a15..4553ce56b1 100644 --- a/tutorials/10-vrm/plot_fwd_1_vrm_layer.py +++ b/tutorials/10-vrm/plot_fwd_1_vrm_layer.py @@ -173,7 +173,7 @@ simulation = vrm.Simulation3DLinear( mesh, survey=survey, - indActive=ind_active, + active_cells=ind_active, refinement_factor=2, refinement_distance=[2.0, 4.0], ) diff --git a/tutorials/10-vrm/plot_fwd_2_vrm_topsoil.py b/tutorials/10-vrm/plot_fwd_2_vrm_topsoil.py index a1a60bec98..6f2857eb77 100644 --- a/tutorials/10-vrm/plot_fwd_2_vrm_topsoil.py +++ b/tutorials/10-vrm/plot_fwd_2_vrm_topsoil.py @@ -228,7 +228,7 @@ simulation = vrm.Simulation3DLinear( mesh, survey=survey, - indActive=ind_active, + active_cells=ind_active, refinement_factor=2, refinement_distance=[2.0, 4.0], ) diff --git a/tutorials/10-vrm/plot_fwd_3_vrm_tem.py b/tutorials/10-vrm/plot_fwd_3_vrm_tem.py index fece2a72ec..0d7adc2f5f 100644 --- a/tutorials/10-vrm/plot_fwd_3_vrm_tem.py +++ b/tutorials/10-vrm/plot_fwd_3_vrm_tem.py @@ -39,11 +39,6 @@ import matplotlib.pyplot as plt import matplotlib as mpl -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - # sphinx_gallery_thumbnail_number = 3 ################################################################### @@ -156,7 +151,9 @@ time_steps = [(5e-06, 20), (0.0001, 20), (0.001, 21)] tdem_simulation = tdem.simulation.Simulation3DMagneticFluxDensity( - mesh, survey=tdem_survey, sigmaMap=model_map, solver=Solver + mesh, + survey=tdem_survey, + sigmaMap=model_map, ) tdem_simulation.time_steps = time_steps @@ -256,7 +253,7 @@ vrm_simulation = vrm.Simulation3DLogUniform( mesh, survey=vrm_survey, - indActive=ind_active, + active_cells=ind_active, refinement_factor=1, refinement_distance=[100.0], chi0=chi0_model, diff --git a/tutorials/12-seismic/plot_inv_1_tomography_2D.py b/tutorials/12-seismic/plot_inv_1_tomography_2D.py index 896def24fd..b60ce62ad6 100644 --- a/tutorials/12-seismic/plot_inv_1_tomography_2D.py +++ b/tutorials/12-seismic/plot_inv_1_tomography_2D.py @@ -240,11 +240,11 @@ # # Reach target misfit for L2 solution, then use IRLS until model stops changing. -update_IRLS = directives.Update_IRLS( +update_IRLS = directives.UpdateIRLS( f_min_change=1e-4, max_irls_iterations=30, - coolEpsFact=1.5, - beta_tol=1e-2, + irls_cooling_factor=1.5, + misfit_tolerance=1e-2, ) # Defining a starting value for the trade-off parameter (beta) between the data diff --git a/tutorials/13-joint_inversion/plot_inv_3_cross_gradient_pf.py b/tutorials/13-joint_inversion/plot_inv_3_cross_gradient_pf.py index 951807633a..e7d6fd3843 100755 --- a/tutorials/13-joint_inversion/plot_inv_3_cross_gradient_pf.py +++ b/tutorials/13-joint_inversion/plot_inv_3_cross_gradient_pf.py @@ -288,7 +288,7 @@ survey=survey_grav, mesh=mesh, rhoMap=wires.density, - ind_active=ind_active, + active_cells=ind_active, engine="choclo", ) @@ -297,7 +297,7 @@ mesh=mesh, model_type="scalar", chiMap=wires.susceptibility, - ind_active=ind_active, + active_cells=ind_active, ) @@ -418,10 +418,10 @@ # values on active cells. true_model_dens = np.loadtxt(dir_path + "true_model_dens.txt") -true_model_dens[~ind_active] = np.NaN +true_model_dens[~ind_active] = np.nan true_model_susc = np.loadtxt(dir_path + "true_model_susc.txt") -true_model_susc[~ind_active] = np.NaN +true_model_susc[~ind_active] = np.nan # Plot True Model fig = plt.figure(figsize=(9, 8)) diff --git a/tutorials/14-pgi/plot_inv_1_joint_pf_pgi_full_info_tutorial.py b/tutorials/14-pgi/plot_inv_1_joint_pf_pgi_full_info_tutorial.py index d4a1e3cc13..7c4170f81f 100644 --- a/tutorials/14-pgi/plot_inv_1_joint_pf_pgi_full_info_tutorial.py +++ b/tutorials/14-pgi/plot_inv_1_joint_pf_pgi_full_info_tutorial.py @@ -233,7 +233,7 @@ survey=data_grav.survey, mesh=mesh, rhoMap=wires.den, - ind_active=actv, + active_cells=actv, engine="choclo", ) dmis_grav = data_misfit.L2DataMisfit(data=data_grav, simulation=simulation_grav) @@ -242,7 +242,7 @@ survey=data_mag.survey, mesh=mesh, chiMap=wires.sus, - ind_active=actv, + active_cells=actv, ) dmis_mag = data_misfit.L2DataMisfit(data=data_mag, simulation=simulation_mag) diff --git a/tutorials/14-pgi/plot_inv_2_joint_pf_pgi_no_info_tutorial.py b/tutorials/14-pgi/plot_inv_2_joint_pf_pgi_no_info_tutorial.py index 78582411f1..1c14dbf021 100644 --- a/tutorials/14-pgi/plot_inv_2_joint_pf_pgi_no_info_tutorial.py +++ b/tutorials/14-pgi/plot_inv_2_joint_pf_pgi_no_info_tutorial.py @@ -234,7 +234,7 @@ survey=data_grav.survey, mesh=mesh, rhoMap=wires.den, - ind_active=actv, + active_cells=actv, engine="choclo", ) dmis_grav = data_misfit.L2DataMisfit(data=data_grav, simulation=simulation_grav) @@ -243,7 +243,7 @@ survey=data_mag.survey, mesh=mesh, chiMap=wires.sus, - ind_active=actv, + active_cells=actv, ) dmis_mag = data_misfit.L2DataMisfit(data=data_mag, simulation=simulation_mag) diff --git a/tutorials/_temporary/plot_4c_fdem3d_inversion.py b/tutorials/_temporary/plot_4c_fdem3d_inversion.py index c035e10caf..86633314b3 100644 --- a/tutorials/_temporary/plot_4c_fdem3d_inversion.py +++ b/tutorials/_temporary/plot_4c_fdem3d_inversion.py @@ -46,11 +46,6 @@ utils, ) -try: - from pymatsolver import Pardiso as Solver -except ImportError: - from simpeg import SolverLU as Solver - # sphinx_gallery_thumbnail_number = 3 ############################################# @@ -289,7 +284,9 @@ # simulation = fdem.simulation.Simulation3DMagneticFluxDensity( - mesh, survey=survey, sigmaMap=model_map, Solver=Solver + mesh, + survey=survey, + sigmaMap=model_map, ) diff --git a/tutorials/_temporary/plot_fwd_1_em1dtm_stitched_skytem.py b/tutorials/_temporary/plot_fwd_1_em1dtm_stitched_skytem.py index f4694830de..85a9b66fb8 100644 --- a/tutorials/_temporary/plot_fwd_1_em1dtm_stitched_skytem.py +++ b/tutorials/_temporary/plot_fwd_1_em1dtm_stitched_skytem.py @@ -18,7 +18,6 @@ import matplotlib as mpl from matplotlib import pyplot as plt from discretize import TensorMesh -from pymatsolver import PardisoSolver from simpeg import maps from simpeg.utils import mkvc @@ -265,7 +264,6 @@ def PolygonInd(mesh, pts): parallel=False, n_cpu=2, verbose=True, - Solver=PardisoSolver, ) # simulation.model = sounding_models diff --git a/tutorials/_temporary/plot_inv_1_em1dtm_stitched_skytem.py b/tutorials/_temporary/plot_inv_1_em1dtm_stitched_skytem.py index 936b238b3c..cfdfc04a4c 100644 --- a/tutorials/_temporary/plot_inv_1_em1dtm_stitched_skytem.py +++ b/tutorials/_temporary/plot_inv_1_em1dtm_stitched_skytem.py @@ -18,7 +18,6 @@ import matplotlib as mpl from matplotlib import pyplot as plt from discretize import TensorMesh -from pymatsolver import PardisoSolver from simpeg.utils import mkvc from simpeg import ( @@ -224,12 +223,11 @@ thicknesses=thicknesses, sigmaMap=mapping, topo=topo, - Solver=PardisoSolver, ) # simulation = em1d.simulation.StitchedEM1DTMSimulation( # survey=survey, thicknesses=thicknesses, sigmaMap=mapping, -# topo=topo, parallel=True, n_cpu=4, verbose=True, Solver=PardisoSolver +# topo=topo, parallel=True, n_cpu=4, verbose=True # ) @@ -308,7 +306,7 @@ # IRLS = directives.Update_IRLS(max_irls_iterations=40, minGNiter=1, f_min_change=1e-5, chifact_start=2) # IRLS = directives.Update_IRLS( # max_irls_iterations=20, minGNiter=1, fix_Jmatrix=True, coolingRate=2, -# beta_tol=1e-2, f_min_change=1e-5, +# misfit_tolerance=1e-2, f_min_change=1e-5, # chifact_start = 1. # ) @@ -326,14 +324,12 @@ save_iteration = directives.SaveOutputEveryIteration(save_txt=False) -update_IRLS = directives.Update_IRLS( +update_IRLS = directives.UpdateIRLS( max_irls_iterations=20, - minGNiter=1, - fix_Jmatrix=True, f_min_change=1e-3, - coolingRate=3, ) + # Updating the preconditionner if it is model dependent. update_jacobi = directives.UpdatePreconditioner() @@ -347,13 +343,10 @@ # The directives are defined as a list. directives_list = [ - # sensitivity_weights, starting_beta, - beta_schedule, save_iteration, - # target_misfit, update_IRLS, - # update_jacobi, + beta_schedule, ] #####################################################################