diff --git a/.github/actions/run-benchmarks/action.yml b/.github/actions/run-benchmarks/action.yml new file mode 100644 index 000000000..2d24521f3 --- /dev/null +++ b/.github/actions/run-benchmarks/action.yml @@ -0,0 +1,188 @@ +name: Run VMEC++ benchmarks +description: > + Install VMEC++ and run the benchmark suites in a fixed environment, then store + or compare the results. Two suites run here: the Python pytest end-to-end + benchmarks and the C++ Google Benchmark function-level microbenchmarks. This is + the single source of truth for the benchmark environment so the pull-request + and main/docs runs cannot drift apart; the only intended difference between + callers is whether results are written back to the benchmark-runs branch + (auto-push) and whether a regression is commented on the PR (comment-on-alert). + +inputs: + auto-push: + description: "Push results to the benchmark-runs branch (main/docs run)." + default: "false" + comment-on-alert: + description: "Comment on the PR when a regression exceeds the alert threshold." + default: "false" + github-token: + description: "Token used to push results and/or comment on alerts." + required: true + +runs: + using: composite + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install system dependencies + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y build-essential cmake libnetcdf-dev liblapack-dev libomp-dev libhdf5-dev + + - name: Mount bazel cache + uses: actions/cache@v4 + with: + path: "~/.cache/bazel" + key: bazel-bench + + - name: Install vmecpp with benchmark dependencies + shell: bash + run: | + pip install uv + uv pip install --system -v .[benchmark] + + # --- Python end-to-end benchmarks (pytest-benchmark) --- + + - name: Run Python benchmarks + shell: bash + run: | + export OMP_WAIT_POLICY=passive + pytest benchmarks/test_benchmarks.py --benchmark-json=benchmark_results.json + + # github-action-benchmark's "pytest" tool always plots pytest-benchmark's + # `ops` field as iter/sec, but the C++ suite emits seconds. + # We convert both to the same format, so plotting is the same. + - name: Convert Python benchmark result to seconds + shell: bash + run: | + python3 benchmarks/to_seconds_json.py pytest benchmark_results.json benchmark_results_seconds.json + + - name: Store / compare Python benchmark result + # Skip the result upload/compare for fork PRs: their GITHUB_TOKEN is + # read-only, so comment-on-alert/auto-push hit 'Resource not accessible + # by integration'. The benchmarks still run above; only the write-back is + # skipped for forks. Main/docs runs (auto-push) always store. + if: ${{ inputs.auto-push == 'true' || github.event.pull_request.head.repo.full_name == github.repository }} + uses: benchmark-action/github-action-benchmark@v1.21.0 + with: + tool: "customSmallerIsBetter" + output-file-path: benchmark_results_seconds.json + gh-pages-branch: benchmark-runs + benchmark-data-dir-path: benchmarks + alert-threshold: "150%" + fail-on-alert: false + auto-push: ${{ inputs.auto-push }} + comment-on-alert: ${{ inputs.comment-on-alert }} + github-token: ${{ inputs.github-token }} + + # --- C++ function-level microbenchmarks (Google Benchmark) --- + # + # Builds the four benchmark cc_binary targets, runs each with + # --benchmark_format=json, and merges their output into a single + # cpp_benchmark_results.json (schema: {"context": ..., "benchmarks": [...]}) + # for the conversion step below. Entries with "error_occurred" (e.g. an + # FFT-path benchmark skipped because no FFTX codelet exists for that + # resolution) are dropped: they carry no valid timing to track. + + - name: Run C++ microbenchmarks + shell: bash + run: | + set -euo pipefail + + TARGETS=( + "//vmecpp/vmec/ideal_mhd_model:fft_toroidal_bench" + "//vmecpp/vmec/ideal_mhd_model:dealias_constraint_force_bench" + "//vmecpp/free_boundary/laplace_solver:laplace_solver_bench" + "//vmecpp/vmec/output_quantities:output_quantities_bench" + ) + + OUT_FILE="${GITHUB_WORKSPACE}/cpp_benchmark_results.json" + TMP_DIR="$(mktemp -d)" + trap 'rm -rf "${TMP_DIR}"' EXIT + + cd src/vmecpp/cpp + + # --config=perf: optimized build with frame pointers and symbols + # retained, matching the existing .bazelrc convention for + # performance work. + bazel build --config=perf -- "${TARGETS[@]}" + + # Run each target. `bazel run` so runfiles (e.g. test_data for the + # output-quantities benchmark) are available in the working + # directory. --benchmark_min_time keeps CI runtime bounded while + # still averaging enough iterations for a stable measurement. + for target in "${TARGETS[@]}"; do + name="${target##*:}" + bazel run --config=perf -- "${target}" \ + --benchmark_min_time=0.2s \ + --benchmark_format=json \ + --benchmark_out="${TMP_DIR}/${name}.json" + done + + python3 - "${TMP_DIR}" "${OUT_FILE}" <<'PY' + import glob + import json + import os + import sys + + tmp_dir, out_file = sys.argv[1], sys.argv[2] + merged = {"context": None, "benchmarks": []} + skipped = 0 + for path in sorted(glob.glob(os.path.join(tmp_dir, "*.json"))): + with open(path) as f: + data = json.load(f) + if merged["context"] is None: + merged["context"] = data.get("context") + for bench in data.get("benchmarks", []): + if bench.get("error_occurred"): + skipped += 1 + continue + merged["benchmarks"].append(bench) + + with open(out_file, "w") as f: + json.dump(merged, f, indent=2) + + print(f"Merged {len(merged['benchmarks'])} benchmark entries " + f"({skipped} skipped/errored).") + PY + + # github-action-benchmark's "pytest" tool always plots pytest-benchmark's + # `ops` field as iter/sec, but the C++ suite emits seconds. + # We convert both to the same format, so plotting is the same. + - name: Convert C++ benchmark result to seconds + shell: bash + run: | + python3 benchmarks/to_seconds_json.py googlecpp cpp_benchmark_results.json cpp_benchmark_results_seconds.json + + - name: Store / compare C++ benchmark result + # Same fork-PR skip rationale as the Python store step above. + # + # Runs sequentially after the Python store step (composite-action steps + # are serial), so the two auto-push writes to benchmark-runs never race. + # A distinct suite name keeps the C++ results under their own key in + # data.js (window.BENCHMARK_DATA.entries) so they never overwrite the + # Python "Benchmark" suite, even though both share benchmark-data-dir-path. + # + # skip-fetch-gh-pages: the Python store step above already fetched the + # benchmark-runs branch into a local ref and (in compare mode) advanced + # it, so a second `git fetch benchmark-runs:benchmark-runs` here is + # rejected as non-fast-forward. Reuse the already-fetched local ref + # instead of re-fetching. + if: ${{ inputs.auto-push == 'true' || github.event.pull_request.head.repo.full_name == github.repository }} + uses: benchmark-action/github-action-benchmark@v1.21.0 + with: + name: "C++ Microbenchmarks" + tool: "customSmallerIsBetter" + output-file-path: cpp_benchmark_results_seconds.json + gh-pages-branch: benchmark-runs + benchmark-data-dir-path: benchmarks + skip-fetch-gh-pages: true + alert-threshold: "150%" + fail-on-alert: false + auto-push: ${{ inputs.auto-push }} + comment-on-alert: ${{ inputs.comment-on-alert }} + github-token: ${{ inputs.github-token }} diff --git a/.github/workflows/benchmarks.yaml b/.github/workflows/benchmarks.yaml index 54326ec6a..5bd06fa2a 100644 --- a/.github/workflows/benchmarks.yaml +++ b/.github/workflows/benchmarks.yaml @@ -15,40 +15,11 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: Install system dependencies - run: | - sudo apt-get update - sudo apt-get install -y build-essential cmake libnetcdf-dev liblapack-dev libomp-dev libhdf5-dev - - - name: Install vmecpp with benchmark dependencies - run: | - pip install uv - uv pip install --system -v .[benchmark] - + # Shared environment + run; PR runs compare and comment but never write + # back (auto-push stays false). - name: Run benchmarks - run: | - export OMP_WAIT_POLICY=active - pytest benchmarks/test_benchmarks.py --benchmark-json=benchmark_results.json - - - name: Compare benchmark result - # Skip the result upload/compare for fork PRs: their GITHUB_TOKEN is - # read-only, so comment-on-alert/auto-push hit 'Resource not accessible - # by integration'. The benchmarks still run above; only the write-back - # is skipped for forks. - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository - uses: benchmark-action/github-action-benchmark@v1.21.0 + uses: ./.github/actions/run-benchmarks with: - tool: "pytest" - output-file-path: benchmark_results.json - gh-pages-branch: benchmark-runs - benchmark-data-dir-path: benchmarks - auto-push: false - comment-on-alert: true - alert-threshold: "150%" - fail-on-alert: false + auto-push: "false" + comment-on-alert: "true" github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/clang_tidy.yaml b/.github/workflows/clang_tidy.yaml index 4297a6164..72d944cd7 100644 --- a/.github/workflows/clang_tidy.yaml +++ b/.github/workflows/clang_tidy.yaml @@ -31,9 +31,11 @@ jobs: apt_packages: libhdf5-dev, liblapack-dev, libnetcdf-dev, gfortran, python3-dev, libomp-dev build_dir: build cmake_command: cmake -B build && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:STRING=ON build - # bazel-built test files have no cmake compile_commands entry, so - # clang-tidy cannot resolve ; exclude them from review - exclude: "./src/vmecpp/cpp/bazel-*,./src/vmecpp/cpp/external,./src/vmecpp/cpp/third_party,*_test.cc" + # bazel-built test and benchmark files have no cmake compile_commands + # entry, so clang-tidy cannot resolve / + # (both are Bazel-only deps); exclude them + # from review + exclude: "./src/vmecpp/cpp/bazel-*,./src/vmecpp/cpp/external,./src/vmecpp/cpp/third_party,*_test.cc,*_bench.cc" # turn off "LGTM" comments: we only want pings about warnings/errors lgtm_comment_body: "" # If there are any comments, fail the check diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index a61d8f697..3d589de5f 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -24,36 +24,13 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: Install system dependencies - run: | - sudo apt-get update - sudo apt-get install -y build-essential cmake libnetcdf-dev liblapack-dev libomp-dev libhdf5-dev - - - name: Install vmecpp with benchmark dependencies - run: | - pip install uv - uv pip install --system -v .[benchmark] - + # Shared environment + run; main/docs runs write results back to the + # benchmark-runs branch (auto-push) so they become the PR baseline. - name: Run benchmarks - run: | - pytest benchmarks/test_benchmarks.py --benchmark-json=benchmark_results.json - - - name: Store benchmark result - uses: benchmark-action/github-action-benchmark@v1.21.0 + uses: ./.github/actions/run-benchmarks with: - tool: "pytest" - output-file-path: benchmark_results.json - gh-pages-branch: benchmark-runs - benchmark-data-dir-path: benchmarks - alert-threshold: "150%" - fail-on-alert: false + auto-push: "true" github-token: ${{ secrets.GITHUB_TOKEN }} - auto-push: true build-docs: if: always() diff --git a/.github/workflows/full_validation.yaml b/.github/workflows/full_validation.yaml new file mode 100644 index 000000000..c378dc018 --- /dev/null +++ b/.github/workflows/full_validation.yaml @@ -0,0 +1,70 @@ +name: Full V&V against reference VMEC + +# Runs the full Verification & Validation suite from proximafusion/vmecpp-validation +# (all ~219 input configurations against reference Fortran VMEC2000), using the +# vmecpp version built from this commit rather than the version pinned on PyPI/GitHub. +# This is a lot more exhaustive (and slower) than the "short" validation that +# vmecpp-validation itself runs on its own PRs, so it is not run on every push here. +on: + workflow_dispatch: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref || github.run_id }} + cancel-in-progress: ${{ github.ref_name != 'main' }} + +jobs: + full-validation: + name: Run full VMEC++ validation + runs-on: ubuntu-22.04 + # The full parameter scan runs ~219 configurations, each computing a reference + # wout with Fortran VMEC2000 in Docker plus one with VMEC++: budget generously. + timeout-minutes: 360 + steps: + - name: Check out VMEC++ + uses: actions/checkout@v4 + with: + path: vmecpp + lfs: true + + - name: Check out vmecpp-validation + uses: actions/checkout@v4 + with: + repository: proximafusion/vmecpp-validation + path: vmecpp-validation + lfs: true + + - uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install required system packages for Ubuntu + run: | + sudo apt-get update && sudo apt-get install -y \ + build-essential cmake libnetcdf-dev liblapack-dev liblapacke-dev libopenmpi-dev \ + libomp-dev libeigen3-dev nlohmann-json3-dev libhdf5-dev + + - name: Install vmecpp-validation's Python requirements + run: | + cd vmecpp-validation + # Install everything except vmecpp itself: we build and install vmecpp + # from this commit below instead of the version pinned in requirements.txt. + grep -v '^vmecpp@' requirements.txt > requirements.no-vmecpp.txt + python -m pip install -r requirements.no-vmecpp.txt + + - name: Install VMEC++ from this commit + run: python -m pip install ./vmecpp + + - name: Run full validation + working-directory: vmecpp-validation + run: python validate_vmec.py + + - name: Upload V&V results + if: always() + uses: actions/upload-artifact@v4 + with: + name: vnvresults + path: vmecpp-validation/vnvresults_*/ + retention-days: 30 diff --git a/.github/workflows/test_bazel.yaml b/.github/workflows/test_bazel.yaml index 37d70c0fe..215dd65bc 100644 --- a/.github/workflows/test_bazel.yaml +++ b/.github/workflows/test_bazel.yaml @@ -35,15 +35,6 @@ jobs: run: | cd src/vmecpp/cpp bazel build --config=${{ matrix.config }} -- //... - - uses: actions/checkout@v4 - with: - repository: proximafusion/vmecpp_large_cpp_tests - path: src/vmecpp/cpp/vmecpp_large_cpp_tests - lfs: true - - name: Build VMEC++ C++ tests via bazel - run: | - cd src/vmecpp/cpp - bazel build --config=${{ matrix.config }} -- //vmecpp_large_cpp_tests/... - name: Run full C++ test suite run: | cd src/vmecpp/cpp diff --git a/.github/workflows/test_bazel_tsan.yaml b/.github/workflows/test_bazel_tsan.yaml index ef1107df7..d806ca6c6 100644 --- a/.github/workflows/test_bazel_tsan.yaml +++ b/.github/workflows/test_bazel_tsan.yaml @@ -39,11 +39,6 @@ jobs: IMAGE=ghcr.io/${{ github.repository_owner }}/vmecpp-tsan:latest docker pull "${IMAGE,,}" docker tag "${IMAGE,,}" proximafusion/tsan - - uses: actions/checkout@v4 - with: - repository: proximafusion/vmecpp_large_cpp_tests - path: src/vmecpp/cpp/vmecpp_large_cpp_tests - lfs: true - name: Mount bazel cache uses: actions/cache@v4 with: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 0f68ab6e9..6607cb90b 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -90,11 +90,6 @@ jobs: else python -m pip install -v .[test] fi - - name: Checkout large-tests inputs for the input-consistency test - uses: actions/checkout@v4 - with: - repository: proximafusion/vmecpp_large_cpp_tests - path: src/vmecpp/cpp/vmecpp_large_cpp_tests - name: Test package run: python -m pytest tests/ - name: Test docstring examples diff --git a/.gitignore b/.gitignore index 01140211f..35d0d897e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,4 @@ src/vmecpp/__about__.py bazel-* src/vmecpp/cpp/_vmecpp.so -# developers will clone this in order to have the full test suite available -src/vmecpp/cpp/vmecpp_large_cpp_tests/ wout_solovev.nc diff --git a/README.md b/README.md index 840b4649e..18cc7eefe 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ [![CI](https://github.com/proximafusion/vmecpp/actions/workflows/tests.yaml/badge.svg)](https://github.com/proximafusion/vmecpp/actions/workflows/tests.yaml) [![C++ core tests](https://github.com/proximafusion/vmecpp/actions/workflows/test_bazel.yaml/badge.svg)](https://github.com/proximafusion/vmecpp/actions/workflows/test_bazel.yaml) +[![Full V&V against reference VMEC](https://github.com/proximafusion/vmecpp/actions/workflows/full_validation.yaml/badge.svg)](https://github.com/proximafusion/vmecpp/actions/workflows/full_validation.yaml) [![Publish wheels to PyPI](https://github.com/proximafusion/vmecpp/actions/workflows/pypi_publish.yml/badge.svg)](https://github.com/proximafusion/vmecpp/actions/workflows/pypi_publish.yml) VMEC++ is a Python-friendly, from-scratch reimplementation in C++ of the Variational Moments Equilibrium Code (VMEC), @@ -301,13 +302,24 @@ hot_restarted_output = vmecpp.run(input, restart_from=output) ## Full tests and validation against the reference Fortran VMEC v8.52 When developing the C++ core, it's advisable to locally run the full C++ tests for debugging or to validate changes before submitting them. -The full tests are not stored in the sources of this repo, but in a separate repo: https://github.com/proximafusion/vmecpp_large_cpp_tests . -See the instructions there for how to run those tests locally. The CI of this repo includes those tests too. +The full C++ tests live in [`src/vmecpp/cpp/vmecpp_large_cpp_tests`](https://github.com/proximafusion/vmecpp/blob/main/src/vmecpp/cpp/vmecpp_large_cpp_tests) and use [Git LFS](https://git-lfs.com/) for large test data files. +To run them locally (after cloning with `git lfs pull` to fetch the LFS objects): + +```shell +cd src/vmecpp/cpp +bazel test --config=opt //vmecpp/... //vmecpp_large_cpp_tests/... +``` + +The CI of this repo runs these tests automatically. The single-thread runtimes as well as the contents of the "wout" file produced by VMEC++ can be compared with those of Fortran VMEC v8.52. The full validation test can be found at https://github.com/proximafusion/vmecpp-validation, including a set of sensible input configurations, parameter scan values and tolerances that make the comparison pass. See that repo for more information. +This full validation (~219 input configurations) is run against every commit to `main` and can also be triggered +on demand from the [Full V&V against reference VMEC](https://github.com/proximafusion/vmecpp/actions/workflows/full_validation.yaml) workflow +(click "Run workflow"). It builds `vmecpp` from the corresponding commit rather than using the version pinned by `vmecpp-validation`. + ## Differences with respect to PARVMEC/VMEC2000 VMEC++: @@ -368,7 +380,6 @@ Some items we do not plan to work on, but where community ownership is welcome: ## Related repositories * [`proximafusion/vmecpp-validation`](https://github.com/proximafusion/vmecpp-validation) - Validation tests for VMEC++ -* [`proximafusion/vmecpp_large_cpp_tests`](https://github.com/proximafusion/vmecpp_large_cpp_tests) - Large C++ tests for VMEC++ * [`proximafusion/the_numerics_of_vmecpp`](https://github.com/proximafusion/the_numerics_of_vmecpp) - Documentation of the numerical details of VMEC++ * [`proximafusion/vmecpp-benchmarks`](https://github.com/proximafusion/vmecpp-benchmarks) - Performance benchmarks comparing VMEC++ and VMEC2000 diff --git a/benchmarks/to_seconds_json.py b/benchmarks/to_seconds_json.py new file mode 100644 index 000000000..15a72b0ed --- /dev/null +++ b/benchmarks/to_seconds_json.py @@ -0,0 +1,89 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +"""Convert pytest-benchmark or Google Benchmark JSON to seconds. + +github-action-benchmark's built-in "pytest" and "googlecpp" tool parsers plot whatever +value each framework happens to report natively -- pytest-benchmark's "iter/sec" and +Google Benchmark's raw per-iteration time in its own time_unit (commonly nanoseconds). +Charting those side by side, or even a single suite whose time_unit isn't fixed, +requires the reader (or the chart's JS) to know and convert between units. + +This script normalizes both to plain wall-clock seconds and emits the action's generic +"customSmallerIsBetter" schema, so the chart always plots seconds and the benchmarks.js +frontend needs no unit-detection logic. +""" + +import argparse +import json + + +def convert_pytest(data): + results = [] + for bench in data["benchmarks"]: + stats = bench["stats"] + results.append( + { + "name": bench["fullname"], + "unit": "seconds", + "value": stats["mean"], + "range": f"stddev: {stats['stddev']}", + "extra": f"rounds: {stats['rounds']}", + } + ) + return results + + +_GOOGLECPP_TIME_UNIT_TO_SECONDS = { + "s": 1.0, + "ms": 1e-3, + "us": 1e-6, + "ns": 1e-9, +} + + +def convert_googlecpp(data): + results = [] + for bench in data["benchmarks"]: + if bench.get("error_occurred"): + continue + factor = _GOOGLECPP_TIME_UNIT_TO_SECONDS[bench["time_unit"]] + results.append( + { + "name": bench["name"], + "unit": "seconds", + "value": bench["real_time"] * factor, + "extra": ( + f"iterations: {bench['iterations']}\n" + f"cpu: {bench['cpu_time'] * factor} seconds\n" + f"threads: {bench.get('threads', 1)}" + ), + } + ) + return results + + +_CONVERTERS = { + "pytest": convert_pytest, + "googlecpp": convert_googlecpp, +} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("format", choices=sorted(_CONVERTERS)) + parser.add_argument("input", help="Raw benchmark JSON produced by the tool.") + parser.add_argument("output", help="Where to write the customSmallerIsBetter JSON.") + args = parser.parse_args() + + with open(args.input) as f: + data = json.load(f) + + results = _CONVERTERS[args.format](data) + + with open(args.output, "w") as f: + json.dump(results, f, indent=2) + + +if __name__ == "__main__": + main() diff --git a/docs/_static/benchmarks.js b/docs/_static/benchmarks.js index 1b8e46003..19754aa72 100644 --- a/docs/_static/benchmarks.js +++ b/docs/_static/benchmarks.js @@ -37,36 +37,27 @@ "#1f6feb", ]; - // Parse mean duration from the extra field (e.g. "mean: 339.88 msec\nrounds: 5") - function parseMeanSeconds(bench) { - if (!bench.extra) return null; - var match = bench.extra.match(/mean:\s*([\d.]+)\s*([\w]+)/); - if (!match) return null; - var value = parseFloat(match[1]); - var unit = match[2]; - if (unit === "msec") return value / 1000; - if (unit === "usec") return value / 1000000; - if (unit === "nsec") return value / 1000000000; - if (unit === "sec") return value; - return null; - } - function renderCharts(data) { var container = document.getElementById("benchmark-charts"); if (!container) return; container.innerHTML = ""; - // Collect benchmarks per test case + // Collect benchmarks per test case, grouped by suite (the `name` given to + // each github-action-benchmark step, e.g. "Benchmark" vs + // "C++ Microbenchmarks") so suites render as separate sections instead of + // interleaving in one flat list. var entries = data.entries; - var allBenches = new Map(); + var colorIdx = 0; + var theme = getThemeColors(); - Object.keys(entries).forEach(function (name) { - entries[name].forEach(function (entry) { + Object.keys(entries).forEach(function (suiteName) { + var suiteBenches = new Map(); + entries[suiteName].forEach(function (entry) { entry.benches.forEach(function (bench) { - var arr = allBenches.get(bench.name); + var arr = suiteBenches.get(bench.name); if (!arr) { arr = []; - allBenches.set(bench.name, arr); + suiteBenches.set(bench.name, arr); } arr.push({ commit: entry.commit, @@ -75,10 +66,29 @@ }); }); }); + if (suiteBenches.size === 0) return; + + var heading = document.createElement("h3"); + heading.textContent = suiteName; + container.appendChild(heading); + + suiteBenches.forEach(function (dataset, benchName) { + renderChart(container, benchName, dataset, theme, colorIdx); + colorIdx++; + }); }); - var colorIdx = 0; - allBenches.forEach(function (dataset, benchName) { + // Last update info + var info = document.createElement("p"); + info.className = "small"; + info.style.textAlign = "center"; + info.style.opacity = "0.7"; + info.textContent = "Last updated: " + new Date(data.lastUpdate).toLocaleString(); + container.appendChild(info); + } + + function renderChart(container, benchName, dataset, theme, colorIdx) { + { var wrapper = document.createElement("div"); wrapper.style.marginBottom = "1rem"; container.appendChild(wrapper); @@ -95,9 +105,6 @@ wrapper.appendChild(canvas); var color = COLORS[colorIdx % COLORS.length]; - colorIdx++; - - var theme = getThemeColors(); new Chart(canvas, { type: "line", @@ -109,8 +116,7 @@ { label: benchName, data: dataset.map(function (d) { - var secs = parseMeanSeconds(d.bench); - return secs !== null ? secs : 1.0 / d.bench.value; + return d.bench.value; }), borderColor: color, backgroundColor: color + "30", @@ -182,15 +188,7 @@ }, }, }); - }); - - // Last update info - var info = document.createElement("p"); - info.className = "small"; - info.style.textAlign = "center"; - info.style.opacity = "0.7"; - info.textContent = "Last updated: " + new Date(data.lastUpdate).toLocaleString(); - container.appendChild(info); + } } // Re-render on Furo theme toggle diff --git a/docs/benchmarks.md b/docs/benchmarks.md index 2d21f5997..5b2f8988b 100644 --- a/docs/benchmarks.md +++ b/docs/benchmarks.md @@ -1,9 +1,9 @@ # Benchmarks Performance improvements and regressions of `vmecpp` can be tracked below on a per-commit basis. A larger set of benchmarks against VMEC2000 can be found at [`proximafusion/vmecpp-benchmarks`](https://github.com/proximafusion/vmecpp-benchmarks). -A small but representative set of benchmarks runs automatically on every push to `main` and on pull requests, using [pytest-benchmark](https://pytest-benchmark.readthedocs.io/) and [github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark/). +A small but representative set of benchmarks runs automatically on every push to `main` and on pull requests, using [pytest-benchmark](https://pytest-benchmark.readthedocs.io/) (Python, end-to-end) and [Google Benchmark](https://github.com/google/benchmark) (C++, function-level), both tracked via [github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark/). -## Benchmark suite +## End-to-end benchmark suite (Python) | Benchmark | Description | |-----------|-------------| @@ -14,6 +14,22 @@ A small but representative set of benchmarks runs automatically on every push to | `test_bench_response_table_from_coils` | Magnetic field response table creation from coils file | | `test_bench_free_boundary` | Free-boundary solve with pre-computed response table | +## Microbenchmark suite (C++) + +These target individual hot functions so a regression can be attributed to a specific kernel rather than only showing up in the end-to-end timings above. Each is a Google Benchmark `cc_binary` under `src/vmecpp/cpp/`, swept over several `(mpol, ntor)` resolutions. + +| Benchmark | Description | +|-----------|-------------| +| `DftFourierToReal` / `FftFourierToReal` | Inverse transform (Fourier -> real-space geometry), DFT fallback vs FFTX path | +| `Dft` / `Fft` (real-space sweep) | Inverse transform cost as the real-space grid (`ntheta`, `nzeta`) is scaled | +| `BM_FourierToReal_Parallel_W7x_4t` | Inverse transform under VMEC's persistent multi-threaded OpenMP call pattern | +| `DeAliasConstraintForce` | Spectral-condensation constraint-force de-aliasing (forward+inverse transform pair) | +| `LaplaceSolve` / `LaplaceDecompose` | Free-boundary (NESTOR) dense Laplace solve: assemble + LU factorize + back-substitute | +| `TransformGreensFunctionDerivative` | Free-boundary Green's-function-derivative Fourier transform | +| `ComputeOutputQuantities` | Post-solve output computation (wout, jxbout, Mercier, ...) -- time spent after the solve has converged | + +FFT-path benchmarks are skipped at resolutions for which no vendored FFTX codelet exists (the solver falls back to the DFT path there), so only resolutions with an actual FFT kernel appear in the FFT charts. + ```{raw} html @@ -27,6 +43,8 @@ Click on any data point to open the corresponding commit. ## Running locally +Python end-to-end benchmarks: + ```bash pip install -e .[benchmark] pytest benchmarks/test_benchmarks.py -v @@ -37,3 +55,16 @@ To produce a JSON report: ```bash pytest benchmarks/test_benchmarks.py --benchmark-json=benchmark_results.json ``` + +C++ microbenchmarks are built and run via Bazel, e.g.: + +```bash +cd src/vmecpp/cpp +bazel run --config=perf -- //vmecpp/vmec/ideal_mhd_model:fft_toroidal_bench +``` + +The other three targets are `//vmecpp/vmec/ideal_mhd_model:dealias_constraint_force_bench`, +`//vmecpp/free_boundary/laplace_solver:laplace_solver_bench`, and +`//vmecpp/vmec/output_quantities:output_quantities_bench`. CI builds, runs, and merges +all four into a single JSON report for the regression tracker (see +`.github/actions/run-benchmarks/action.yml`). diff --git a/docs/examples_overview.md b/docs/examples_overview.md index 091255adf..66fc1b070 100644 --- a/docs/examples_overview.md +++ b/docs/examples_overview.md @@ -14,3 +14,4 @@ The `examples/` directory contains short scripts demonstrating typical tasks: - [`simsopt_qh_fixed_resolution.py`](../examples/simsopt_qh_fixed_resolution.py): reproduce SIMSOPT's QH fixed resolution example. - [`sample_hot_restarts_with_random_perturbations.py`](../examples/sample_hot_restarts_with_random_perturbations.py): explore restart sensitivity to small boundary perturbations. - [`force_residual_convergence.py`](../examples/force_residual_convergence.py): plot convergence of force residuals during VMEC++ runs. +- [`fourier_resolution_increase.py`](../examples/fourier_resolution_increase.py): reach a high Fourier resolution by continuation, in fewer iterations than a fixed-resolution solve. diff --git a/examples/data/README.md b/examples/data/README.md index 00efb23fd..543b37f78 100644 --- a/examples/data/README.md +++ b/examples/data/README.md @@ -1,13 +1,13 @@ # Example input and output files for VMEC++ -A few cases are available for testing VMCE++ and experimenting with it: +A few cases are available for testing VMEC++ and experimenting with it: 1. `cth_like_fixed_bdy.json` - Stellarator case, similar to the Compact Toroidal Hybrid ([CTH](https://www.auburn.edu/cosam/departments/physics/research/plasma_physics/compact_toroidal_hybrid/index.htm)) device 1. `input.cth_like_fixed_bdy` - Fortran namelist input file to be used with Fortran VMEC 1. `cth_like_fixed_bdy.json` - JSON input file for VMEC++, derived from `input.cth_like_fixed_bdy` using [`indata2json`](https://github.com/jonathanschilling/indata2json) 1. `wout_cth_like_fixed_bdy.nc` - NetCDF output file, produced using [`PARVMEC`](https://github.com/ORNL-Fusion/PARVMEC) from `input.cth_like_fixed_bdy`, for testing the loading of a `wout` file using VMEC++'s tooling -1. `input.nfp4_QH_warm_start` - quasi-helically example for use with SIMSOPT +1. `input.nfp4_QH_warm_start` - quasi-helical example for use with SIMSOPT 1. `solovev` - axisymmetric Tokamak case, similar to the Solov'ev equilibrium used in the [1983 Hirshman & Whitson article](https://doi.org/10.1063/1.864116) 1. `input.solovev` - Fortran namelist input file for use with Fortran VMEC diff --git a/examples/external_optimizers.py b/examples/external_optimizers.py new file mode 100644 index 000000000..b4da85f26 --- /dev/null +++ b/examples/external_optimizers.py @@ -0,0 +1,283 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# +# SPDX-License-Identifier: MIT +"""Drive a VMEC++ equilibrium from outside with general-purpose optimizers. + +VMEC's equilibrium is the stationary point of its augmented functional (MHD +energy plus the spectral-condensation and lambda constraints). The gradient of +that functional in the decomposed internal basis is the raw, unpreconditioned +force exposed by ``VmecModel.evaluate(precondition=False)``. Finding the +equilibrium is therefore the root problem F(x) = 0, which gradient- and +Hessian-based solvers can attack while reusing VMEC++'s forward model, its +preconditioner (``apply_preconditioner``, VMEC's approximate inverse Hessian), +and its Hessian-vector product (``hessian_vector_product``, a directional +derivative of the analytic force computed inside VMEC++). + +This module wires that residual to several solvers and is shared by the +benchmark ``main`` below and by the tests: + +* preconditioned descent (VMEC's own update direction), +* Jacobian-free Newton-Krylov, plain and preconditioned, and +* a true Newton-Krylov driven by VMEC++'s own Hessian-vector product. + +All converge to the same equilibrium as the native solver. Force evaluations are +counted inside VMEC++ (``force_eval_count``) so the comparison is fair across +methods, including the evaluations hidden in Hessian-vector products. + +Interpretation: what separates the methods is how they couple DOFs of +neighbouring flux surfaces. Plain JFNK does not -- it treats every degree of +freedom as independent, so it cannot damp the radial stiffness that lets a +surface cross its neighbour between iterations (BAD_JACOBIAN restarts in the +native solver). It still converges, but slowly. VMEC's couples each surface to +its jF +/- 1 neighbours; applying it -- as the inner Krylov preconditioner, or +refreshed every step in the HVP Newton -- is what rescues conditioning and cuts +the cost by an order of magnitude. +""" + +from __future__ import annotations + +import time +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +from scipy.optimize import newton_krylov +from scipy.sparse.linalg import LinearOperator, gmres + +import vmecpp +from vmecpp.cpp import _vmecpp # type: ignore[import] + +DEFAULT_INPUT = ( + Path(__file__).resolve().parents[1] + / "examples" + / "data" + / "cth_like_fixed_bdy.json" +) + + +_BAD_JACOBIAN = 2 # RestartReason::BAD_JACOBIAN (flow_control.h) + + +def _ensure_valid_initial_jacobian(model, max_reguess: int = 2) -> None: + """Reguess the magnetic axis until the initial Jacobian is non-singular. + + Inputs that ship no axis (e.g. cma.json, with raxis/zaxis all zero) start from a + degenerate geometry, so the bare forward model returns at the BAD_JACOBIAN + checkpoint with zero force. The native solver reguesses the axis on the first + iterate (vmec.cc SolveEquilibriumLoop); mirror that here via reinitialize() so a + cold start from any valid INDATA has a defined gradient. + """ + for _ in range(max_reguess): + model.evaluate(2, 2, False) + if model.restart_reason != _BAD_JACOBIAN: + return + model.reinitialize() + model.evaluate(2, 2, False) + + +def make_model(input_path: Path = DEFAULT_INPUT, ns: int = 11): + indata = _vmecpp.VmecINDATA.from_file(str(input_path)) + model = _vmecpp.VmecModel.create(indata, ns) + _ensure_valid_initial_jacobian(model) + return model + + +def residual(model): + """Return F(x) = raw internal-basis force; F(x) = 0 at equilibrium.""" + + def F(x): + model.set_state(np.ascontiguousarray(x, dtype=float)) + model.evaluate(2, 2, False) + return np.asarray(model.get_forces(), dtype=float) + + return F + + +@dataclass +class Result: + name: str + force_evals: int + outer_iters: int + seconds: float + residual_norm: float + energy: float + + +def reference_equilibrium(input_path: Path = DEFAULT_INPUT, ns: int = 11): + model = make_model(input_path, ns) + model.solve() + model.evaluate(2, 2, False) + return np.asarray(model.get_state(), float), model.mhd_energy + + +def _finish(model, name, x, outer_iters, t0): + model.set_state(np.ascontiguousarray(x)) + model.evaluate(2, 2, False) + return x, Result( + name, + model.force_eval_count, + outer_iters, + time.perf_counter() - t0, + float(np.linalg.norm(np.asarray(model.get_forces(), float))), + model.mhd_energy, + ) + + +def solve_vmecpp(input_path=DEFAULT_INPUT, ns=11): + """Native VMEC++ solve through the public API; reports the iteration count. + + Unlike the other variants this drives the ordinary ``vmecpp.run`` path rather + than the low-level ``VmecModel`` primitives, so the reported residual/energy + are the public wout diagnostics (invariant force residuals and total MHD + energy) rather than the raw internal-basis force this module counts elsewhere. + """ + vmec_input = vmecpp.VmecInput.from_file(input_path) + vmec_input.ns_array = np.asarray([ns], dtype=vmec_input.ns_array.dtype) + t0 = time.perf_counter() + output = vmecpp.run(vmec_input, verbose=False) + wout = output.wout + return output, Result( + name="VMEC++ (native, vmecpp.run)", + force_evals=wout.niter, + outer_iters=wout.niter, + seconds=time.perf_counter() - t0, + residual_norm=float(np.sqrt(wout.fsqt[-1])), + energy=wout.wb + wout.wp, + ) + + +def solve_preconditioned_descent( + input_path=DEFAULT_INPUT, ns=11, tol=1e-9, delt=0.9, momentum=0.5, max_iter=20000 +): + model = make_model(input_path, ns) + F = residual(model) + x = np.asarray(model.get_state(), float).copy() + v = np.zeros_like(x) + model.reset_force_eval_count() + it = 0 + t0 = time.perf_counter() + for _ in range(max_iter): + if np.linalg.norm(F(x)) < tol: + break + it += 1 + model.set_state(np.ascontiguousarray(x)) + model.evaluate(2, 2, True) # preconditioned search direction + fprec = np.asarray(model.get_forces(), float) + v = momentum * v + delt * fprec + x = x + delt * v + return _finish(model, "preconditioned descent", x, it, t0) + + +def solve_newton_krylov( + input_path=DEFAULT_INPUT, ns=11, tol=1e-9, max_iter=2500, preconditioned=False +): + model = make_model(input_path, ns) + F = residual(model) + x0 = np.asarray(model.get_state(), float) + inner_m = None + model.reset_force_eval_count() + if preconditioned: + # Assemble VMEC's preconditioner at x0 and use it, frozen, as the inner + # Krylov preconditioner. M^-1 approximates the inverse Hessian; it is a + # radial tridiagonal (Thomas) solve per Fourier mode, so it couples each + # flux surface to its jF +/- 1 neighbours -- the coupling the plain + # branch lacks. + model.evaluate(2, 2, True) + n_dof = x0.size + inner_m = LinearOperator( # type: ignore[call-overload] + (n_dof, n_dof), + matvec=lambda b: np.asarray( # type: ignore[call-overload] + model.apply_preconditioner(np.ascontiguousarray(b)), float + ), + ) + t0 = time.perf_counter() + x = newton_krylov( + F, x0, f_tol=tol, maxiter=max_iter, method="lgmres", inner_M=inner_m + ) + name = ( + "Newton-Krylov (preconditioned)" if preconditioned else "Newton-Krylov (JFNK)" + ) + return _finish(model, name, x, 0, t0) + + +def solve_newton_krylov_preconditioned(input_path=DEFAULT_INPUT, ns=11, tol=1e-9): + return solve_newton_krylov(input_path, ns, tol, preconditioned=True) + + +def solve_newton_hvp( + input_path=DEFAULT_INPUT, ns=11, tol=1e-9, max_newton=80, inner_tol=1e-3 +): + """Globalized Newton-Krylov using VMEC++'s own Hessian-vector product. + + Each Newton step solves H dx = -F with GMRES, where H v is hessian_vector_product + (the analytic force's directional derivative computed inside VMEC++) and the inner + solve is preconditioned by M^-1. A backtracking line search on ||F|| globalizes the + step, which is required on stiff 3D cases where the full Newton step overshoots. + """ + model = make_model(input_path, ns) + F = residual(model) + x = np.asarray(model.get_state(), float).copy() + n_dof = x.size + model.reset_force_eval_count() + t0 = time.perf_counter() + it = 0 + for _ in range(max_newton): + fk = F(x) + norm0 = np.linalg.norm(fk) + if norm0 < tol: + break + it += 1 + model.set_state(np.ascontiguousarray(x)) + model.evaluate(2, 2, True) # assemble M at the current iterate + h_op = LinearOperator( # type: ignore[call-overload] + (n_dof, n_dof), + matvec=lambda v: np.asarray( # type: ignore[call-overload] + model.hessian_vector_product(np.ascontiguousarray(v)), float + ), + ) + m_op = LinearOperator( # type: ignore[call-overload] + (n_dof, n_dof), + matvec=lambda b: np.asarray( # type: ignore[call-overload] + model.apply_preconditioner(np.ascontiguousarray(b)), float + ), + ) + dx, _ = gmres(h_op, -fk, M=m_op, rtol=inner_tol, maxiter=100) + # Backtracking line search: accept the largest step that reduces ||F||. + alpha = 1.0 + for _ in range(30): + if np.linalg.norm(F(x + alpha * dx)) < norm0: + break + alpha *= 0.5 + else: + break # no decrease found; stop + x = x + alpha * dx + return _finish(model, "Newton (VMEC++ HVP + M^-1)", x, it, t0) + + +ALL_SOLVERS = ( + solve_vmecpp, + solve_preconditioned_descent, + solve_newton_krylov_preconditioned, + solve_newton_krylov, + solve_newton_hvp, +) + + +def main(): + _, w_star = reference_equilibrium() + print(f"reference equilibrium (native solve): W = {w_star:.8e}\n") + print( + f"{'optimizer':32s} {'F-evals':>8s} {'iters':>6s} {'time[s]':>8s} " + f"{'||F||':>10s} {'dW vs ref':>10s}" + ) + for solver in ALL_SOLVERS: + r = solver()[1] + print( + f"{r.name:32s} {r.force_evals:8d} {r.outer_iters:6d} {r.seconds:8.2f} " + f"{r.residual_norm:10.1e} {abs(r.energy - w_star):10.1e}" + ) + + +if __name__ == "__main__": + main() diff --git a/examples/fourier_resolution_increase.py b/examples/fourier_resolution_increase.py index b7b7c6b41..375452153 100644 --- a/examples/fourier_resolution_increase.py +++ b/examples/fourier_resolution_increase.py @@ -1,251 +1,108 @@ # SPDX-FileCopyrightText: 2025-present Proxima Fusion GmbH # # SPDX-License-Identifier: MIT -"""This example demonstrates how to successively increase the Fourier resolution, along -with the number of flux surfaces, in a VMEC++ equilibrium computation. - -This is expected to increase the robustness of the equilibrium computation. +"""Continuation in Fourier resolution. + +VMEC++ converges a hard equilibrium more reliably, and often in fewer total +iterations, when the Fourier resolution is increased gradually rather than solved +at the target resolution from scratch. Each step solves a single resolution and +hot-restarts from the previous step, whose solution is interpolated to the new +resolution by :func:`vmecpp.interpolate_solution` (radial interpolation in +``sqrt(s)`` plus Fourier zero-padding). + +Setting ``VmecInput.mpol``/``.ntor`` to a sequence (instead of a plain int) makes +``vmecpp.run`` perform the whole schedule in one call: + + vmec_input.ns_array = np.array([15, 31, 31]) + vmec_input.mpol = [5, 9, 13] + vmec_input.ntor = [4, 4, 4] + output = vmecpp.run(vmec_input) + +This example runs the schedule step by step instead, so it can report the +per-step iteration counts and compare the total against solving at the target +Fourier resolution directly (the radial multi-grid is used in both cases, so the +only difference is whether ``mpol`` is ramped up or held fixed). """ from pathlib import Path import numpy as np -# Import the VMEC++ Python module. import vmecpp -# Load the VMEC++ JSON indata file. -# Its keys have 1:1 correspondence with those in a classic Fortran INDATA file. -vmec_input_filename = Path("examples") / "data" / "cth_like_fixed_bdy.json" -vmec_input = vmecpp.VmecInput.from_file(vmec_input_filename) - -# Note: The `cth_like_fixed_bdy` example case has ns=15, mpol=5, ntor=4. - -# Make the initial VMEC++ run for the original input. -# This is expected to have the lowest resolution. -vmec_output = vmecpp.run(vmec_input) - -# Define additional steps with increased resolution. -ns_array = [31] -# mpol_array = [7, 9] ; ntor_array = [7, 9] -mpol_array = [5] -ntor_array = [4] - -# Go through resolution steps and run VMEC++ for each step. -for i_step, (ns, mpol, ntor) in enumerate( - zip(ns_array, mpol_array, ntor_array, strict=False) -): - print(f"Running step {i_step + 1} with ns={ns}, mpol={mpol}, ntor={ntor}") - - old_ns = vmec_output.wout.ns - old_mpol = vmec_output.wout.mpol - old_ntor = vmec_output.wout.ntor - - old_mnmax = (old_ntor + 1) + (old_mpol - 1) * (2 * old_ntor + 1) - - print(f"interpolate ns = {old_ns:3d} mpol = {old_mpol:2d} ntor = {old_ntor:2d}") - print(f" to ns = {ns:3d} mpol = {mpol:2d} ntor = {ntor:2d}") - - # make sure that resolution only increases - decreasing resolution not implemented yet - assert old_ns <= ns - assert old_mpol <= mpol - assert old_ntor <= ntor - - # Set resolution parameters for current step. - vmec_input.ns_array = np.array([ns]) - vmec_input.mpol = mpol - vmec_input.ntor = ntor - - # set axis of new input to axis from previous output - vmec_input.raxis_c = np.zeros(ntor + 1) - vmec_input.zaxis_s = np.zeros(ntor + 1) - vmec_input.raxis_c[: old_ntor + 1] = vmec_output.wout.raxis_cc - vmec_input.zaxis_s[: old_ntor + 1] = vmec_output.wout.zaxis_cs - - # Resize boundary coefficients to new resolution. - vmec_input.rbc = vmecpp.VmecInput.resize_2d_coeff( - vmec_input.rbc, mpol_new=mpol, ntor_new=ntor - ) - vmec_input.zbs = vmecpp.VmecInput.resize_2d_coeff( - vmec_input.zbs, mpol_new=mpol, ntor_new=ntor - ) - - # Overwrite input boundary with the boundary from the previous output. - # This should be particularly useful for free-boundary runs. - # In a fixed-boundary run, this should effectively be a no-op. - old_mn = 0 - m = 0 - for n in range(old_ntor + 1): - vmec_input.rbc[m, ntor + n] = vmec_output.wout.rmnc[old_mn, old_ns - 1] - vmec_input.zbs[m, ntor + n] = vmec_output.wout.zmns[old_mn, old_ns - 1] - old_mn += 1 - for m in range(1, old_mpol): - for n in range(-old_ntor, old_ntor + 1): - vmec_input.rbc[m, ntor + n] = vmec_output.wout.rmnc[old_mn, old_ns - 1] - vmec_input.zbs[m, ntor + n] = vmec_output.wout.zmns[old_mn, old_ns - 1] - old_mn += 1 - assert old_mn == old_mnmax - - # Make a deep copy of the previous output object for being able to change its contents - # without loosing access to the previous resolution to restart from. - vmec_output_to_restart_from = vmec_output.model_copy(deep=True) - - # Perform radial interpolation and zero-padding in order to produce the initial guess - # for the next resolution step based on the previous step. - mnmax = (ntor + 1) + (mpol - 1) * (2 * ntor + 1) - vmec_output_to_restart_from.wout.rmnc = np.zeros([mnmax, ns]) - vmec_output_to_restart_from.wout.zmns = np.zeros([mnmax, ns]) - vmec_output_to_restart_from.wout.lmns_full = np.zeros([mnmax, ns]) - - if ns == old_ns: - # no radial interpolation if radial resolution does not change - for j in range(ns): - mn = 0 - m = 0 - for n in range(ntor + 1): - for old_mn in range(old_mnmax): - if ( - m == vmec_output.wout.xm[old_mn] - and n * vmec_output.wout.nfp == vmec_output.wout.xn[old_mn] - ): - vmec_output_to_restart_from.wout.rmnc[mn, j] = ( - vmec_output.wout.rmnc[old_mn, j] - ) - vmec_output_to_restart_from.wout.zmns[mn, j] = ( - vmec_output.wout.zmns[old_mn, j] - ) - vmec_output_to_restart_from.wout.lmns_full[mn, j] = ( - vmec_output.wout.lmns_full[old_mn, j] - ) - mn += 1 - for m in range(1, mpol): - for n in range(-ntor, ntor + 1): - for old_mn in range(old_mnmax): - if ( - m == vmec_output.wout.xm[old_mn] - and n * vmec_output.wout.nfp == vmec_output.wout.xn[old_mn] - ): - vmec_output_to_restart_from.wout.rmnc[mn, j] = ( - vmec_output.wout.rmnc[old_mn, j] - ) - vmec_output_to_restart_from.wout.zmns[mn, j] = ( - vmec_output.wout.zmns[old_mn, j] - ) - vmec_output_to_restart_from.wout.lmns_full[mn, j] = ( - vmec_output.wout.lmns_full[old_mn, j] - ) - mn += 1 - else: - # perform radial interpolation as well as zero-padding in Fourier space - - old_sqrt_s_full = np.sqrt(np.linspace(0.0, 1.0, old_ns, endpoint=True)) - new_sqrt_s_full = np.sqrt(np.linspace(0.0, 1.0, ns, endpoint=True)) - - old_scalxc = np.zeros(old_ns) - old_scalxc[1:] = 1.0 / old_sqrt_s_full[1:] - old_scalxc[0] = old_scalxc[1] - - new_scalxc = np.zeros(ns) - new_scalxc[1:] = 1.0 / new_sqrt_s_full[1:] - new_scalxc[0] = new_scalxc[1] - - # FIXME(jons): Something is still fishy here: - # When using this interpolation method for just increasing radial resolution, without chaning the Fourier resolution, the resulting force residuals decay is not the same as when using the radial multi-grid method natively implemented in VMEC++ directly. - # TODO(jons): One could also think about using this comparison as a test for this script. - - def get_interpolated_slice_from_previous_run( - vmec_output: vmecpp.VmecOutput, - old_sqrt_s_full: np.ndarray, - new_sqrt_s_full: np.ndarray, - old_scalxc: np.ndarray, - new_scalxc: np.ndarray, - old_mn: int, - m: int, - ): - # extract radial slice at matching source Fourier mode - rmnc_slice = vmec_output.wout.rmnc[old_mn, :].copy() - zmns_slice = vmec_output.wout.zmns[old_mn, :].copy() - lmns_full_slice = vmec_output.wout.lmns_full[old_mn, :].copy() - - if m % 2 == 1: - # Apply odd-m interpolation weights. - rmnc_slice *= old_scalxc - zmns_slice *= old_scalxc - lmns_full_slice *= old_scalxc - - # Extrapolate odd-m modes in source output from first two flux surfaces. - rmnc_slice[0] = 2.0 * rmnc_slice[1] - rmnc_slice[2] - zmns_slice[0] = 2.0 * zmns_slice[1] - zmns_slice[2] - lmns_full_slice[0] = 2.0 * lmns_full_slice[1] - lmns_full_slice[2] - - # perform radial interpolation to new resolution - rmnc_interp = np.interp(new_sqrt_s_full, old_sqrt_s_full, rmnc_slice) - zmns_interp = np.interp(new_sqrt_s_full, old_sqrt_s_full, zmns_slice) - lmns_full_interp = np.interp( - new_sqrt_s_full, old_sqrt_s_full, lmns_full_slice - ) - - if m % 2 == 1: - # un-do odd-m interpolation weights in interpolated data - rmnc_interp /= new_scalxc - zmns_interp /= new_scalxc - lmns_full_interp /= new_scalxc - - # set odd-m modes in target output to zero at the magnetic axis - rmnc_interp[0] = 0.0 - zmns_interp[0] = 0.0 - lmns_full_interp[0] = 0.0 - - return rmnc_interp, zmns_interp, lmns_full_interp - - mn = 0 - m = 0 - for n in range(ntor + 1): - for old_mn in range(old_mnmax): - if ( - m == vmec_output.wout.xm[old_mn] - and n * vmec_output.wout.nfp == vmec_output.wout.xn[old_mn] - ): - rmnc_interp, zmns_interp, lmns_full_interp = ( - get_interpolated_slice_from_previous_run( - vmec_output=vmec_output, - old_sqrt_s_full=old_sqrt_s_full, - new_sqrt_s_full=new_sqrt_s_full, - old_scalxc=old_scalxc, - new_scalxc=new_scalxc, - old_mn=old_mn, - m=m, - ) - ) - vmec_output_to_restart_from.wout.rmnc[mn, :] = rmnc_interp - vmec_output_to_restart_from.wout.zmns[mn, :] = zmns_interp - vmec_output_to_restart_from.wout.lmns_full[mn, :] = lmns_full_interp - mn += 1 - for m in range(1, mpol): - for n in range(-ntor, ntor + 1): - for old_mn in range(old_mnmax): - if ( - m == vmec_output.wout.xm[old_mn] - and n * vmec_output.wout.nfp == vmec_output.wout.xn[old_mn] - ): - rmnc_interp, zmns_interp, lmns_full_interp = ( - get_interpolated_slice_from_previous_run( - vmec_output=vmec_output, - old_sqrt_s_full=old_sqrt_s_full, - new_sqrt_s_full=new_sqrt_s_full, - old_scalxc=old_scalxc, - new_scalxc=new_scalxc, - old_mn=old_mn, - m=m, - ) - ) - vmec_output_to_restart_from.wout.rmnc[mn, :] = rmnc_interp - vmec_output_to_restart_from.wout.zmns[mn, :] = zmns_interp - vmec_output_to_restart_from.wout.lmns_full[mn, :] = ( - lmns_full_interp - ) - mn += 1 - assert mn == mnmax - - # Run VMEC++ with the new resolution, based on the previous (interpolated and zero-padded) result. - vmec_output = vmecpp.run(vmec_input, restart_from=vmec_output_to_restart_from) +vmec_input = vmecpp.VmecInput.from_file( + Path("examples") / "data" / "cth_like_fixed_bdy.json" +) + +# The continuation schedule: ramp the poloidal resolution mpol = 5 -> 9 -> 13 +# while refining the radial grid, at fixed toroidal resolution ntor = 4. +ns_array = [15, 31, 31] +mpol_array = [5, 9, 13] +ntor_array = [4, 4, 4] + +ftol = float(np.asarray(vmec_input.ftol_array)[-1]) +niter = int(np.asarray(vmec_input.niter_array)[-1]) + + +def n_iterations(output: vmecpp.VmecOutput) -> int: + """Number of solver iterations, i.e. the length of the force-residual history.""" + return int(np.asarray(output.wout.fsqt).shape[0]) + + +def step_input(ns: int, mpol: int, ntor: int) -> vmecpp.VmecInput: + """A single-resolution input for one continuation step.""" + step = vmec_input.model_copy(deep=True) + step.mpol = mpol + step.ntor = ntor + step.ns_array = np.array([ns]) + step.ftol_array = np.array([ftol]) + step.niter_array = np.array([niter]) + step.rbc = vmecpp.VmecInput.resize_2d_coeff(step.rbc, mpol_new=mpol, ntor_new=ntor) + step.zbs = vmecpp.VmecInput.resize_2d_coeff(step.zbs, mpol_new=mpol, ntor_new=ntor) + return step + + +# --- Fourier continuation --------------------------------------------------- +# Setting vmec_input.ns_array/.mpol/.ntor to these schedules and calling +# vmecpp.run(vmec_input) runs exactly this schedule in a single call; it is +# unrolled here to report the per-step iteration counts. +print("Fourier continuation:") +schedule = list(zip(ns_array, mpol_array, ntor_array, strict=True)) + +# First step: solve from scratch at the lowest resolution. +ns, mpol, ntor = schedule[0] +continued = vmecpp.run(step_input(ns, mpol, ntor), verbose=False) +continuation_iterations = n_iterations(continued) +print(f" mpol={mpol:2d}, ns={ns:2d}: {n_iterations(continued):5d} iterations") + +# Each later step hot-restarts from the previous solution, interpolated up to the +# new (ns, mpol, ntor) by interpolate_solution(). +for ns, mpol, ntor in schedule[1:]: + current_input = step_input(ns, mpol, ntor) + guess = vmecpp.interpolate_solution(continued, current_input) + continued = vmecpp.run(current_input, restart_from=guess, verbose=False) + continuation_iterations += n_iterations(continued) + print(f" mpol={mpol:2d}, ns={ns:2d}: {n_iterations(continued):5d} iterations") + +# --- Fixed Fourier resolution ----------------------------------------------- +fixed_input = step_input(ns_array[-1], mpol_array[-1], ntor_array[-1]) +fixed_input.ns_array = np.array([ns_array[0], ns_array[-1]]) +fixed_input.ftol_array = np.array([ftol, ftol]) +fixed_input.niter_array = np.array([niter, niter]) +fixed_output = vmecpp.run(fixed_input, verbose=False) +fixed_iterations = n_iterations(fixed_output) + +# --- comparison ------------------------------------------------------------- +print(f"\nfixed resolution (mpol={mpol_array[-1]}): {fixed_iterations:5d} iterations") +print( + f"Fourier continuation: {continuation_iterations:5d} iterations " + f"({continuation_iterations / fixed_iterations:.0%} of fixed)" +) + +max_geometry_difference = np.max( + np.abs(np.asarray(fixed_output.wout.rmnc) - np.asarray(continued.wout.rmnc)) +) +print( + "both approaches reach the same equilibrium: " + f"max|delta rmnc| = {max_geometry_difference:.1e}" +) diff --git a/examples/visualize_magnetic_field.py b/examples/visualize_magnetic_field.py index 6b02ee7b5..43da0ca49 100644 --- a/examples/visualize_magnetic_field.py +++ b/examples/visualize_magnetic_field.py @@ -63,6 +63,7 @@ def calculate_magnetic_field( cosk = np.cos(kernel) sink = np.sin(kernel) cosk_nyq = np.cos(kernel_nyq) + sink_nyq = np.sin(kernel_nyq) # Position in cylindrical coordinates (Sec. 9.1) r = np.dot(rmnc[:, j], cosk) @@ -87,12 +88,31 @@ def calculate_magnetic_field( bphi = bsupv * r bz = bsupu * dzdtheta + bsupv * dzdphi - # Repeat the same process for the current density field + # Repeat the same process for the current density field. VMEC++ stores + # sqrt(g) J^theta and sqrt(g) J^zeta in currumnc/currvmnc, so divide by + # the Jacobian before transforming contravariant components to Cartesian + # coordinates. + gmnc = vmec_output.wout.gmnc + gmns = getattr(vmec_output.wout, "gmns", None) currumnc = vmec_output.wout.currumnc currvmnc = vmec_output.wout.currvmnc - - curru = np.dot(currumnc[:, j], cosk_nyq) - currv = np.dot(currvmnc[:, j], cosk_nyq) + currumns = vmec_output.wout.currumns + assert currumns is not None + currvmns = vmec_output.wout.currvmns + assert currvmns is not None + + sqrtg = np.dot(gmnc[:, j], cosk_nyq) + curru_sqrtg = np.dot(currumnc[:, j], cosk_nyq) + currv_sqrtg = np.dot(currvmnc[:, j], cosk_nyq) + if gmns is not None and gmns.size: + sqrtg += np.dot(gmns[:, j], sink_nyq) + if currumns is not None and currumns.size: + curru_sqrtg += np.dot(currumns[:, j], sink_nyq) + if currvmns is not None and currvmns.size: + currv_sqrtg += np.dot(currvmns[:, j], sink_nyq) + + curru = curru_sqrtg / sqrtg + currv = currv_sqrtg / sqrtg currr = curru * drdtheta + currv * drdphi currphi = currv * r diff --git a/src/vmecpp/__init__.py b/src/vmecpp/__init__.py index 4878646fd..492b87cc9 100644 --- a/src/vmecpp/__init__.py +++ b/src/vmecpp/__init__.py @@ -20,6 +20,7 @@ import pydantic from vmecpp import _util +from vmecpp._continuation import _run_fourier_continuation, interpolate_solution from vmecpp._free_boundary import ( MagneticFieldResponseTable, MakegridParameters, @@ -76,6 +77,32 @@ def _wrap_int_as_float( pydantic.BeforeValidator(lambda x: np.array(x).astype(np.int64)), ] + +def _coerce_mpol_ntor(value: typing.Any) -> int | np.ndarray: + """Normalizes an ``mpol``/``ntor`` field value. + + A length-1 sequence is equivalent to a scalar and is collapsed to one; anything + longer is kept as an int array representing a per-``ns_array``-step Fourier + resolution continuation schedule. + """ + if isinstance(value, (int, np.integer)): + return int(value) + array = np.atleast_1d(np.asarray(value, dtype=np.int64)) + return int(array[0]) if array.size == 1 else array + + +MpolNtorField: typing.TypeAlias = typing.Annotated[ + int | jt.Int[np.ndarray, "num_fourier_steps"], + pydantic.BeforeValidator(_coerce_mpol_ntor), +] + + +def _final_resolution(value: int | np.ndarray) -> int: + """The target Fourier resolution: itself if scalar, else the schedule's last + (finest) entry.""" + return value if isinstance(value, int) else int(value[-1]) + + AuxFType = typing.Annotated[ _ArrayType, pydantic.BeforeValidator(lambda x: _util.right_pad(x, ndfmax, 0.0)), @@ -112,6 +139,16 @@ class FreeBoundaryMethod(str, enum.Enum): """Boundary Integral Equation Solver for Toroidal systems.""" +class IterationStyle(str, enum.Enum): + """Time-step / restart control scheme for the equilibrium iteration.""" + + VMEC_8_52 = "vmec_8_52" + """The Fortran VMEC 8.52 control (the default).""" + + PARVMEC = "parvmec" + """The PARVMEC / VMEC2000 9.0 control.""" + + class OutputMode(enum.Enum): """Controls the output format of iteration logging..""" @@ -137,6 +174,15 @@ def _validate_free_boundary_method( return FreeBoundaryMethod(str(value)) +def _validate_iteration_style( + value: _vmecpp.IterationStyle | str | IterationStyle, +) -> IterationStyle: + """Convert various representations to IterationStyle.""" + if isinstance(value, _vmecpp.IterationStyle): + return IterationStyle(value.name.lower()) # pyright: ignore[reportAttributeAccessIssue] + return IterationStyle(str(value)) + + # This is a pure Python equivalent of VmecINDATAPyWrapper. # In the future VmecINDATAPyWrapper and the C++ VmecINDATA will merge into one type, # and this will become a Python wrapper around the one C++ VmecINDATA type. @@ -168,12 +214,37 @@ class VmecInput(BaseModelWithNumpy): nfp: int = 1 """Number of toroidal field periods (=1 for Tokamak)""" - mpol: int = 6 - """Number of poloidal Fourier harmonics; m = 0, 1, ..., (mpol-1)""" + mpol: MpolNtorField = 6 + """Number of poloidal Fourier harmonics; m = 0, 1, ..., (mpol-1). + + May also be a sequence of ints, with one entry per ``ns_array`` step (a scalar + broadcasts to every step), to request continuation in Fourier resolution: + ``vmecpp.run()`` then solves each step in turn, hot-restarting from the + previous step's solution interpolated to the new resolution (see + :func:`interpolate_solution`). The boundary coefficients (``rbc``, ``zbs``, ...) + are always defined at the final (largest-index) entry's resolution. + """ - ntor: int = 0 + ntor: MpolNtorField = 0 """Number of toroidal Fourier harmonics; n = -ntor, -ntor+1, ..., -1, 0, 1, ..., - ntor-1, ntor.""" + ntor-1, ntor. + + May be a sequence of ints, analogous to :attr:`mpol`; see its docstring. + """ + + mpol_geometry: int = -1 + """Optional reduced poloidal resolution for the geometry (R, Z). + + If in [1, mpol), R/Z modes with m >= mpol_geometry are held fixed while lambda keeps + the full mpol. < 0 (default) means geometry uses mpol. + """ + + ntor_geometry: int = -1 + """Optional reduced toroidal resolution for the geometry (R, Z). + + If in [0, ntor), R/Z modes with n > ntor_geometry are held fixed while lambda keeps + the full ntor. < 0 (default) means geometry uses ntor. + """ ntheta: int = 0 """Number of poloidal grid points (ntheta >= 0). @@ -332,6 +403,14 @@ class VmecInput(BaseModelWithNumpy): ] = FreeBoundaryMethod.NESTOR """Method for handling free-boundary conditions.""" + iteration_style: typing.Annotated[ + IterationStyle, + pydantic.BeforeValidator(_validate_iteration_style), + pydantic.Field(), + ] = IterationStyle.VMEC_8_52 + """Time-step / restart control scheme for the equilibrium iteration (``"vmec_8_52"`` + or ``"parvmec"``).""" + nstep: int = 10 """Printout interval at which convergence progress is logged.""" @@ -423,7 +502,9 @@ def _validate_fourier_coefficients_shapes(self) -> VmecInput: if self.lasym: mpol_two_ntor_plus_one_fields.extend(["rbs", "zbc"]) - expected_shape = (self.mpol, 2 * self.ntor + 1) + mpol_final = _final_resolution(self.mpol) + ntor_final = _final_resolution(self.ntor) + expected_shape = (mpol_final, 2 * ntor_final + 1) for field in mpol_two_ntor_plus_one_fields: current_value = getattr(self, field) @@ -438,8 +519,8 @@ def _validate_fourier_coefficients_shapes(self) -> VmecInput: field, VmecInput.resize_2d_coeff( current_value, - mpol_new=self.mpol, - ntor_new=self.ntor, + mpol_new=mpol_final, + ntor_new=ntor_final, ), ) return self @@ -576,7 +657,10 @@ def _to_cpp_vmecindata(self) -> _vmecpp.VmecINDATA: } for attr in VmecInput.model_fields: - if attr in readonly_attrs or attr == "free_boundary_method": + if attr in readonly_attrs or attr in ( + "free_boundary_method", + "iteration_style", + ): continue # these must be set separately setattr(cpp_indata, attr, getattr(self, attr)) @@ -584,9 +668,14 @@ def _to_cpp_vmecindata(self) -> _vmecpp.VmecINDATA: cpp_indata.free_boundary_method = getattr( _vmecpp.FreeBoundaryMethod, self.free_boundary_method.upper() ) + cpp_indata.iteration_style = getattr( + _vmecpp.IterationStyle, self.iteration_style.upper() + ) # this also resizes the readonly_attrs - cpp_indata._set_mpol_ntor(self.mpol, self.ntor) + cpp_indata._set_mpol_ntor( + _final_resolution(self.mpol), _final_resolution(self.ntor) + ) for attr in readonly_attrs - {"mpol", "ntor"}: # now we can set the elements of the readonly_attrs value = getattr(self, attr) @@ -2186,6 +2275,14 @@ def run( restart_from: if present, VMEC++ is initialized using the converged equilibrium from the provided VmecOutput. This can dramatically decrease the number of iterations to convergence when running VMEC++ on a configuration that is very similar to the `restart_from` equilibrium. + If `input.mpol`/`input.ntor` is a sequence (see below), this is used to hot-restart + only the first continuation step; later steps always hot-restart from the previous one. + + If `input.mpol` and/or `input.ntor` is a sequence rather than a plain int, `run` performs + continuation in Fourier resolution: each entry pairs with the corresponding `input.ns_array` + entry (a scalar mpol/ntor broadcasts to every step), and each step is solved in turn, + hot-restarting from the previous step's solution interpolated to the new resolution (see + `interpolate_solution`). Example: >>> import vmecpp @@ -2196,6 +2293,16 @@ def run( 0.2033313711 """ input = VmecInput.model_validate(input) + + if not isinstance(input.mpol, int) or not isinstance(input.ntor, int): + return _run_fourier_continuation( + input, + magnetic_field, + max_threads=max_threads, + verbose=verbose, + restart_from=restart_from, + ) + cpp_indata = input._to_cpp_vmecindata() if restart_from is None: @@ -2442,6 +2549,7 @@ def set_profile( # items in the generated documentation. __all__ = [ # noqa: RUF022 "run", + "interpolate_solution", "VmecInput", "VmecOutput", "VmecWOut", @@ -2451,6 +2559,7 @@ def set_profile( "MakegridParameters", "MagneticFieldResponseTable", "FreeBoundaryMethod", + "IterationStyle", "set_profile", "iterate", "solve_equilibrium", diff --git a/src/vmecpp/_continuation.py b/src/vmecpp/_continuation.py new file mode 100644 index 000000000..a4fe57d1f --- /dev/null +++ b/src/vmecpp/_continuation.py @@ -0,0 +1,367 @@ +"""Generalized resolution interpolation and the Python-side continuation driver. + +VMEC++ converges much more reliably when a hard equilibrium is approached through +a sequence of increasing resolutions (the classic ``ns_array`` multi-grid, and also +Fourier continuation via a sequence-valued ``VmecInput.mpol`` / ``.ntor``). Each step +solves a single resolution and hot-restarts from the previous step's solution, +interpolated to the new resolution by :func:`interpolate_solution`. + +:func:`vmecpp.run` dispatches to :func:`_run_fourier_continuation` (this module) +whenever ``input.mpol`` and/or ``input.ntor`` is a sequence rather than a plain int; +:func:`interpolate_solution` itself is public API and can also be used directly, e.g. +to hand-roll a custom continuation schedule (see +``examples/fourier_resolution_increase.py``). + +The interpolation is purely a Python operation on a converged :class:`VmecOutput`: +the flux-surface geometry is interpolated radially along the normalized toroidal +flux ``s`` and the Fourier spectrum is padded (modes new to the target are set to +zero) or truncated (modes the target drops are discarded). VMEC++ recomputes every +derived quantity from this geometry on restart, so only the geometry (``rmnc``, +``zmns``, ``lmns_full`` and their non-symmetric partners, plus the axis) needs to be +physically meaningful; all other arrays are carried over at consistent shapes only. +""" + +from __future__ import annotations + +import typing + +import numpy as np + +if typing.TYPE_CHECKING: + from vmecpp import OutputMode, VmecInput, VmecOutput + from vmecpp._free_boundary import MagneticFieldResponseTable + +# State-vector geometry arrays, shape [mn_mode, n_surfaces]. These are the only +# quantities VMEC++ reads back when hot-restarting, so they must be interpolated. +_STATE_GEOMETRY_FIELDS = ( + "rmnc", + "zmns", + "lmns", + "lmns_full", + "rmns", + "zmnc", + "lmnc", + "lmnc_full", +) + +# Axis Fourier arrays, shape [ntor + 1]. The wout and the input use different field +# names for the magnetic axis (e.g. wout ``raxis_cc`` vs input ``raxis_c``). +_WOUT_AXIS_FIELDS = ("raxis_cc", "zaxis_cs", "raxis_cs", "zaxis_cc") +_INPUT_AXIS_FIELDS = ("raxis_c", "zaxis_s", "raxis_s", "zaxis_c") + +# Handled explicitly below or regenerated for the target; excluded from the generic +# radial pass. +_FIELDS_HANDLED_EXPLICITLY = frozenset( + _STATE_GEOMETRY_FIELDS + _WOUT_AXIS_FIELDS + ("xm", "xn", "xm_nyq", "xn_nyq") +) + + +def _state_mode_table(mpol: int, ntor: int, nfp: int) -> tuple[np.ndarray, np.ndarray]: + """Return ``(xm, xn)`` for the state-vector Fourier modes in VMEC ordering. + + ``m`` runs ``0 .. mpol - 1``; for ``m == 0`` the toroidal index ``n`` runs + ``0 .. ntor`` and for ``m > 0`` it runs ``-ntor .. ntor``. ``xn`` is stored as + ``n * nfp``, matching the convention used in the wout file. + """ + xm: list[int] = [] + xn: list[int] = [] + for m in range(mpol): + n_min = 0 if m == 0 else -ntor + for n in range(n_min, ntor + 1): + xm.append(m) + xn.append(n * nfp) + return np.asarray(xm, dtype=np.int64), np.asarray(xn, dtype=np.int64) + + +def _radial_interpolate(values: np.ndarray, ns_new: int) -> np.ndarray: + """Linearly interpolate auxiliary radial arrays along the last axis. + + The radial coordinate is the normalized toroidal flux ``s`` on the full grid, + ``s = linspace(0, 1, ns)``. This is used only for arrays VMEC++ recomputes on + restart (profiles, Nyquist spectra); their exact values do not affect the + restart, only their length must be consistent. The flux-surface geometry uses + :func:`_radial_interpolate_geometry` instead. + """ + values = np.asarray(values, dtype=float) + ns_old = values.shape[-1] + if ns_old == ns_new: + return values.copy() + s_old = np.linspace(0.0, 1.0, ns_old) + s_new = np.linspace(0.0, 1.0, ns_new) + if values.ndim == 1: + return np.interp(s_new, s_old, values) + flat = values.reshape(-1, ns_old) + out = np.empty((flat.shape[0], ns_new), dtype=float) + for i in range(flat.shape[0]): + out[i] = np.interp(s_new, s_old, flat[i]) + return out.reshape((*values.shape[:-1], ns_new)) + + +def _radial_interpolate_geometry( + values: np.ndarray, xm: np.ndarray, ns_new: int +) -> np.ndarray: + """Radially interpolate the state geometry ``[n_modes, ns_old]`` to ``ns_new``. + + This reproduces the radial interpolation VMEC++ performs internally between + multi-grid steps. The flux-surface geometry is naturally a function of + ``sqrt(s)``, so the interpolation is done on the ``sqrt(s)`` grid. Odd-``m`` + modes vanish like ``sqrt(s)`` toward the magnetic axis; they are divided by + ``sqrt(s)`` before interpolation, linearly extrapolated to the axis from the two + neighbouring surfaces, and reset to zero at the axis afterwards. + + Args: + values: geometry coefficients ``[n_modes, ns_old]`` in the target mode order. + xm: poloidal mode number per row, ``[n_modes]`` (selects the odd-``m`` path). + ns_new: number of full-grid flux surfaces in the target resolution. + """ + values = np.asarray(values, dtype=float) + ns_old = values.shape[-1] + if ns_old == ns_new: + return values.copy() + + old_sqrt_s = np.sqrt(np.linspace(0.0, 1.0, ns_old)) + new_sqrt_s = np.sqrt(np.linspace(0.0, 1.0, ns_new)) + # 1 / sqrt(s), with the axis value copied from the first half-grid point. + old_scale = np.empty(ns_old) + old_scale[1:] = 1.0 / old_sqrt_s[1:] + old_scale[0] = old_scale[1] + new_scale = np.empty(ns_new) + new_scale[1:] = 1.0 / new_sqrt_s[1:] + new_scale[0] = new_scale[1] + + out = np.empty((values.shape[0], ns_new), dtype=float) + for i in range(values.shape[0]): + radial = values[i].copy() + odd_m = int(xm[i]) % 2 == 1 + if odd_m: + radial = radial * old_scale + if ns_old >= 3: + radial[0] = 2.0 * radial[1] - radial[2] + interpolated = np.interp(new_sqrt_s, old_sqrt_s, radial) + if odd_m: + interpolated = interpolated / new_scale + interpolated[0] = 0.0 + out[i] = interpolated + return out + + +def _remap_modes( + values: np.ndarray, + src_xm: np.ndarray, + src_xn: np.ndarray, + dst_xm: np.ndarray, + dst_xn: np.ndarray, +) -> np.ndarray: + """Remap an array indexed by Fourier mode (axis 0) onto a new mode table. + + Modes shared by both tables are carried over, modes new to the target are set to + zero, and modes the target drops are discarded. + """ + values = np.asarray(values, dtype=float) + src_index = { + (int(m), int(n)): i + for i, (m, n) in enumerate(zip(src_xm, src_xn, strict=False)) + } + out = np.zeros((len(dst_xm), *values.shape[1:]), dtype=float) + for i, (m, n) in enumerate(zip(dst_xm, dst_xn, strict=False)): + j = src_index.get((int(m), int(n))) + if j is not None: + out[i] = values[j] + return out + + +def _remap_axis(values: np.ndarray, ntor_new: int) -> np.ndarray: + """Truncate or zero-pad an axis Fourier array ``[ntor + 1]`` to ``ntor_new``.""" + from vmecpp import _util # noqa: PLC0415 (lazy import avoids a circular import) + + # Slice handles the truncation (dropping modes above ntor_new); right_pad + # handles the zero-extension. right_pad alone cannot shrink the array. + values = np.asarray(values, dtype=float) + return _util.right_pad(values[: ntor_new + 1], ntor_new + 1) + + +def interpolate_solution(source: VmecOutput, target_input: VmecInput) -> VmecOutput: + """Interpolate a converged solution onto the resolution of ``target_input``. + + Args: + source: a converged :class:`VmecOutput`. + target_input: the input for the next continuation step. Its ``mpol``, + ``ntor`` and (single-element) ``ns_array`` define the target resolution, + and its ``nfp`` must match the source. + + Returns: + A :class:`VmecOutput` whose ``wout`` holds the source geometry interpolated + to the target resolution, suitable as ``restart_from`` for + :func:`vmecpp.run` with ``target_input``. + """ + import vmecpp # noqa: PLC0415 (lazy import avoids a circular import) + + wout = source.wout + nfp = int(wout.nfp) + ns_new = int(target_input.ns_array[-1]) + mpol_new = int(target_input.mpol) + ntor_new = int(target_input.ntor) + + src_xm = np.asarray(wout.xm, dtype=np.int64) + src_xn = np.asarray(wout.xn, dtype=np.int64) + dst_xm, dst_xn = _state_mode_table(mpol_new, ntor_new, nfp) + + new_wout = wout.model_copy(deep=True) + + # Geometry: remap the Fourier spectrum, then interpolate radially in sqrt(s). + for name in _STATE_GEOMETRY_FIELDS: + val = getattr(wout, name) + if val is None: + continue + remapped = _remap_modes(val, src_xm, src_xn, dst_xm, dst_xn) + setattr(new_wout, name, _radial_interpolate_geometry(remapped, dst_xm, ns_new)) + + # Magnetic axis: truncate or zero-pad in n. + for name in _WOUT_AXIS_FIELDS: + val = getattr(wout, name) + if val is None: + continue + setattr(new_wout, name, _remap_axis(val, ntor_new)) + + # Everything else that lives on the radial grid is recomputed on restart, so it + # only needs a consistent length; interpolate it so the wout stays self-coherent. + ns_old = int(wout.ns) + for name in type(wout).model_fields: + if name in _FIELDS_HANDLED_EXPLICITLY: + continue + val = getattr(wout, name) + if not isinstance(val, np.ndarray) or val.size == 0: + continue + if val.shape[-1] == ns_old: + setattr(new_wout, name, _radial_interpolate(val, ns_new)) + + new_wout.ns = ns_new + new_wout.mpol = mpol_new + new_wout.ntor = ntor_new + new_wout.mnmax = len(dst_xm) + new_wout.xm = dst_xm + new_wout.xn = dst_xn + + return vmecpp.VmecOutput( + input=target_input, + wout=new_wout, + jxbout=source.jxbout, + mercier=source.mercier, + threed1_volumetrics=source.threed1_volumetrics, + threed1_first_table=source.threed1_first_table, + threed1_geometric_magnetic=source.threed1_geometric_magnetic, + threed1_axis=source.threed1_axis, + threed1_betas=source.threed1_betas, + threed1_shafranov_integrals=source.threed1_shafranov_integrals, + ) + + +def _step_input( + base_input: VmecInput, ns: int, mpol: int, ntor: int, ftol: float, niter: int +) -> VmecInput: + """Build a single-resolution VmecInput for one continuation step. + + The boundary coefficients are truncated or zero-padded to ``(mpol, ntor)`` (the + ``VmecInput`` validator handles the 2D boundary; the axis is resized here), and the + schedule arrays are collapsed to the single value for this step. + """ + import vmecpp # noqa: PLC0415 (lazy import avoids a circular import) + + step = base_input.model_copy(deep=True) + step.mpol = int(mpol) + step.ntor = int(ntor) + step.ns_array = np.asarray([ns], dtype=np.int64) + step.ftol_array = np.asarray([ftol], dtype=float) + step.niter_array = np.asarray([niter], dtype=np.int64) + # Truncate or zero-pad the 2D boundary coefficients to the new (mpol, ntor). + for name in ("rbc", "zbs", "rbs", "zbc"): + val = getattr(step, name) + if val is not None: + setattr( + step, + name, + vmecpp.VmecInput.resize_2d_coeff( + np.asarray(val, dtype=float), mpol_new=mpol, ntor_new=ntor + ), + ) + # Truncate or zero-pad the axis arrays to the new ntor. + for name in _INPUT_AXIS_FIELDS: + val = getattr(step, name) + if val is not None: + setattr(step, name, _remap_axis(np.asarray(val, dtype=float), ntor)) + return step + + +def _run_fourier_continuation( + input: VmecInput, + magnetic_field: MagneticFieldResponseTable | None, + *, + max_threads: int | None, + verbose: bool | int | OutputMode, + restart_from: VmecOutput | None, +) -> VmecOutput: + """Solves an equilibrium by continuation in Fourier resolution. + + Called by :func:`vmecpp.run` whenever ``input.mpol`` and/or ``input.ntor`` is a + sequence rather than a plain int. Each entry pairs with the corresponding + ``input.ns_array`` entry (a scalar ``mpol``/``ntor`` broadcasts to every step). + Each step solves a single ``(ns, mpol, ntor)`` resolution and hot-restarts from + the previous step's solution interpolated to the new resolution (see + :func:`interpolate_solution`); if ``restart_from`` is given, it seeds the first + step instead of a cold start. + + Args: + input: the target configuration. Its boundary is the final-resolution + boundary; each step truncates or zero-pads it to that step's resolution. + magnetic_field, max_threads, verbose, restart_from: forwarded to + :func:`vmecpp.run` for every step (``restart_from`` only seeds the first). + + Returns: + The converged :class:`VmecOutput` at the final resolution, with ``input`` set + to the original (full-schedule) ``input`` argument. + """ + import vmecpp # noqa: PLC0415 (lazy import avoids a circular import) + + ns_schedule = [int(x) for x in input.ns_array] + n_steps = len(ns_schedule) + + def _resolve(value: int | np.ndarray, name: str) -> list[int]: + if isinstance(value, int): + return [value] * n_steps + resolved = [int(x) for x in value] + if len(resolved) != n_steps: + msg = ( + f"'{name}' has {len(resolved)} entries, but 'ns_array' has " + f"{n_steps}; a Fourier-resolution continuation schedule must have " + "one entry per ns_array step (or be a scalar, broadcast to every " + "step)." + ) + raise ValueError(msg) + return resolved + + mpol_schedule = _resolve(input.mpol, "mpol") + ntor_schedule = _resolve(input.ntor, "ntor") + ftol_schedule = [float(x) for x in input.ftol_array] + niter_schedule = [int(x) for x in input.niter_array] + + output = restart_from + for i in range(n_steps): + step_input = _step_input( + input, + ns_schedule[i], + mpol_schedule[i], + ntor_schedule[i], + ftol_schedule[i], + niter_schedule[i], + ) + guess = None if output is None else interpolate_solution(output, step_input) + output = vmecpp.run( + step_input, + magnetic_field, + max_threads=max_threads, + verbose=verbose, + restart_from=guess, + ) + + assert output is not None # n_steps >= 1, so the loop always assigns output + return output.model_copy(update={"input": input}) diff --git a/src/vmecpp/_iteration.py b/src/vmecpp/_iteration.py index b019a79fa..e54a8cfc5 100644 --- a/src/vmecpp/_iteration.py +++ b/src/vmecpp/_iteration.py @@ -259,7 +259,7 @@ def solve_equilibrium( iter2 = force_iteration - bad_resets # Evolve: forward model, then convergence / damping / time step. - model.evaluate(iter1, iter2) + model.evaluate(iter1, iter2, precondition=True, always_fix_m1_gauge=False) fsqr, fsqz, fsql = model.fsqr, model.fsqz, model.fsql rr = model.restart_reason finite = math.isfinite(fsqr) and math.isfinite(fsqz) and math.isfinite(fsql) diff --git a/src/vmecpp/cpp/MODULE.bazel.lock b/src/vmecpp/cpp/MODULE.bazel.lock index 139f15bda..ecc511a0b 100644 --- a/src/vmecpp/cpp/MODULE.bazel.lock +++ b/src/vmecpp/cpp/MODULE.bazel.lock @@ -9,9 +9,13 @@ "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", + "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1", + "https://bcr.bazel.build/modules/abseil-cpp/20260107.1/MODULE.bazel": "e33b3801443f5fd64465262084534115db76363df13d2168a42bbfacc747be81", + "https://bcr.bazel.build/modules/abseil-cpp/20260107.1/source.json": "7a9a88969b1e79268cf613728ca8ff8fa4bc4b1a9abee9ec1fb5f113ca751971", + "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", + "https://bcr.bazel.build/modules/apple_support/1.15.1/source.json": "517f2b77430084c541bc9be2db63fdcbb7102938c5f64c17ee60ffda2e5cf07b", "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", - "https://bcr.bazel.build/modules/apple_support/1.5.0/source.json": "eb98a7627c0bc486b57f598ad8da50f6625d974c8f723e9ea71bd39f709c9862", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", @@ -46,8 +50,10 @@ "https://bcr.bazel.build/modules/google_benchmark/1.8.2/source.json": "c5ec7882c4122369f645139400fa6a1ce5092cec12893bf90bcc32914a38508b", "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", + "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46", + "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", @@ -74,10 +80,13 @@ "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34", "https://bcr.bazel.build/modules/pybind11_bazel/3.0.0/MODULE.bazel": "a2bfa6020ed603a00d944161c63173c7f109774e99bee0c2cd8dbf24159f8134", "https://bcr.bazel.build/modules/pybind11_bazel/3.0.0/source.json": "d8f5104d4c21d272bf327ebe44366fb0b4c036cdaa1f5cceb21a408ca4ef2ef8", "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a", + "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4", + "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", @@ -134,6 +143,7 @@ "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", "https://bcr.bazel.build/modules/rules_python/0.34.0/MODULE.bazel": "1d623d026e075b78c9fde483a889cda7996f5da4f36dffb24c246ab30f06513a", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", "https://bcr.bazel.build/modules/rules_python/1.6.3/MODULE.bazel": "a7b80c42cb3de5ee2a5fa1abc119684593704fcd2fec83165ebe615dec76574f", @@ -158,7 +168,7 @@ "moduleExtensions": { "//third_party:non_module_deps.bzl%non_module_deps": { "general": { - "bzlTransitiveDigest": "6743Bvu2xD+elXHr9fABrgLuTNtruCDIY08uZzun/7c=", + "bzlTransitiveDigest": "LHWu22WbSgylrmipwwKLJyfbPCqnKqRqxWBQVMVVVOQ=", "usagesDigest": "K/CX77W1ZsxEL9QA1NwdwoaVteO5CO2nnGSFVQ1DqyQ=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -179,7 +189,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "build_file_content": "filegroup(\r\n name = \"all_srcs\",\r\n srcs = glob([\"**\"]),\r\n visibility = [\"//visibility:public\"],\r\n)\r\n", + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", "sha256": "df5ee33c74d5efb59738075ef96f4201588e1f1eeb233f047ac7fd1072dee1f6", "urls": [ "https://github.com/HDFGroup/hdf5/archive/refs/tags/hdf5-1_14_3.tar.gz" @@ -191,7 +201,7 @@ "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "build_file_content": "filegroup(\r\n name = \"all_srcs\",\r\n srcs = glob([\"**\"]),\r\n visibility = [\"//visibility:public\"],\r\n)\r\n", + "build_file_content": "filegroup(\n name = \"all_srcs\",\n srcs = glob([\"**\"]),\n visibility = [\"//visibility:public\"],\n)\n", "integrity": "sha256-mQ9G1JUl1qtdxCSfhoTG3ur1Teb+xjoYfp+zgswP/f8=", "urls": [ "https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.9.3.tar.gz" @@ -211,8 +221,8 @@ }, "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { "general": { - "bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=", - "usagesDigest": "+hz7IHWN6A1oVJJWNDB6yZRG+RYhF76wAYItpAeIUIg=", + "bzlTransitiveDigest": "ltCGFbl/LQQZXn/LEMXfKX7pGwyqNiOCHcmiQW0tmjM=", + "usagesDigest": "2Jj0sTGzjx2KfYRjWYbL6DZ1bi8HL2roIAGfOViiul8=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/src/vmecpp/cpp/docker/tsan/README.md b/src/vmecpp/cpp/docker/tsan/README.md index 33bd6bbe2..c60eea9a8 100644 --- a/src/vmecpp/cpp/docker/tsan/README.md +++ b/src/vmecpp/cpp/docker/tsan/README.md @@ -1,6 +1,6 @@ # OpenMP-aware ThreadSanitizer -This is a tutorial how to build `clang` and `libomp` with ThreadSanitizer (TSan) +This is a tutorial on how to build `clang` and `libomp` with ThreadSanitizer (TSan) support for being able to check OpenMP-parallelized C/C++ code. ## Perform ThreadSanitizer runs on code in the Proxima Fusion monorepo diff --git a/src/vmecpp/cpp/docker/tsan/background_info.md b/src/vmecpp/cpp/docker/tsan/background_info.md index 60035b0dc..0a3b9a58d 100644 --- a/src/vmecpp/cpp/docker/tsan/background_info.md +++ b/src/vmecpp/cpp/docker/tsan/background_info.md @@ -28,7 +28,7 @@ found here: - https://www.vi-hps.org/cms/upload/material/tw30/Archer.pdf (slide 8 and onwards) Turns out, this is **deprecated** as well and Archer was integrated into the -LLVM project in the mean time. +LLVM project in the meantime. This seems to be the **state of things as of Oct 2023**. Indeed, Archer can be found in the `llvm` source tree: @@ -46,7 +46,7 @@ https://packages.ubuntu.com/jammy/clang ## Setting up a first test case TL;DR: This is an example commonly presented as a case for data races. As will -be seen when running this example, the errornous output due to a data race is +be seen when running this example, the erroneous output due to a data race is not reliably reproduced. Thus, skip this section if you are looking for an example that breaks reliably. @@ -223,7 +223,7 @@ int main(int argc, char** argv) { } ``` -Compile it (for now without TSan to not clobber the console when things to +Compile it (for now without TSan to not clobber the console when things go sideways): ```bash @@ -313,7 +313,7 @@ Now run it (two threads should be enough to trigger the data race checks): OMP_NUM_THREADS=2 ./pi_example ``` -However, contrary to the expection, TSan report data races, even though the +However, contrary to the expectation, TSan reports data races, even though the result is always computed correctly: ``` @@ -427,7 +427,7 @@ Now, adjust the command line as requested: OMP_NUM_THREADS=1 ARCHER_OPTIONS='verbose=1' TSAN_OPTIONS='ignore_noninstrumented_modules=1' ./pi_example ``` -and we gete: +and we get: ``` Archer detected OpenMP application with TSan, supplying OpenMP synchronization semantics @@ -505,7 +505,7 @@ This is what we work on next. ## Build the stage1 demo using a custom toolchain -from: https://bazel.build/tutorials/ccp-toolchain-config +from: https://bazel.build/tutorials/cpp-toolchain-config This uses a system-provided `clang` installation (instead of the default compiler Bazel uses). @@ -529,7 +529,7 @@ bazel build --config=clang_config //abseil-hello:hello_main bazel-bin/abseil-hello/hello_main "from Abseil" ``` -Fixed by added `-lm` to standard linker flags. This was inspired by: +Fixed by adding `-lm` to standard linker flags. This was inspired by: https://github.com/bazelbuild/bazel/issues/934#issuecomment-193474914 Even the unit test works if a recent version of `googletest` is used: @@ -633,7 +633,7 @@ Delete the Bazel cache: bazel clean --expunge ``` -The PDF files of the slides mentioned in this articles are mirrored locally +The PDF files of the slides mentioned in this article are mirrored locally here: https://drive.google.com/drive/folders/1NBNTr4jDQy951CoG-AYqpDfKKpNKNSzh?usp=sharing diff --git a/src/vmecpp/cpp/util/netcdf_io/BUILD.bazel b/src/vmecpp/cpp/util/netcdf_io/BUILD.bazel index 2d02e19d4..5452bd619 100644 --- a/src/vmecpp/cpp/util/netcdf_io/BUILD.bazel +++ b/src/vmecpp/cpp/util/netcdf_io/BUILD.bazel @@ -7,8 +7,8 @@ cc_library( hdrs = ["netcdf_io.h"], visibility = ["//visibility:public"], deps = [ - "@abseil-cpp//absl/log:check", - "@abseil-cpp//absl/log:log", + "@abseil-cpp//absl/status", + "@abseil-cpp//absl/status:statusor", "@abseil-cpp//absl/strings", "@abseil-cpp//absl/strings:str_format", "//third_party/netcdf4", @@ -31,6 +31,7 @@ cc_test( ], deps = [ ":netcdf_io", + "@abseil-cpp//absl/status", "@googletest//:gtest_main", ], ) diff --git a/src/vmecpp/cpp/util/netcdf_io/netcdf_io.cc b/src/vmecpp/cpp/util/netcdf_io/netcdf_io.cc index 54c9340b0..eef621527 100644 --- a/src/vmecpp/cpp/util/netcdf_io/netcdf_io.cc +++ b/src/vmecpp/cpp/util/netcdf_io/netcdf_io.cc @@ -7,156 +7,213 @@ #include #include -#include "absl/log/check.h" -#include "absl/log/log.h" +#include "absl/status/status.h" +#include "absl/status/statusor.h" #include "absl/strings/ascii.h" #include "absl/strings/str_format.h" #include "netcdf.h" namespace netcdf_io { -bool NetcdfReadBool(int ncid, const std::string& variable_name) { - // VMEC uses `int` to store booleans: 0 means false, otherwise true. - // Also, the actual variable name is `__logical__`. - // AFAIK this is because NetCDF3 did not have a `boolean` data type. +namespace { - // find variable ID for given variable name +absl::StatusOr FindVariableId(int ncid, const std::string& variable_name) { int variable_id = 0; - CHECK_EQ( - nc_inq_varid(ncid, (variable_name + "__logical__").c_str(), &variable_id), - NC_NOERR) - << "variable '" << variable_name << "' not found"; + if (nc_inq_varid(ncid, variable_name.c_str(), &variable_id) != NC_NOERR) { + return absl::NotFoundError( + absl::StrFormat("variable '%s' not found", variable_name)); + } + return variable_id; +} - // figure out rank of data, i.e., how many dimensions does it have +absl::StatusOr GetVariableRank(int ncid, int variable_id, + const std::string& variable_name) { int rank = 0; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); + if (nc_inq_varndims(ncid, variable_id, &rank) != NC_NOERR) { + return absl::InternalError(absl::StrFormat( + "could not determine rank of variable '%s'", variable_name)); + } + return rank; +} - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 0) << "Not a rank-0 array: " << variable_name; +absl::StatusOr > GetVariableDimensions( + int ncid, int variable_id, int rank, const std::string& variable_name) { + std::vector dimension_ids(rank, 0); + if (nc_inq_vardimid(ncid, variable_id, dimension_ids.data()) != NC_NOERR) { + return absl::InternalError(absl::StrFormat( + "could not determine dimension ids of variable '%s'", variable_name)); + } - // actually read data - int variable_data = 0; - CHECK_EQ(nc_get_var_int(ncid, variable_id, &variable_data), NC_NOERR); + std::vector dimensions(rank, 0); + for (int i = 0; i < rank; ++i) { + size_t dimension = 0; + if (nc_inq_dimlen(ncid, dimension_ids[i], &dimension) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not determine dimension %d of variable '%s'", + i, variable_name)); + } + dimensions[i] = dimension; + } + return dimensions; +} - return (variable_data != 0); -} // NetcdfReadBool +} // namespace -char NetcdfReadChar(int ncid, const std::string& variable_name) { - // find variable ID for given variable name - int variable_id = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &variable_id), NC_NOERR) - << "variable '" << variable_name << "' not found"; +absl::StatusOr NetcdfReadBool(int ncid, + const std::string& variable_name) { + // VMEC uses `int` to store booleans: 0 means false, otherwise true. + // Also, the actual variable name is `__logical__`. + // AFAIK this is because NetCDF3 did not have a `boolean` data type. + const std::string logical_variable_name = variable_name + "__logical__"; - // figure out rank of data, i.e., how many dimensions does it have - int rank = 1; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); + absl::StatusOr variable_id = FindVariableId(ncid, logical_variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 1) << "Not a rank-1 array: " << variable_name; + absl::StatusOr rank = + GetVariableRank(ncid, *variable_id, logical_variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 0) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-0 array: %s", logical_variable_name)); + } - // figure out the dimension IDs - std::vector dimension_ids(rank, 0); - CHECK_EQ(nc_inq_vardimid(ncid, variable_id, dimension_ids.data()), NC_NOERR); + int variable_data = 0; + if (nc_get_var_int(ncid, *variable_id, &variable_data) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", logical_variable_name)); + } - // figure out dimension of data, i.e., length of string - std::vector dimensions(rank, 0); - size_t total_element_count = 1; - for (int i = 0; i < rank; ++i) { - size_t dimension = 0; - CHECK_EQ(nc_inq_dimlen(ncid, dimension_ids[i], &dimension), NC_NOERR); - dimensions[i] = dimension; - total_element_count *= dimension; + return variable_data != 0; +} // NetcdfReadBool + +absl::StatusOr NetcdfReadChar(int ncid, + const std::string& variable_name) { + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } + + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 1) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-1 array: %s", variable_name)); + } + + absl::StatusOr > dimensions = + GetVariableDimensions(ncid, *variable_id, *rank, variable_name); + if (!dimensions.ok()) { + return dimensions.status(); } // for a single char, make sure that the array dimension is 1 - CHECK_EQ(dimensions[0], (size_t)1) - << "Not a length-1 array: " << variable_name; + if ((*dimensions)[0] != 1) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a length-1 array: %s", variable_name)); + } // actually read data - std::vector read_start_indices(rank, 0); - std::vector variable_data(total_element_count, 0); - CHECK_EQ(nc_get_vara(ncid, variable_id, read_start_indices.data(), - dimensions.data(), variable_data.data()), - NC_NOERR); + std::vector read_start_indices(*rank, 0); + std::vector variable_data(1, 0); + if (nc_get_vara(ncid, *variable_id, read_start_indices.data(), + dimensions->data(), variable_data.data()) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } return variable_data[0]; } // NetcdfReadChar -int NetcdfReadInt(int ncid, const std::string& variable_name) { - // find variable ID for given variable name - int variable_id = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &variable_id), NC_NOERR) - << "variable '" << variable_name << "' not found"; - - // figure out rank of data, i.e., how many dimensions does it have - int rank = 0; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); +absl::StatusOr NetcdfReadInt(int ncid, const std::string& variable_name) { + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 0) << "Not a rank-0 array: " << variable_name; + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 0) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-0 array: %s", variable_name)); + } - // actually read data int variable_data = 0; - CHECK_EQ(nc_get_var_int(ncid, variable_id, &variable_data), NC_NOERR); + if (nc_get_var_int(ncid, *variable_id, &variable_data) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } return variable_data; } // NetcdfReadInt -double NetcdfReadDouble(int ncid, const std::string& variable_name) { - // find variable ID for given variable name - int variable_id = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &variable_id), NC_NOERR) - << "variable '" << variable_name << "' not found"; - - // figure out rank of data, i.e., how many dimensions does it have - int rank = 0; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); +absl::StatusOr NetcdfReadDouble(int ncid, + const std::string& variable_name) { + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 0) << "Not a rank-0 array: " << variable_name; + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 0) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-0 array: %s", variable_name)); + } - // actually read data double variable_data = 0; - CHECK_EQ(nc_get_var_double(ncid, variable_id, &variable_data), NC_NOERR); + if (nc_get_var_double(ncid, *variable_id, &variable_data) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } return variable_data; } // NetcdfReadDouble -std::string NetcdfReadString(int ncid, const std::string& variable_name) { - // find variable ID for given variable name - int varid = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &varid), NC_NOERR) - << "variable '" << variable_name << "' not found"; - - // figure out rank of data, i.e., how many dimensions does it have - int rank = 0; - CHECK_EQ(nc_inq_varndims(ncid, varid, &rank), NC_NOERR); +absl::StatusOr NetcdfReadString(int ncid, + const std::string& variable_name) { + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } // only accept one-dimensional array of CHAR for strings - CHECK_EQ(rank, 1) << "Not a rank-1 array: " << variable_name; - - // figure out the dimension IDs - std::vector dimension_ids(rank, 0); - CHECK_EQ(nc_inq_vardimid(ncid, varid, dimension_ids.data()), NC_NOERR); + if (*rank != 1) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-1 array: %s", variable_name)); + } - // figure out dimension of data, i.e., length of string - std::vector dimensions(rank, 0); - size_t total_element_count = 1; - for (int i = 0; i < rank; ++i) { - size_t dimension = 0; - CHECK_EQ(nc_inq_dimlen(ncid, dimension_ids[i], &dimension), NC_NOERR); - dimensions[i] = dimension; - total_element_count *= dimension; + absl::StatusOr > dimensions = + GetVariableDimensions(ncid, *variable_id, *rank, variable_name); + if (!dimensions.ok()) { + return dimensions.status(); } + size_t total_element_count = (*dimensions)[0]; + // actually read data - std::vector read_start_indices(rank, 0); + std::vector read_start_indices(*rank, 0); // one extra element that stays at 0 in order to properly zero-terminate the // string std::vector variable_data(total_element_count + 1, 0); - CHECK_EQ(nc_get_vara(ncid, varid, read_start_indices.data(), - dimensions.data(), variable_data.data()), - NC_NOERR); + if (nc_get_vara(ncid, *variable_id, read_start_indices.data(), + dimensions->data(), variable_data.data()) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } std::string string_from_char_array = std::string(variable_data.data()); // Strings are usually whitespace-padded when coming from Fortran @@ -164,78 +221,73 @@ std::string NetcdfReadString(int ncid, const std::string& variable_name) { return std::string(absl::StripAsciiWhitespace(string_from_char_array)); } // NetcdfReadString -std::vector NetcdfReadArray1D(int ncid, - const std::string& variable_name) { - // find variable ID for given variable name - int variable_id = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &variable_id), NC_NOERR) - << "variable '" << variable_name << "' not found"; - - // figure out rank of data, i.e., how many dimensions does it have - int rank = 1; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); - - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 1) << "Not a rank-1 array: " << variable_name; +absl::StatusOr > NetcdfReadArray1D( + int ncid, const std::string& variable_name) { + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } - // figure out the dimension IDs - std::vector dimension_ids(rank, 0); - CHECK_EQ(nc_inq_vardimid(ncid, variable_id, dimension_ids.data()), NC_NOERR); + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 1) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-1 array: %s", variable_name)); + } - // figure out dimension of data, i.e., length of string - std::vector dimensions(rank, 0); - size_t total_element_count = 1; - for (int i = 0; i < rank; ++i) { - size_t dimension = 0; - CHECK_EQ(nc_inq_dimlen(ncid, dimension_ids[i], &dimension), NC_NOERR); - dimensions[i] = dimension; - total_element_count *= dimension; + absl::StatusOr > dimensions = + GetVariableDimensions(ncid, *variable_id, *rank, variable_name); + if (!dimensions.ok()) { + return dimensions.status(); } - // actually read data - std::vector read_start_indices(rank, 0); + size_t total_element_count = (*dimensions)[0]; + + std::vector read_start_indices(*rank, 0); std::vector variable_data(total_element_count, 0.0); - CHECK_EQ(nc_get_vara(ncid, variable_id, read_start_indices.data(), - dimensions.data(), variable_data.data()), - NC_NOERR); + if (nc_get_vara(ncid, *variable_id, read_start_indices.data(), + dimensions->data(), variable_data.data()) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } return variable_data; } // NetcdfReadArray1D -std::vector > NetcdfReadArray2D( +absl::StatusOr > > NetcdfReadArray2D( int ncid, const std::string& variable_name) { - // find variable ID for given variable name - int variable_id = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &variable_id), NC_NOERR) - << "variable '" << variable_name << "' not found"; - - // figure out rank of data, i.e., how many dimensions does it have - int rank = 1; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); - - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 2) << "Not a rank-2 array: " << variable_name; + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } - // figure out the dimension IDs - std::vector dimension_ids(rank, 0); - CHECK_EQ(nc_inq_vardimid(ncid, variable_id, dimension_ids.data()), NC_NOERR); + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 2) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-2 array: %s", variable_name)); + } - // figure out dimension of data, i.e., length of string - std::vector dimensions(rank, 0); - size_t total_element_count = 1; - for (int i = 0; i < rank; ++i) { - size_t dimension = 0; - CHECK_EQ(nc_inq_dimlen(ncid, dimension_ids[i], &dimension), NC_NOERR); - dimensions[i] = dimension; - total_element_count *= dimension; + absl::StatusOr > dimensions_or = + GetVariableDimensions(ncid, *variable_id, *rank, variable_name); + if (!dimensions_or.ok()) { + return dimensions_or.status(); } + auto dimensions = dimensions_or.value(); - // actually read data - std::vector read_start_indices(rank, 0); + size_t total_element_count = dimensions[0] * dimensions[1]; + + std::vector read_start_indices(*rank, 0); std::vector variable_data(total_element_count, 0.0); - CHECK_EQ(nc_get_vara(ncid, variable_id, read_start_indices.data(), - dimensions.data(), variable_data.data()), - NC_NOERR); + if (nc_get_vara(ncid, *variable_id, read_start_indices.data(), + dimensions.data(), variable_data.data()) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } // copy from flattened vector into two-dimensional vector of vectors std::vector > two_dimensional_data(dimensions[0]); @@ -249,40 +301,37 @@ std::vector > NetcdfReadArray2D( return two_dimensional_data; } // NetcdfReadArray2D -std::vector > > NetcdfReadArray3D( - int ncid, const std::string& variable_name) { - // find variable ID for given variable name - int variable_id = 0; - CHECK_EQ(nc_inq_varid(ncid, variable_name.c_str(), &variable_id), NC_NOERR) - << "variable '" << variable_name << "' not found"; - - // figure out rank of data, i.e., how many dimensions does it have - int rank = 1; - CHECK_EQ(nc_inq_varndims(ncid, variable_id, &rank), NC_NOERR); - - // only accept zero-dimensional array for scalar - CHECK_EQ(rank, 3) << "Not a rank-3 array: " << variable_name; +absl::StatusOr > > > +NetcdfReadArray3D(int ncid, const std::string& variable_name) { + absl::StatusOr variable_id = FindVariableId(ncid, variable_name); + if (!variable_id.ok()) { + return variable_id.status(); + } - // figure out the dimension IDs - std::vector dimension_ids(rank, 0); - CHECK_EQ(nc_inq_vardimid(ncid, variable_id, dimension_ids.data()), NC_NOERR); + absl::StatusOr rank = GetVariableRank(ncid, *variable_id, variable_name); + if (!rank.ok()) { + return rank.status(); + } + if (*rank != 3) { + return absl::InvalidArgumentError( + absl::StrFormat("Not a rank-3 array: %s", variable_name)); + } - // figure out dimension of data, i.e., length of string - std::vector dimensions(rank, 0); - size_t total_element_count = 1; - for (int i = 0; i < rank; ++i) { - size_t dimension = 0; - CHECK_EQ(nc_inq_dimlen(ncid, dimension_ids[i], &dimension), NC_NOERR); - dimensions[i] = dimension; - total_element_count *= dimension; + absl::StatusOr > dimensions_or = + GetVariableDimensions(ncid, *variable_id, *rank, variable_name); + if (!dimensions_or.ok()) { + return dimensions_or.status(); } + auto dimensions = dimensions_or.value(); - // actually read data - std::vector read_start_indices(rank, 0); + size_t total_element_count = dimensions[0] * dimensions[1] * dimensions[2]; + std::vector read_start_indices(*rank, 0); std::vector variable_data(total_element_count, 0.0); - CHECK_EQ(nc_get_vara(ncid, variable_id, read_start_indices.data(), - dimensions.data(), variable_data.data()), - NC_NOERR); + if (nc_get_vara(ncid, *variable_id, read_start_indices.data(), + dimensions.data(), variable_data.data()) != NC_NOERR) { + return absl::InternalError( + absl::StrFormat("could not read variable '%s'", variable_name)); + } // copy from flattened vector into three-dimensional vector of vectors std::vector > > three_dimensional_data( diff --git a/src/vmecpp/cpp/util/netcdf_io/netcdf_io.h b/src/vmecpp/cpp/util/netcdf_io/netcdf_io.h index fc2fc2f67..87d189823 100644 --- a/src/vmecpp/cpp/util/netcdf_io/netcdf_io.h +++ b/src/vmecpp/cpp/util/netcdf_io/netcdf_io.h @@ -8,44 +8,48 @@ #include #include +#include "absl/status/statusor.h" + namespace netcdf_io { // Read a scalar `bool` variable in Fortran VMEC style from the (opened) NetCDF // file identified by `ncid`. It is expected that the value is stored in a // scalar `int` variable named `__logical__`. -bool NetcdfReadBool(int ncid, const std::string& variable_name); +absl::StatusOr NetcdfReadBool(int ncid, const std::string& variable_name); // Read a scalar `char` variable from the (opened) NetCDF file identified by // `ncid`. It is expected that the value is stored in a length-1 `char` array. -char NetcdfReadChar(int ncid, const std::string& variable_name); +absl::StatusOr NetcdfReadChar(int ncid, const std::string& variable_name); // Read a scalar `int` variable from the (opened) NetCDF file identified by // `ncid`. -int NetcdfReadInt(int ncid, const std::string& variable_name); +absl::StatusOr NetcdfReadInt(int ncid, const std::string& variable_name); // Read a scalar `double` variable from the (opened) NetCDF file identified by // `ncid`. -double NetcdfReadDouble(int ncid, const std::string& variable_name); +absl::StatusOr NetcdfReadDouble(int ncid, + const std::string& variable_name); // Read a string from the (opened) NetCDF file identified by `ncid`. // It is expected that the data is stored as a rank-1 `char` array. // Whitespace at the start and end of the `char` array is stripped. -std::string NetcdfReadString(int ncid, const std::string& variable_name); +absl::StatusOr NetcdfReadString(int ncid, + const std::string& variable_name); // Read a rank-1 `double` array from the (opened) NetCDF file identified by // `ncid`. -std::vector NetcdfReadArray1D(int ncid, - const std::string& variable_name); +absl::StatusOr > NetcdfReadArray1D( + int ncid, const std::string& variable_name); // Read a rank-2 `double` array from the (opened) NetCDF file identified by // `ncid`. -std::vector > NetcdfReadArray2D( +absl::StatusOr > > NetcdfReadArray2D( int ncid, const std::string& variable_name); // Read a rank-3 `double` array from the (opened) NetCDF file identified by // `ncid`. -std::vector > > NetcdfReadArray3D( - int ncid, const std::string& variable_name); +absl::StatusOr > > > +NetcdfReadArray3D(int ncid, const std::string& variable_name); } // namespace netcdf_io diff --git a/src/vmecpp/cpp/util/netcdf_io/netcdf_io_test.cc b/src/vmecpp/cpp/util/netcdf_io/netcdf_io_test.cc index 8afab1824..d23391702 100644 --- a/src/vmecpp/cpp/util/netcdf_io/netcdf_io_test.cc +++ b/src/vmecpp/cpp/util/netcdf_io/netcdf_io_test.cc @@ -9,6 +9,7 @@ #include #include +#include "absl/status/status.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -22,9 +23,10 @@ TEST(TestNetcdfIO, CheckReadBool) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - const bool lasym = NetcdfReadBool(ncid, "lasym"); + absl::StatusOr lasym = NetcdfReadBool(ncid, "lasym"); - EXPECT_FALSE(lasym); + ASSERT_TRUE(lasym.ok()); + EXPECT_FALSE(*lasym); ASSERT_EQ(nc_close(ncid), NC_NOERR); } // CheckReadBool @@ -35,9 +37,10 @@ TEST(TestNetcdfIO, CheckReadChar) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - const char mgrid_mode = NetcdfReadChar(ncid, "mgrid_mode"); + absl::StatusOr mgrid_mode = NetcdfReadChar(ncid, "mgrid_mode"); - EXPECT_EQ(mgrid_mode, 'R'); + ASSERT_TRUE(mgrid_mode.ok()); + EXPECT_EQ(*mgrid_mode, 'R'); ASSERT_EQ(nc_close(ncid), NC_NOERR); } // CheckReadChar @@ -48,22 +51,38 @@ TEST(TestNetcdfIO, CheckReadInt) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - const int nfp = NetcdfReadInt(ncid, "nfp"); + absl::StatusOr nfp = NetcdfReadInt(ncid, "nfp"); - EXPECT_EQ(nfp, 5); + ASSERT_TRUE(nfp.ok()); + EXPECT_EQ(*nfp, 5); ASSERT_EQ(nc_close(ncid), NC_NOERR); } // CheckReadInt +TEST(TestNetcdfIO, CheckReadIntMissingVariable) { + const std::string example_netcdf = "util/netcdf_io/example_netcdf.nc"; + + int ncid = 0; + ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); + + absl::StatusOr missing = NetcdfReadInt(ncid, "does_not_exist"); + + EXPECT_FALSE(missing.ok()); + EXPECT_EQ(missing.status().code(), absl::StatusCode::kNotFound); + + ASSERT_EQ(nc_close(ncid), NC_NOERR); +} // CheckReadIntMissingVariable + TEST(TestNetcdfIO, CheckReadDouble) { const std::string example_netcdf = "util/netcdf_io/example_netcdf.nc"; int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - const double ftolv = NetcdfReadDouble(ncid, "ftolv"); + absl::StatusOr ftolv = NetcdfReadDouble(ncid, "ftolv"); - EXPECT_EQ(ftolv, 1.0e-10); + ASSERT_TRUE(ftolv.ok()); + EXPECT_EQ(*ftolv, 1.0e-10); ASSERT_EQ(nc_close(ncid), NC_NOERR); } // CheckReadDouble @@ -74,9 +93,10 @@ TEST(TestNetcdfIO, CheckReadString) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - const std::string mgrid_file = NetcdfReadString(ncid, "mgrid_file"); + absl::StatusOr mgrid_file = NetcdfReadString(ncid, "mgrid_file"); - EXPECT_EQ(mgrid_file, "mgrid_cth_like.nc"); + ASSERT_TRUE(mgrid_file.ok()); + EXPECT_EQ(*mgrid_file, "mgrid_cth_like.nc"); ASSERT_EQ(nc_close(ncid), NC_NOERR); } // CheckReadString @@ -87,7 +107,9 @@ TEST(TestNetcdfIO, CheckReadArray1D) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - std::vector am = NetcdfReadArray1D(ncid, "am"); + absl::StatusOr > am = NetcdfReadArray1D(ncid, "am"); + + ASSERT_TRUE(am.ok()); // `am` is stored in the wout file with its default (maximum) length // and only the first few (relevant) entries are actually populated. @@ -96,7 +118,7 @@ TEST(TestNetcdfIO, CheckReadArray1D) { reference_am[1] = 5.0; reference_am[2] = 10.0; - EXPECT_THAT(am, ElementsAreArray(reference_am)); + EXPECT_THAT(*am, ElementsAreArray(reference_am)); ASSERT_EQ(nc_close(ncid), NC_NOERR); } // CheckReadArray1D @@ -107,14 +129,17 @@ TEST(TestNetcdfIO, CheckReadArray2D) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - std::vector > rmnc = NetcdfReadArray2D(ncid, "rmnc"); + absl::StatusOr > > rmnc = + NetcdfReadArray2D(ncid, "rmnc"); + + ASSERT_TRUE(rmnc.ok()); std::vector > reference_rmnc = {{0.0, 1.0, 2.0}, {0.1, 1.1, 2.1}}; - ASSERT_EQ(rmnc.size(), reference_rmnc.size()); + ASSERT_EQ(rmnc->size(), reference_rmnc.size()); for (size_t i = 0; i < reference_rmnc.size(); ++i) { - EXPECT_THAT(rmnc[i], ElementsAreArray(reference_rmnc[i])); + EXPECT_THAT((*rmnc)[i], ElementsAreArray(reference_rmnc[i])); } ASSERT_EQ(nc_close(ncid), NC_NOERR); @@ -126,9 +151,11 @@ TEST(TestNetcdfIO, CheckReadArray3D) { int ncid = 0; ASSERT_EQ(nc_open(example_netcdf.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - std::vector > > br_001 = + absl::StatusOr > > > br_001 = NetcdfReadArray3D(ncid, "br_001"); + ASSERT_TRUE(br_001.ok()); + std::vector > > reference_br_001 = { {{0.00, 0.01, 0.02, 0.03}, {0.10, 0.11, 0.12, 0.13}, @@ -137,11 +164,11 @@ TEST(TestNetcdfIO, CheckReadArray3D) { {1.10, 1.11, 1.12, 1.13}, {1.20, 1.21, 1.22, 1.23}}}; - ASSERT_EQ(br_001.size(), reference_br_001.size()); + ASSERT_EQ(br_001->size(), reference_br_001.size()); for (size_t i = 0; i < reference_br_001.size(); ++i) { - ASSERT_EQ(br_001[i].size(), reference_br_001[i].size()); + ASSERT_EQ((*br_001)[i].size(), reference_br_001[i].size()); for (size_t j = 0; j < reference_br_001[i].size(); ++j) { - EXPECT_THAT(br_001[i][j], ElementsAreArray(reference_br_001[i][j])); + EXPECT_THAT((*br_001)[i][j], ElementsAreArray(reference_br_001[i][j])); } } diff --git a/src/vmecpp/cpp/vmecpp/common/CMakeLists.txt b/src/vmecpp/cpp/vmecpp/common/CMakeLists.txt index ef739f391..8a6e325ff 100644 --- a/src/vmecpp/cpp/vmecpp/common/CMakeLists.txt +++ b/src/vmecpp/cpp/vmecpp/common/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(composed_types_definition) add_subdirectory(composed_types_lib) add_subdirectory(flow_control) +add_subdirectory(fourier_basis) add_subdirectory(fourier_basis_fast_poloidal) add_subdirectory(fourier_basis_fast_toroidal) add_subdirectory(magnetic_configuration_definition) diff --git a/src/vmecpp/cpp/vmecpp/common/enzyme/local_force_hessian_test.cc b/src/vmecpp/cpp/vmecpp/common/enzyme/local_force_hessian_test.cc new file mode 100644 index 000000000..302f0eb93 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/common/enzyme/local_force_hessian_test.cc @@ -0,0 +1,315 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT + +// Exact Hessian of VMEC's local force map via composed autodiff. +// +// The shared force-chain kernels (Jacobian, metric, B^contra, B_cov, magnetic +// pressure, MHD force density, and the hybrid lambda force) compose into the +// local map +// g : real-space geometry -> real-space force density, +// the nonlinear core of VMEC's force. The full force is Táµ€ . g . T with the +// linear spectral transforms T, Táµ€; the exact force Hessian-vector product is +// therefore Táµ€ . J_g . T . v, and J_g is what Enzyme provides here. The +// remaining augmented term, the spectral-condensation constraint force, also +// carries a linear Fourier bandpass and is validated end-to-end against the +// finite-difference HVP in the pybind exact-HVP path. +// +// This test composes the production kernels over flat buffers and takes the +// Jacobian of g by forward and reverse mode, checks both against central finite +// differences and against each other. + +#include +#include +#include +#include +#include +#include + +#include "vmecpp/common/enzyme/enzyme.h" +#include "vmecpp/vmec/ideal_mhd_model/bco_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/bcontra_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/jacobian_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/lambda_force_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/metric_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/mhdforce_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/pressure_kernel.h" + +// Problem dimensions and the constant (non-differentiated) context. +struct Ctx { + int nZnT, nsH; // half-grid surfaces; full-grid has nsH + 1 + int nFull, nHalf; // (nsH+1)*nZnT, nsH*nZnT + const double* sqrtSF; // [nsH+1] + const double* sqrtSH; // [nsH] + const double* chipH; // [nsH] + const double* presH; // [nsH] + const double* radialBlending; // [nsH+1] + double deltaS; + double lamscale; + bool lthreed; +}; + +// 16 geometry blocks (each nFull) packed into geom; force blocks (each nHalf): +// 12 MHD force-density blocks + 4 lambda-force blocks (blmn_e/o, clmn_e/o). +// Everything else is intermediate work sliced from work. +enum { kGeomBlocks = 16, kForceBlocks = 16 }; + +// g: geometry -> force density, composing the MHD and lambda-force kernels. +__attribute__((noinline)) void LocalForce(const double* geom, double* work, + double* force, const Ctx* c) { + const int nF = c->nFull; + const int nH = c->nHalf; + const int nZnT = c->nZnT, nsH = c->nsH; + // geometry blocks + const double* r1e = geom + 0 * nF; + const double* r1o = geom + 1 * nF; + const double* z1e = geom + 2 * nF; + const double* z1o = geom + 3 * nF; + const double* rue = geom + 4 * nF; + const double* ruo = geom + 5 * nF; + const double* zue = geom + 6 * nF; + const double* zuo = geom + 7 * nF; + const double* rve = geom + 8 * nF; + const double* rvo = geom + 9 * nF; + const double* zve = geom + 10 * nF; + const double* zvo = geom + 11 * nF; + const double* lue = geom + 12 * nF; + const double* luo = geom + 13 * nF; + const double* lve = geom + 14 * nF; + const double* lvo = geom + 15 * nF; + // half-grid intermediates from work + double* p = work; + double* r12 = p; + p += nH; + double* ru12 = p; + p += nH; + double* zu12 = p; + p += nH; + double* rs = p; + p += nH; + double* zs = p; + p += nH; + double* tau = p; + p += nH; + double* gsqrt = p; + p += nH; + double* guu = p; + p += nH; + double* guv = p; + p += nH; + double* gvv = p; + p += nH; + double* bsupu = p; + p += nH; + double* bsupv = p; + p += nH; + double* bsubu = p; + p += nH; + double* bsubv = p; + p += nH; + double* tp = p; + p += nH; + // per-nZnT scratch for the force kernel (26 blocks) + double* sc = p; // 26 * nZnT + + vmecpp::ComputeHalfGridJacobian( + r1e, r1o, z1e, z1o, rue, ruo, zue, zuo, c->sqrtSH, c->deltaS, + /*dSHalfDsInterp=*/0.25, nZnT, 0, 0, nsH, r12, ru12, zu12, rs, zs, tau); + vmecpp::ComputeMetricElements(r1e, r1o, rue, ruo, zue, zuo, rve, rvo, zve, + zvo, tau, r12, c->sqrtSF, c->sqrtSH, c->lthreed, + nZnT, 0, 0, nsH, gsqrt, guu, guv, gvv); + vmecpp::ComputeBsupContra(lue, luo, lve, lvo, gsqrt, c->sqrtSH, c->lthreed, + nZnT, 0, 0, nsH, bsupu, bsupv); + for (int jH = 0; jH < nsH; ++jH) { + for (int kl = 0; kl < nZnT; ++kl) { + const int ih = jH * nZnT + kl; + bsupu[ih] += c->chipH[jH] / gsqrt[ih]; + } + } + vmecpp::ComputeBCo(guu, guv, gvv, bsupu, bsupv, c->lthreed, nH, bsubu, bsubv); + vmecpp::ComputeMagneticPressure(bsupu, bsubu, bsupv, bsubv, nH, tp); + for (int jH = 0; jH < nsH; ++jH) { + for (int kl = 0; kl < nZnT; ++kl) tp[jH * nZnT + kl] += c->presH[jH]; + } + double* s = sc; + double* P_i = s; + s += nZnT; + double* rup_i = s; + s += nZnT; + double* zup_i = s; + s += nZnT; + double* rsp_i = s; + s += nZnT; + double* zsp_i = s; + s += nZnT; + double* taup_i = s; + s += nZnT; + double* gbubu_i = s; + s += nZnT; + double* gbubv_i = s; + s += nZnT; + double* gbvbv_i = s; + s += nZnT; + double* P_o = s; + s += nZnT; + double* rup_o = s; + s += nZnT; + double* zup_o = s; + s += nZnT; + double* rsp_o = s; + s += nZnT; + double* zsp_o = s; + s += nZnT; + double* taup_o = s; + s += nZnT; + double* gbubu_o = s; + s += nZnT; + double* gbubv_o = s; + s += nZnT; + double* gbvbv_o = s; + s += nZnT; + double* P_avg = s; + s += nZnT; + double* P_wavg = s; + s += nZnT; + double* gbubu_avg = s; + s += nZnT; + double* gbubu_wavg = s; + s += nZnT; + double* gbvbv_avg = s; + s += nZnT; + double* gbvbv_wavg = s; + s += nZnT; + double* gbubv_avg = s; + s += nZnT; + double* gbubv_wavg = s; + s += nZnT; + // lambda-force radial-sweep scratch (carried inside half-grid point) + double* bsubu_i = s; + s += nZnT; + double* bsubv_i = s; + s += nZnT; + double* gvv_gsqrt_i = s; + s += nZnT; + double* guv_bsupu_i = s; + s += nZnT; + double* armn_e = force + 0 * nH; + double* armn_o = force + 1 * nH; + double* azmn_e = force + 2 * nH; + double* azmn_o = force + 3 * nH; + double* brmn_e = force + 4 * nH; + double* brmn_o = force + 5 * nH; + double* bzmn_e = force + 6 * nH; + double* bzmn_o = force + 7 * nH; + double* crmn_e = force + 8 * nH; + double* crmn_o = force + 9 * nH; + double* czmn_e = force + 10 * nH; + double* czmn_o = force + 11 * nH; + vmecpp::ComputeMHDForceDensity( + r1e, r1o, rue, ruo, zue, zuo, z1o, rve, rvo, zve, zvo, r12, ru12, zu12, + rs, zs, tau, tp, gsqrt, bsupu, bsupv, c->sqrtSF, c->sqrtSH, P_i, rup_i, + zup_i, rsp_i, zsp_i, taup_i, gbubu_i, gbubv_i, gbvbv_i, P_o, rup_o, zup_o, + rsp_o, zsp_o, taup_o, gbubu_o, gbubv_o, gbvbv_o, P_avg, P_wavg, gbubu_avg, + gbubu_wavg, gbvbv_avg, gbvbv_wavg, gbubv_avg, gbubv_wavg, c->deltaS, nZnT, + /*nsMinF=*/0, 0, 0, nsH, /*jMaxRZ=*/nsH, c->lthreed, armn_e, armn_o, + azmn_e, azmn_o, brmn_e, brmn_o, bzmn_e, bzmn_o, crmn_e, crmn_o, czmn_e, + czmn_o); + // lambda force (blmn_e/o, clmn_e/o) from the shared kernel + double* blmn_e = force + 12 * nH; + double* blmn_o = force + 13 * nH; + double* clmn_e = force + 14 * nH; + double* clmn_o = force + 15 * nH; + vmecpp::ComputeHybridLambdaForce( + bsubu, bsubv, gvv, gsqrt, guv, bsupu, lue, luo, c->sqrtSH, c->sqrtSF, + c->radialBlending, c->lamscale, c->lthreed, nZnT, /*nsMinF=*/0, + /*nsMinF1=*/0, /*nsMinH=*/0, nsH, /*nsMaxFIncludingLcfs=*/nsH, bsubu_i, + bsubv_i, gvv_gsqrt_i, guv_bsupu_i, blmn_e, blmn_o, clmn_e, clmn_o); +} + +// Scalar objective L = 0.5 ||force||^2; work and force are caller-owned +// scratch. +__attribute__((noinline)) double Loss(const double* geom, double* work, + double* force, const Ctx* c) { + LocalForce(geom, work, force, c); + const int n = kForceBlocks * c->nHalf; + double s = 0.0; + for (int i = 0; i < n; ++i) s += 0.5 * force[i] * force[i]; + return s; +} + +int main() { + const int nZnT = 24, nsH = 8; + Ctx c; + c.nZnT = nZnT; + c.nsH = nsH; + c.nFull = (nsH + 1) * nZnT; + c.nHalf = nsH * nZnT; + c.deltaS = 0.1; + c.lamscale = 0.7; + c.lthreed = true; + std::mt19937 rng(3); + std::uniform_real_distribution d(0.5, 1.5), s(-1.0, 1.0); + std::vector sqrtSF(nsH + 1), sqrtSH(nsH), chipH(nsH), presH(nsH), + radialBlending(nsH + 1); + for (int j = 0; j <= nsH; ++j) { + sqrtSF[j] = std::sqrt(0.05 + 0.9 * j / nsH); + radialBlending[j] = 0.3 + 0.4 * j / nsH; + } + for (int j = 0; j < nsH; ++j) { + sqrtSH[j] = std::sqrt(0.05 + 0.9 * (j + 0.5) / nsH); + chipH[j] = 0.3 + 0.1 * j; + presH[j] = 0.2 + 0.05 * j; + } + c.sqrtSF = sqrtSF.data(); + c.sqrtSH = sqrtSH.data(); + c.chipH = chipH.data(); + c.presH = presH.data(); + c.radialBlending = radialBlending.data(); + + const int nG = kGeomBlocks * c.nFull; + const int nW = 15 * c.nHalf + 30 * nZnT; + const int nFc = kForceBlocks * c.nHalf; + std::vector geom(nG), v(nG); + for (double& x : geom) x = d(rng); + for (double& x : v) x = s(rng); + std::vector work(nW, 0.0), dwork(nW, 0.0), force(nFc, 0.0), + dforce(nFc, 0.0), grev(nG, 0.0); + + // Reverse mode: full gradient dL/dgeom. + __enzyme_autodiff((void*)Loss, enzyme_dup, geom.data(), grev.data(), + enzyme_dup, work.data(), dwork.data(), enzyme_dup, + force.data(), dforce.data(), enzyme_const, &c); + // Forward mode: directional derivative dL.v. + const double dfwd = __enzyme_fwddiff( + (void*)Loss, enzyme_dup, geom.data(), v.data(), enzyme_dup, work.data(), + dwork.data(), enzyme_dup, force.data(), dforce.data(), enzyme_const, &c); + + const double h = 1e-6; + std::vector gp(geom), gm(geom), w2(nW), f2(nFc); + for (int i = 0; i < nG; ++i) { + gp[i] = geom[i] + h * v[i]; + gm[i] = geom[i] - h * v[i]; + } + const double dfd = (Loss(gp.data(), w2.data(), f2.data(), &c) - + Loss(gm.data(), w2.data(), f2.data(), &c)) / + (2 * h); + const double drev = + std::inner_product(grev.begin(), grev.end(), v.begin(), 0.0); + const double scale = std::fabs(dfd) + 1e-300; + + printf("exact Hessian of VMEC local force map (MHD + lambda kernels)\n"); + printf(" geom dofs=%d force outputs=%d\n", nG, nFc); + printf(" reverse dL.v vs finite-diff : %.2e\n", + std::fabs(drev - dfd) / scale); + printf(" forward dL.v vs finite-diff : %.2e\n", + std::fabs(dfwd - dfd) / scale); + printf(" forward / reverse agreement : %.2e\n", + std::fabs(dfwd - drev) / (std::fabs(drev) + 1e-300)); + + const bool ok = std::fabs(drev - dfd) < 1e-5 * scale && + std::fabs(dfwd - dfd) < 1e-5 * scale && + std::fabs(dfwd - drev) < 1e-9 * (std::fabs(drev) + 1e-300); + printf("%s\n", ok ? "PASS" : "FAIL"); + return ok ? 0 : 1; +} diff --git a/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.cc b/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.cc index ae577452c..70a013022 100644 --- a/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.cc +++ b/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.cc @@ -60,6 +60,7 @@ FlowControl::FlowControl(bool lfreeb, double delt, int num_grids, ijacob = 0; restart_reason = RestartReason::NO_RESTART; res0 = -1; + res1 = -1; delt0r = delt; multi_ns_grid = num_grids; neqs_old = 0; diff --git a/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.h b/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.h index dd4900572..ab7e2cb79 100644 --- a/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.h +++ b/src/vmecpp/cpp/vmecpp/common/flow_control/flow_control.h @@ -107,7 +107,11 @@ class FlowControl { // occurred) std::vector restart_reasons; + // Running minimum of the preconditioned residual sum (fsq). double res0; + // Running minimum of the invariant residual sum (fsqr + fsqz + fsql); used + // only by the PARVMEC time-step control. + double res1; Eigen::Vector3d fResInvar; Eigen::Vector3d fResPrecd; diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis/BUILD.bazel b/src/vmecpp/cpp/vmecpp/common/fourier_basis/BUILD.bazel new file mode 100644 index 000000000..6ea1c2176 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis/BUILD.bazel @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_library( + name = "fourier_basis", + srcs = ["fourier_basis.cc"], + hdrs = ["fourier_basis.h"], + visibility = ["//visibility:public"], + deps = [ + "@abseil-cpp//absl/algorithm:container", + "@abseil-cpp//absl/log:check", + "@abseil-cpp//absl/strings:str_format", + "//vmecpp/common/util:util", + "//vmecpp/common/sizes:sizes", + ], +) diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis/CMakeLists.txt b/src/vmecpp/cpp/vmecpp/common/fourier_basis/CMakeLists.txt new file mode 100644 index 000000000..360a82747 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis/CMakeLists.txt @@ -0,0 +1,5 @@ +list (APPEND vmecpp_sources + ${CMAKE_CURRENT_SOURCE_DIR}/fourier_basis.cc + ${CMAKE_CURRENT_SOURCE_DIR}/fourier_basis.h +) +set (vmecpp_sources "${vmecpp_sources}" PARENT_SCOPE) diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.cc b/src/vmecpp/cpp/vmecpp/common/fourier_basis/fourier_basis.cc similarity index 70% rename from src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.cc rename to src/vmecpp/cpp/vmecpp/common/fourier_basis/fourier_basis.cc index 40a727889..85d3b6551 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.cc +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis/fourier_basis.cc @@ -2,7 +2,7 @@ // // // SPDX-License-Identifier: MIT -#include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" +#include "vmecpp/common/fourier_basis/fourier_basis.h" #include #include @@ -13,7 +13,8 @@ namespace vmecpp { -FourierBasisFastPoloidal::FourierBasisFastPoloidal(const Sizes* s) : s_(*s) { +template +FourierBasis::FourierBasis(const Sizes* s) : s_(*s) { mscale.resize(s_.mnyq2 + 1); nscale.resize(s_.nnyq2 + 1); @@ -31,7 +32,7 @@ FourierBasisFastPoloidal::FourierBasisFastPoloidal(const Sizes* s) : s_(*s) { cosnvn.resize((s_.nnyq2 + 1) * s_.nZeta); sinnvn.resize((s_.nnyq2 + 1) * s_.nZeta); - computeFourierBasisFastPoloidal(s_.nfp); + computeFourierBasis(s_.nfp); // ----------------- @@ -51,7 +52,8 @@ FourierBasisFastPoloidal::FourierBasisFastPoloidal(const Sizes* s) : s_(*s) { s_.mnyq + 1, s_.nfp); } -void FourierBasisFastPoloidal::computeFourierBasisFastPoloidal(int nfp) { +template +void FourierBasis::computeFourierBasis(int nfp) { static constexpr double kTwoPi = 2.0 * M_PI; // Fourier transforms are always computed in VMEC @@ -77,7 +79,8 @@ void FourierBasisFastPoloidal::computeFourierBasisFastPoloidal(int nfp) { for (int l = 0; l < s_.nThetaReduced; ++l) { // need to compute theta grid using _full_ number of theta points! const double theta = kTwoPi * l / s_.nThetaEven; - const int idx_ml = m * s_.nThetaReduced + l; + const int idx_ml = + Layout::PoloidalBasisIndex(m, l, s_.mnyq2 + 1, s_.nThetaReduced); const double arg = m * theta; @@ -118,7 +121,8 @@ void FourierBasisFastPoloidal::computeFourierBasisFastPoloidal(int nfp) { for (int k = 0; k < s_.nZeta; ++k) { const double zeta = kTwoPi * k / s_.nZeta; for (int n = 0; n < s_.nnyq2 + 1; ++n) { - const int idx_kn = k * (s_.nnyq2 + 1) + n; + const int idx_kn = + Layout::ToroidalBasisIndex(n, k, s_.nnyq2 + 1, s_.nZeta); const double arg = n * zeta; @@ -134,10 +138,11 @@ void FourierBasisFastPoloidal::computeFourierBasisFastPoloidal(int nfp) { } // convert cos(xm[mn] theta - xn[mn] zeta) into 2D FC array form -int FourierBasisFastPoloidal::cos_to_cc_ss(const std::span fcCos, - std::span m_fcCC, - std::span m_fcSS, int n_size, - int m_size) const { +template +int FourierBasis::cos_to_cc_ss(const std::span fcCos, + std::span m_fcCC, + std::span m_fcSS, int n_size, + int m_size) const { // m = 0: n = 0, 1, ..., ntor --> ntor + 1 // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); @@ -155,7 +160,7 @@ int FourierBasisFastPoloidal::cos_to_cc_ss(const std::span fcCos, double normedFC = basis_norm * fcCos[mn]; - m_fcCC[m * (n_size + 1) + abs_n] += normedFC; + m_fcCC[Layout::ProductIndex(m, abs_n, m_size, n_size)] += normedFC; // no contribution to fcSS where (m == 0 || n == 0) mn++; @@ -170,9 +175,10 @@ int FourierBasisFastPoloidal::cos_to_cc_ss(const std::span fcCos, double normedFC = basis_norm * fcCos[mn]; - m_fcCC[m * (n_size + 1) + abs_n] += normedFC; + m_fcCC[Layout::ProductIndex(m, abs_n, m_size, n_size)] += normedFC; if (abs_n > 0) { - m_fcSS[m * (n_size + 1) + abs_n] += sgn_n * normedFC; + m_fcSS[Layout::ProductIndex(m, abs_n, m_size, n_size)] += + sgn_n * normedFC; } mn++; @@ -185,10 +191,11 @@ int FourierBasisFastPoloidal::cos_to_cc_ss(const std::span fcCos, return mnmax; } -int FourierBasisFastPoloidal::sin_to_sc_cs(const std::span fcSin, - std::span m_fcSC, - std::span m_fcCS, int n_size, - int m_size) const { +template +int FourierBasis::sin_to_sc_cs(const std::span fcSin, + std::span m_fcSC, + std::span m_fcCS, int n_size, + int m_size) const { // m = 0: n = 0, 1, ..., ntor --> ntor + 1 // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); @@ -209,7 +216,7 @@ int FourierBasisFastPoloidal::sin_to_sc_cs(const std::span fcSin, // no contribution to fcSC where m == 0 // check for n > 0 is redundant when starting loop at n=1 - m_fcCS[m * (n_size + 1) + abs_n] = -sgn_n * normedFC; + m_fcCS[Layout::ProductIndex(m, abs_n, m_size, n_size)] = -sgn_n * normedFC; mn++; } @@ -223,9 +230,10 @@ int FourierBasisFastPoloidal::sin_to_sc_cs(const std::span fcSin, double normedFC = basis_norm * fcSin[mn]; - m_fcSC[m * (n_size + 1) + abs_n] += normedFC; + m_fcSC[Layout::ProductIndex(m, abs_n, m_size, n_size)] += normedFC; if (abs_n > 0) { - m_fcCS[m * (n_size + 1) + abs_n] += -sgn_n * normedFC; + m_fcCS[Layout::ProductIndex(m, abs_n, m_size, n_size)] += + -sgn_n * normedFC; } mn++; @@ -238,10 +246,11 @@ int FourierBasisFastPoloidal::sin_to_sc_cs(const std::span fcSin, return mnmax; } -int FourierBasisFastPoloidal::cc_ss_to_cos(const std::span fcCC, - const std::span fcSS, - std::span m_fcCos, - int n_size, int m_size) const { +template +int FourierBasis::cc_ss_to_cos(const std::span fcCC, + const std::span fcSS, + std::span m_fcCos, int n_size, + int m_size) const { // m = 0: n = 0, 1, ..., ntor --> ntor + 1 // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); @@ -254,7 +263,7 @@ int FourierBasisFastPoloidal::cc_ss_to_cos(const std::span fcCC, for (int n = 0; n < n_size + 1; ++n) { double basis_norm = 1.0 / (mscale[m] * nscale[n]); - m_fcCos[mn] = fcCC[n] / basis_norm; + m_fcCos[mn] = fcCC[Layout::ProductIndex(m, n, m_size, n_size)] / basis_norm; mn++; } // n @@ -267,10 +276,11 @@ int FourierBasisFastPoloidal::cc_ss_to_cos(const std::span fcCC, double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); if (abs_n == 0) { - m_fcCos[mn] = fcCC[m * (n_size + 1) + abs_n] / basis_norm; + m_fcCos[mn] = + fcCC[Layout::ProductIndex(m, abs_n, m_size, n_size)] / basis_norm; } else { - double raw_cc = fcCC[m * (n_size + 1) + abs_n]; - double raw_ss = fcSS[m * (n_size + 1) + abs_n]; + double raw_cc = fcCC[Layout::ProductIndex(m, abs_n, m_size, n_size)]; + double raw_ss = fcSS[Layout::ProductIndex(m, abs_n, m_size, n_size)]; m_fcCos[mn] = 0.5 * (raw_cc + sgn_n * raw_ss) / basis_norm; } @@ -284,10 +294,11 @@ int FourierBasisFastPoloidal::cc_ss_to_cos(const std::span fcCC, return mnmax; } -int FourierBasisFastPoloidal::sc_cs_to_sin(const std::span fcSC, - const std::span fcCS, - std::span m_fcSin, - int n_size, int m_size) const { +template +int FourierBasis::sc_cs_to_sin(const std::span fcSC, + const std::span fcCS, + std::span m_fcSin, int n_size, + int m_size) const { // m = 0: n = 0, 1, ..., ntor --> ntor + 1 // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); @@ -300,7 +311,8 @@ int FourierBasisFastPoloidal::sc_cs_to_sin(const std::span fcSC, for (int n = 1; n < n_size + 1; ++n) { double basis_norm = 1.0 / (mscale[m] * nscale[n]); - m_fcSin[mn] = -fcCS[n] / basis_norm; + m_fcSin[mn] = + -fcCS[Layout::ProductIndex(m, n, m_size, n_size)] / basis_norm; mn++; } // n @@ -313,10 +325,11 @@ int FourierBasisFastPoloidal::sc_cs_to_sin(const std::span fcSC, double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); if (abs_n == 0) { - m_fcSin[mn] = fcSC[m * (n_size + 1) + abs_n] / basis_norm; + m_fcSin[mn] = + fcSC[Layout::ProductIndex(m, abs_n, m_size, n_size)] / basis_norm; } else { - double raw_sc = fcSC[m * (n_size + 1) + abs_n]; - double raw_cs = fcCS[m * (n_size + 1) + abs_n]; + double raw_sc = fcSC[Layout::ProductIndex(m, abs_n, m_size, n_size)]; + double raw_cs = fcCS[Layout::ProductIndex(m, abs_n, m_size, n_size)]; m_fcSin[mn] = 0.5 * (raw_sc - sgn_n * raw_cs) / basis_norm; } @@ -330,7 +343,8 @@ int FourierBasisFastPoloidal::sc_cs_to_sin(const std::span fcSC, return mnmax; } -int FourierBasisFastPoloidal::mnIdx(int m, int n) const { +template +int FourierBasis::mnIdx(int m, int n) const { if (m == 0) { CHECK_GE(n, 0) << "no mn index available for n < 0"; return n; @@ -342,7 +356,8 @@ int FourierBasisFastPoloidal::mnIdx(int m, int n) const { // number of unique Fourier coefficients for // m = 0, 1, ..., m_size - 1 // n = -n_size, -(n_size-1), ..., -1, 0, 1, ..., (n_size-1), n_size -int FourierBasisFastPoloidal::mnMax(int m_size, int n_size) const { +template +int FourierBasis::mnMax(int m_size, int n_size) const { // m = 0: n = 0, 1, ..., ntor --> ntor + 1 // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); @@ -350,10 +365,11 @@ int FourierBasisFastPoloidal::mnMax(int m_size, int n_size) const { return mnmax; } -void FourierBasisFastPoloidal::computeConversionIndices(Eigen::VectorXi& m_xm, - Eigen::VectorXi& m_xn, - int n_size, int m_size, - int nfp) const { +template +void FourierBasis::computeConversionIndices(Eigen::VectorXi& m_xm, + Eigen::VectorXi& m_xn, + int n_size, int m_size, + int nfp) const { const int mnmax = mnMax(m_size, n_size); int mn = 0; @@ -375,4 +391,8 @@ void FourierBasisFastPoloidal::computeConversionIndices(Eigen::VectorXi& m_xm, CHECK_EQ(mn, mnmax) << "counting error: mn=" << mn << " should be " << mnmax; } +// The two layouts that VMEC++ (theta fast) and Nestor (zeta fast) use. +template class FourierBasis; +template class FourierBasis; + } // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis/fourier_basis.h b/src/vmecpp/cpp/vmecpp/common/fourier_basis/fourier_basis.h new file mode 100644 index 000000000..f4148e007 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis/fourier_basis.h @@ -0,0 +1,364 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_COMMON_FOURIER_BASIS_FOURIER_BASIS_H_ +#define VMECPP_COMMON_FOURIER_BASIS_FOURIER_BASIS_H_ + +#include +#include + +#include "vmecpp/common/sizes/sizes.h" + +namespace vmecpp { + +// The two data layouts differ only in which flat index a (mode, grid-point) +// pair maps to. VMEC++ iterates its basis arrays with the poloidal (theta) +// coordinate as the fast axis, while Nestor iterates with the toroidal (zeta) +// coordinate fastest, so the two store the identical basis values in transposed +// memory order. Everything else (the trigonometric arithmetic, the scaling +// factors, the combined <-> product basis conversions, the mode-number +// bookkeeping) is layout independent. The layout is therefore a compile-time +// policy supplying only the three flat index formulas; FourierBasis below is +// written once against it. +// +// FastPoloidal (m-major): the poloidal (theta) coordinate is the fast index of +// the poloidal basis arrays, and the poloidal mode m is the slow index of the +// product-basis coefficient arrays. Used by the VMEC++ core solver. +struct FourierBasisFastPoloidalLayout { + // Poloidal basis arrays, logical shape [num_m][num_l] over (mode m, theta l). + static int PoloidalBasisIndex(int m, int l, int num_m, int num_l) { + (void)num_m; + return m * num_l + l; + } + // Toroidal basis arrays, logical shape [num_k][num_n] over (zeta k, mode n). + static int ToroidalBasisIndex(int n, int k, int num_n, int num_k) { + (void)num_k; + return k * num_n + n; + } + // Product-basis coefficient arrays, logical shape [m_size][n_size + 1]. + static int ProductIndex(int m, int n, int m_size, int n_size) { + (void)m_size; + return m * (n_size + 1) + n; + } +}; + +// FastToroidal (n-major): the toroidal (zeta) coordinate is the fast index of +// the toroidal basis arrays, and the toroidal mode n is the slow index of the +// product-basis coefficient arrays. Used by Nestor / the free-boundary code. +struct FourierBasisFastToroidalLayout { + static int PoloidalBasisIndex(int m, int l, int num_m, int num_l) { + (void)num_l; + return l * num_m + m; + } + static int ToroidalBasisIndex(int n, int k, int num_n, int num_k) { + (void)num_n; + return n * num_k + k; + } + static int ProductIndex(int m, int n, int m_size, int n_size) { + (void)n_size; + return n * m_size + m; + } +}; + +// Fourier basis representation for VMEC++ spectral computations. +// +// This class provides the fundamental spectral basis for VMEC++ computations, +// representing 3D plasma quantities using Fourier decomposition in flux +// coordinates (s, \theta, \zeta) where: +// s = normalized toroidal flux (radial coordinate) +// \theta = poloidal angle +// \zeta = toroidal angle = nfp * \phi (field period toroidal angle) +// +// Physical quantities are expanded as: +// f(s,\theta,\zeta) = \sum_{m,n} f_{mn}(s) * basis_function(m*\theta, +// n*\zeta) +// +// The Layout template policy fixes the flat memory order of the basis and +// coefficient arrays (see FourierBasisFastPoloidalLayout / +// FourierBasisFastToroidalLayout). The concrete classes are the two type +// aliases at the bottom of this header: +// FourierBasisFastPoloidal (theta fast; VMEC++ core solver) +// FourierBasisFastToroidal (zeta fast; Nestor / free boundary) +template +class FourierBasis { + public: + explicit FourierBasis(const Sizes* s); + + // ============================================================================ + // FOURIER BASIS SCALING FACTORS + // ============================================================================ + + // [mnyq2+1] Poloidal mode scaling factors: sqrt(2) for m>0, 1.0 for m=0 + // Applied to cos(m*\theta) and sin(m*\theta) basis functions for DFT + // normalization Enables proper normalization: 1/\pi for m>0 modes, 1/(2\pi) + // for m=0 mode + Eigen::VectorXd mscale; + + // [nnyq2+1] Toroidal mode scaling factors: sqrt(2) for n>0, 1.0 for n=0 + // Applied to cos(n*\zeta) and sin(n*\zeta) basis functions for DFT + // normalization Enables proper normalization: 1/\pi for n>0 modes, 1/(2\pi) + // for n=0 mode + Eigen::VectorXd nscale; + + // ============================================================================ + // POLOIDAL BASIS FUNCTIONS + // ============================================================================ + // Flat index: Layout::PoloidalBasisIndex(m, l, mnyq2+1, nThetaReduced). + // \theta[l] = 2*\pi*l/nThetaEven for l=0...nThetaReduced-1 (reduced [0,\pi] + // interval). + + // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal cosine basis + // cosmu[idx(m,l)] = cos(m*\theta[l]) * mscale[m] + Eigen::VectorXd cosmu; + + // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal sine basis + // sinmu[idx(m,l)] = sin(m*\theta[l]) * mscale[m] + Eigen::VectorXd sinmu; + + // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal cosine derivative + // cosmum[idx(m,l)] = m * cos(m*\theta[l]) * mscale[m] + // Used for computing \partial/\partial\theta derivatives in force + // calculations + Eigen::VectorXd cosmum; + + // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal sine derivative + // sinmum[idx(m,l)] = -m * sin(m*\theta[l]) * mscale[m] + // Used for computing \partial/\partial\theta derivatives in force + // calculations + Eigen::VectorXd sinmum; + + // ============================================================================ + // POLOIDAL BASIS WITH INTEGRATION WEIGHTS + // ============================================================================ + + // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal cosine basis + // cosmui[idx(m,l)] = cosmu[idx(m,l)] * intNorm + // intNorm = 1/(nZeta*(nThetaReduced-1)), with boundary point factor 1/2 + Eigen::VectorXd cosmui; + + // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal sine basis + // sinmui[idx(m,l)] = sinmu[idx(m,l)] * intNorm + Eigen::VectorXd sinmui; + + // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal cosine derivative + // cosmumi[idx(m,l)] = cosmum[idx(m,l)] * intNorm + Eigen::VectorXd cosmumi; + + // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal sine derivative + // sinmumi[idx(m,l)] = sinmum[idx(m,l)] * intNorm + Eigen::VectorXd sinmumi; + + // ============================================================================ + // TOROIDAL BASIS FUNCTIONS + // ============================================================================ + // Flat index: Layout::ToroidalBasisIndex(n, k, nnyq2+1, nZeta). + // \zeta[k] = 2*\pi*k/nZeta for k=0...nZeta-1 (full [0,2\pi] interval). + + // [(nnyq2+1) * nZeta] Pre-scaled toroidal cosine basis + // cosnv[idx(n,k)] = cos(n*\zeta[k]) * nscale[n] + Eigen::VectorXd cosnv; + + // [(nnyq2+1) * nZeta] Pre-scaled toroidal sine basis + // sinnv[idx(n,k)] = sin(n*\zeta[k]) * nscale[n] + Eigen::VectorXd sinnv; + + // [(nnyq2+1) * nZeta] Pre-scaled toroidal cosine derivative with nfp factor + // cosnvn[idx(n,k)] = n*nfp * cos(n*\zeta[k]) * nscale[n] + // Factor nfp converts \partial/\partial\zeta to \partial/\partial\phi + // derivatives + Eigen::VectorXd cosnvn; + + // [(nnyq2+1) * nZeta] Pre-scaled toroidal sine derivative with nfp factor + // sinnvn[idx(n,k)] = -n*nfp * sin(n*\zeta[k]) * nscale[n] + // Factor nfp converts \partial/\partial\zeta to \partial/\partial\phi + // derivatives + Eigen::VectorXd sinnvn; + + // ============================================================================ + // FOURIER BASIS CONVERSION FUNCTIONS + // ============================================================================ + // + // These functions convert between VMEC++'s two Fourier basis representations + // using trigonometric identities and pre-computed scaling factors. + // See docs/fourier_basis_implementation.md for complete mathematical details. + // + // Two Fourier basis types: + // 1. COMBINED BASIS (External): cos(m*\theta - n*\zeta), sin(m*\theta - + // n*\zeta) + // - Used in: wout files, Python API, traditional VMEC format + // - Storage: Linear arrays indexed by mode number mn + // + // 2. PRODUCT BASIS (Internal): cos(m*\theta)*cos(n*\zeta), + // sin(m*\theta)*sin(n*\zeta), etc. + // - Used in: Internal computations with separable DFT operations + // - Storage: 2D arrays indexed by (m,n) via Layout::ProductIndex + // + // Mathematical basis function identity: + // cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + + // sin(m*\theta)*sin(n*\zeta) + + /** + * Convert coefficients from combined cosine basis to separable product basis. + * + * Basis function identity: + * cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + + * sin(m*\theta)*sin(n*\zeta) + * + * This function transforms coefficients for cos(m*\theta - n*\zeta) basis + * functions into coefficients for the separable product basis + * cos(m*\theta)*cos(n*\zeta) and sin(m*\theta)*sin(n*\zeta). The + * transformation accounts for VMEC symmetry where only n >= 0 coefficients + * are stored. + * + * Implementation uses pre-computed scaling factors (mscale, nscale) and + * handles positive/negative toroidal mode symmetry. Standalone function. + * + * Physics context: Converts external coefficient format (wout files) to + * internal product basis coefficients that enable separable DFT operations. + * + * @param fcCos [input] Coefficients for cos(m*\theta - n*\zeta) basis, size + * mnmax + * @param m_fcCC [output] Coefficients for cos(m*\theta)*cos(n*\zeta) basis, + * size m_size*(n_size+1) + * @param m_fcSS [output] Coefficients for sin(m*\theta)*sin(n*\zeta) basis, + * size m_size*(n_size+1) + * @param n_size Toroidal mode range: n in [-n_size, n_size] + * @param m_size Poloidal mode range: m in [0, m_size-1] + * @return Total number of modes processed (mnmax) + */ + int cos_to_cc_ss(const std::span fcCos, + std::span m_fcCC, std::span m_fcSS, + int n_size, int m_size) const; + + /** + * Convert coefficients from combined sine basis to separable product basis. + * + * Basis function identity: + * sin(m*\theta - n*\zeta) = sin(m*\theta)*cos(n*\zeta) - + * cos(m*\theta)*sin(n*\zeta) + * + * This function transforms coefficients for sin(m*\theta - n*\zeta) basis + * functions into coefficients for the separable product basis + * sin(m*\theta)*cos(n*\zeta) and cos(m*\theta)*sin(n*\zeta). Enforces + * sin(0*\theta - 0*\zeta) = 0 constraint. + * + * Physics context: Handles sine-parity quantities like Z coordinates (zmns) + * and \lambda angle functions (lmns coefficients). + * + * @param fcSin [input] Coefficients for sin(m*\theta - n*\zeta) basis, size + * mnmax + * @param m_fcSC [output] Coefficients for sin(m*\theta)*cos(n*\zeta) basis, + * size m_size*(n_size+1) + * @param m_fcCS [output] Coefficients for cos(m*\theta)*sin(n*\zeta) basis, + * size m_size*(n_size+1) + * @param n_size Toroidal mode range: n in [-n_size, n_size] + * @param m_size Poloidal mode range: m in [0, m_size-1] + * @return Total number of modes processed (mnmax) + */ + int sin_to_sc_cs(const std::span fcSin, + std::span m_fcSC, std::span m_fcCS, + int n_size, int m_size) const; + + /** + * Convert coefficients from separable product basis back to combined cosine + * basis. + * + * Inverse transformation using basis function identity: + * cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + + * sin(m*\theta)*sin(n*\zeta) + * + * This function reconstructs coefficients for cos(m*\theta - n*\zeta) basis + * from coefficients of the separable product basis. Handles positive/negative + * toroidal mode reconstruction and applies inverse scaling factors. + * + * Physics context: Converts internal computational results back to external + * coefficient format for wout files, Python API, and traditional VMEC output. + * + * @param fcCC [input] Coefficients for cos(m*\theta)*cos(n*\zeta) basis, size + * m_size*(n_size+1) + * @param fcSS [input] Coefficients for sin(m*\theta)*sin(n*\zeta) basis, size + * m_size*(n_size+1) + * @param m_fcCos [output] Coefficients for cos(m*\theta - n*\zeta) basis, + * size mnmax + * @param n_size Toroidal mode range: n in [-n_size, n_size] + * @param m_size Poloidal mode range: m in [0, m_size-1] + * @return Total number of modes processed (mnmax) + */ + int cc_ss_to_cos(const std::span fcCC, + const std::span fcSS, + std::span m_fcCos, int n_size, int m_size) const; + + /** + * Convert coefficients from separable product basis back to combined sine + * basis. + * + * Inverse transformation using basis function identity: + * sin(m*\theta - n*\zeta) = sin(m*\theta)*cos(n*\zeta) - + * cos(m*\theta)*sin(n*\zeta) + * + * This function reconstructs coefficients for sin(m*\theta - n*\zeta) basis + * from coefficients of the separable product basis. Enforces sin(0*\theta - + * 0*\zeta) = 0. + * + * Physics context: Converts internal results for sine-parity quantities + * back to external coefficient format for output and analysis. + * + * @param fcSC [input] Coefficients for sin(m*\theta)*cos(n*\zeta) basis, size + * m_size*(n_size+1) + * @param fcCS [input] Coefficients for cos(m*\theta)*sin(n*\zeta) basis, size + * m_size*(n_size+1) + * @param m_fcSin [output] Coefficients for sin(m*\theta - n*\zeta) basis, + * size mnmax + * @param n_size Toroidal mode range: n in [-n_size, n_size] + * @param m_size Poloidal mode range: m in [0, m_size-1] + * @return Total number of modes processed (mnmax) + */ + int sc_cs_to_sin(const std::span fcSC, + const std::span fcCS, + std::span m_fcSin, int n_size, int m_size) const; + + int mnIdx(int m, int n) const; + int mnMax(int m_size, int n_size) const; + void computeConversionIndices(Eigen::VectorXi& m_xm, Eigen::VectorXi& m_xn, + int n_size, int m_size, int nfp) const; + + // ============================================================================ + // MODE NUMBER MAPPING ARRAYS + // ============================================================================ + + // [mnmax] Poloidal mode numbers for standard resolution Fourier coefficients + // Layout: xm[mn] = poloidal mode number m for the mn-th coefficient + // Maps linear coefficient index mn to 2D mode (m,n) for spectral operations + Eigen::VectorXi xm; + + // [mnmax] Toroidal mode numbers for standard resolution Fourier coefficients + // Layout: xn[mn] = toroidal mode number n*nfp for the mn-th coefficient + // Factor nfp included to convert from field periods to geometric toroidal + // modes + Eigen::VectorXi xn; + + // [mnmax_nyq] Poloidal mode numbers for Nyquist-extended Fourier coefficients + // Layout: xm_nyq[mn] = poloidal mode number m for the mn-th Nyquist + // coefficient Extended resolution to avoid aliasing in nonlinear force + // calculations + Eigen::VectorXi xm_nyq; + + // [mnmax_nyq] Toroidal mode numbers for Nyquist-extended Fourier coefficients + // Layout: xn_nyq[mn] = toroidal mode number n*nfp for the mn-th Nyquist + // coefficient Extended resolution to avoid aliasing in nonlinear force + // calculations + Eigen::VectorXi xn_nyq; + + private: + const Sizes& s_; + + void computeFourierBasis(int nfp); +}; + +using FourierBasisFastPoloidal = FourierBasis; +using FourierBasisFastToroidal = FourierBasis; + +} // namespace vmecpp + +#endif // VMECPP_COMMON_FOURIER_BASIS_FOURIER_BASIS_H_ diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/BUILD.bazel b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/BUILD.bazel index 67b28a424..a650f0a60 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/BUILD.bazel +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/BUILD.bazel @@ -3,15 +3,10 @@ # SPDX-License-Identifier: MIT cc_library( name = "fourier_basis_fast_poloidal", - srcs = ["fourier_basis_fast_poloidal.cc"], hdrs = ["fourier_basis_fast_poloidal.h"], visibility = ["//visibility:public"], deps = [ - "@abseil-cpp//absl/algorithm:container", - "@abseil-cpp//absl/log:check", - "@abseil-cpp//absl/strings:str_format", - "//vmecpp/common/util:util", - "//vmecpp/common/sizes:sizes", + "//vmecpp/common/fourier_basis", ], ) diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/CMakeLists.txt b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/CMakeLists.txt index bba3e7834..9c2daccb2 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/CMakeLists.txt +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/CMakeLists.txt @@ -1,5 +1,4 @@ list (APPEND vmecpp_sources - ${CMAKE_CURRENT_SOURCE_DIR}/fourier_basis_fast_poloidal.cc ${CMAKE_CURRENT_SOURCE_DIR}/fourier_basis_fast_poloidal.h ) set (vmecpp_sources "${vmecpp_sources}" PARENT_SCOPE) diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h index f565fbc98..725216c83 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h @@ -5,308 +5,9 @@ #ifndef VMECPP_COMMON_FOURIER_BASIS_FAST_POLOIDAL_FOURIER_BASIS_FAST_POLOIDAL_H_ #define VMECPP_COMMON_FOURIER_BASIS_FAST_POLOIDAL_FOURIER_BASIS_FAST_POLOIDAL_H_ -#include -#include - -#include "vmecpp/common/sizes/sizes.h" - -namespace vmecpp { - -// Fourier basis representation optimized for poloidal coordinate operations. -// -// This class provides the fundamental spectral basis for VMEC++ computations, -// representing 3D plasma quantities using Fourier decomposition in flux -// coordinates (s, \theta, \zeta) where: -// s = normalized toroidal flux (radial coordinate) -// \theta = poloidal angle -// \zeta = toroidal angle = nfp * \phi (field period toroidal angle) -// -// Physical quantities are expanded as: -// f(s,\theta,\zeta) = \sum_{m,n} f_{mn}(s) * basis_function(m*\theta, -// n*\zeta) -// -// The "FastPoloidal" layout stores data with poloidal (\theta) coordinate as -// the fast (innermost) loop index, optimizing for operations that iterate -// over poloidal modes. This differs from FastToroidal layout. -// -// NOTE: Nestor has its own implementation of this class because we want to be -// able to use different data layouts between VMEC++ and Nestor. -class FourierBasisFastPoloidal { - public: - explicit FourierBasisFastPoloidal(const Sizes* s); - - // ============================================================================ - // FOURIER BASIS SCALING FACTORS - // ============================================================================ - - // [mnyq2+1] Poloidal mode scaling factors: sqrt(2) for m>0, 1.0 for m=0 - // Applied to cos(m*\theta) and sin(m*\theta) basis functions for DFT - // normalization Enables proper normalization: 1/\pi for m>0 modes, 1/(2\pi) - // for m=0 mode - Eigen::VectorXd mscale; - - // [nnyq2+1] Toroidal mode scaling factors: sqrt(2) for n>0, 1.0 for n=0 - // Applied to cos(n*\zeta) and sin(n*\zeta) basis functions for DFT - // normalization Enables proper normalization: 1/\pi for n>0 modes, 1/(2\pi) - // for n=0 mode - Eigen::VectorXd nscale; - - // ============================================================================ - // POLOIDAL BASIS FUNCTIONS (m-major layout: [m][l]) - // ============================================================================ - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal cosine basis - // Layout: cosmu[m*nThetaReduced + l] = cos(m*\theta[l]) * mscale[m] - // \theta[l] = 2*\pi*l/nThetaEven for l=0...nThetaReduced-1 (reduced [0,\pi] - // interval) - Eigen::VectorXd cosmu; - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal sine basis - // Layout: sinmu[m*nThetaReduced + l] = sin(m*\theta[l]) * mscale[m] - Eigen::VectorXd sinmu; - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal cosine derivative - // Layout: cosmum[m*nThetaReduced + l] = m * cos(m*\theta[l]) * mscale[m] - // Used for computing \partial/\partial\theta derivatives in force - // calculations - Eigen::VectorXd cosmum; - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal sine derivative - // Layout: sinmum[m*nThetaReduced + l] = -m * sin(m*\theta[l]) * mscale[m] - // Used for computing \partial/\partial\theta derivatives in force - // calculations - Eigen::VectorXd sinmum; - - // ============================================================================ - // POLOIDAL BASIS WITH INTEGRATION WEIGHTS - // ============================================================================ - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal cosine basis - // Layout: cosmui[m*nThetaReduced + l] = cosmu[m*nThetaReduced + l] * intNorm - // intNorm = 1/(nZeta*(nThetaReduced-1)), with boundary point factor 1/2 - Eigen::VectorXd cosmui; - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal sine basis - // Layout: sinmui[m*nThetaReduced + l] = sinmu[m*nThetaReduced + l] * intNorm - Eigen::VectorXd sinmui; - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal cosine derivative - // Layout: cosmumi[m*nThetaReduced + l] = cosmum[m*nThetaReduced + l] * - // intNorm - Eigen::VectorXd cosmumi; - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal sine derivative - // Layout: sinmumi[m*nThetaReduced + l] = sinmum[m*nThetaReduced + l] * - // intNorm - Eigen::VectorXd sinmumi; - - // ============================================================================ - // TOROIDAL BASIS FUNCTIONS (zeta-major layout: [k][n]) - // ============================================================================ - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal cosine basis - // Layout: cosnv[k*(nnyq2+1) + n] = cos(n*\zeta[k]) * nscale[n] - // \zeta[k] = 2*\pi*k/nZeta for k=0...nZeta-1 (full [0,2\pi] interval) - Eigen::VectorXd cosnv; - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal sine basis - // Layout: sinnv[k*(nnyq2+1) + n] = sin(n*\zeta[k]) * nscale[n] - Eigen::VectorXd sinnv; - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal cosine derivative with nfp factor - // Layout: cosnvn[k*(nnyq2+1) + n] = n*nfp * cos(n*\zeta[k]) * nscale[n] - // Factor nfp converts \partial/\partial\zeta to \partial/\partial\phi - // derivatives - Eigen::VectorXd cosnvn; - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal sine derivative with nfp factor - // Layout: sinnvn[k*(nnyq2+1) + n] = -n*nfp * sin(n*\zeta[k]) * nscale[n] - // Factor nfp converts \partial/\partial\zeta to \partial/\partial\phi - // derivatives - Eigen::VectorXd sinnvn; - - // ============================================================================ - // FOURIER BASIS CONVERSION FUNCTIONS - // ============================================================================ - // - // These functions convert between VMEC++'s two Fourier basis representations - // using trigonometric identities and pre-computed scaling factors. - // See docs/fourier_basis_implementation.md for complete mathematical details. - // - // Two Fourier basis types: - // 1. COMBINED BASIS (External): cos(m*\theta - n*\zeta), sin(m*\theta - - // n*\zeta) - // - Used in: wout files, Python API, traditional VMEC format - // - Storage: Linear arrays indexed by mode number mn - // - // 2. PRODUCT BASIS (Internal): cos(m*\theta)*cos(n*\zeta), - // sin(m*\theta)*sin(n*\zeta), etc. - // - Used in: Internal computations with separable DFT operations - // - Storage: 2D arrays indexed by (m,n) separately - // - Layout: fcCC[m*(n_size+1) + n] (m-major ordering for poloidal class) - // - // Mathematical basis function identity: - // cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + - // sin(m*\theta)*sin(n*\zeta) - - /** - * Convert coefficients from combined cosine basis to separable product basis. - * - * Basis function identity: - * cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + - * sin(m*\theta)*sin(n*\zeta) - * - * This function transforms coefficients for cos(m*\theta - n*\zeta) basis - * functions into coefficients for the separable product basis - * cos(m*\theta)*cos(n*\zeta) and sin(m*\theta)*sin(n*\zeta). The - * transformation accounts for VMEC symmetry where only n >= 0 coefficients - * are stored. - * - * Implementation uses pre-computed scaling factors (mscale, nscale) and - * handles positive/negative toroidal mode symmetry. Standalone function. - * - * Physics context: Converts external coefficient format (wout files) to - * internal product basis coefficients that enable separable DFT operations. - * - * @param fcCos [input] Coefficients for cos(m*\theta - n*\zeta) basis, size - * mnmax - * @param m_fcCC [output] Coefficients for cos(m*\theta)*cos(n*\zeta) basis, - * size m_size*(n_size+1) - * @param m_fcSS [output] Coefficients for sin(m*\theta)*sin(n*\zeta) basis, - * size m_size*(n_size+1) - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int cos_to_cc_ss(const std::span fcCos, - std::span m_fcCC, std::span m_fcSS, - int n_size, int m_size) const; - - /** - * Convert coefficients from combined sine basis to separable product basis. - * - * Basis function identity: - * sin(m*\theta - n*\zeta) = sin(m*\theta)*cos(n*\zeta) - - * cos(m*\theta)*sin(n*\zeta) - * - * This function transforms coefficients for sin(m*\theta - n*\zeta) basis - * functions into coefficients for the separable product basis - * sin(m*\theta)*cos(n*\zeta) and cos(m*\theta)*sin(n*\zeta). Enforces - * sin(0*\theta - 0*\zeta) = 0 constraint. - * - * Physics context: Handles sine-parity quantities like Z coordinates (zmns) - * and \lambda angle functions (lmns coefficients). - * - * @param fcSin [input] Coefficients for sin(m*\theta - n*\zeta) basis, size - * mnmax - * @param m_fcSC [output] Coefficients for sin(m*\theta)*cos(n*\zeta) basis, - * size m_size*(n_size+1) - * @param m_fcCS [output] Coefficients for cos(m*\theta)*sin(n*\zeta) basis, - * size m_size*(n_size+1) - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int sin_to_sc_cs(const std::span fcSin, - std::span m_fcSC, std::span m_fcCS, - int n_size, int m_size) const; - - /** - * Convert coefficients from separable product basis back to combined cosine - * basis. - * - * Inverse transformation using basis function identity: - * cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + - * sin(m*\theta)*sin(n*\zeta) - * - * This function reconstructs coefficients for cos(m*\theta - n*\zeta) basis - * from coefficients of the separable product basis. Handles positive/negative - * toroidal mode reconstruction and applies inverse scaling factors. - * - * Physics context: Converts internal computational results back to external - * coefficient format for wout files, Python API, and traditional VMEC output. - * - * @param fcCC [input] Coefficients for cos(m*\theta)*cos(n*\zeta) basis, size - * m_size*(n_size+1) - * @param fcSS [input] Coefficients for sin(m*\theta)*sin(n*\zeta) basis, size - * m_size*(n_size+1) - * @param m_fcCos [output] Coefficients for cos(m*\theta - n*\zeta) basis, - * size mnmax - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int cc_ss_to_cos(const std::span fcCC, - const std::span fcSS, - std::span m_fcCos, int n_size, int m_size) const; - - /** - * Convert coefficients from separable product basis back to combined sine - * basis. - * - * Inverse transformation using basis function identity: - * sin(m*\theta - n*\zeta) = sin(m*\theta)*cos(n*\zeta) - - * cos(m*\theta)*sin(n*\zeta) - * - * This function reconstructs coefficients for sin(m*\theta - n*\zeta) basis - * from coefficients of the separable product basis. Enforces sin(0*\theta - - * 0*\zeta) = 0. - * - * Physics context: Converts internal results for sine-parity quantities - * back to external coefficient format for output and analysis. - * - * @param fcSC [input] Coefficients for sin(m*\theta)*cos(n*\zeta) basis, size - * m_size*(n_size+1) - * @param fcCS [input] Coefficients for cos(m*\theta)*sin(n*\zeta) basis, size - * m_size*(n_size+1) - * @param m_fcSin [output] Coefficients for sin(m*\theta - n*\zeta) basis, - * size mnmax - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int sc_cs_to_sin(const std::span fcSC, - const std::span fcCS, - std::span m_fcSin, int n_size, int m_size) const; - - int mnIdx(int m, int n) const; - int mnMax(int m_size, int n_size) const; - void computeConversionIndices(Eigen::VectorXi& m_xm, Eigen::VectorXi& m_xn, - int n_size, int m_size, int nfp) const; - - // ============================================================================ - // MODE NUMBER MAPPING ARRAYS - // ============================================================================ - - // [mnmax] Poloidal mode numbers for standard resolution Fourier coefficients - // Layout: xm[mn] = poloidal mode number m for the mn-th coefficient - // Maps linear coefficient index mn to 2D mode (m,n) for spectral operations - Eigen::VectorXi xm; - - // [mnmax] Toroidal mode numbers for standard resolution Fourier coefficients - // Layout: xn[mn] = toroidal mode number n*nfp for the mn-th coefficient - // Factor nfp included to convert from field periods to geometric toroidal - // modes - Eigen::VectorXi xn; - - // [mnmax_nyq] Poloidal mode numbers for Nyquist-extended Fourier coefficients - // Layout: xm_nyq[mn] = poloidal mode number m for the mn-th Nyquist - // coefficient Extended resolution to avoid aliasing in nonlinear force - // calculations - Eigen::VectorXi xm_nyq; - - // [mnmax_nyq] Toroidal mode numbers for Nyquist-extended Fourier coefficients - // Layout: xn_nyq[mn] = toroidal mode number n*nfp for the mn-th Nyquist - // coefficient Extended resolution to avoid aliasing in nonlinear force - // calculations - Eigen::VectorXi xn_nyq; - - private: - const Sizes& s_; - - void computeFourierBasisFastPoloidal(int nfp); -}; - -} // namespace vmecpp +// FourierBasisFastPoloidal is the theta-fast (m-major) layout of the shared +// FourierBasis template, which now holds the single implementation. This header +// is retained as a stable include path for existing call sites. +#include "vmecpp/common/fourier_basis/fourier_basis.h" // IWYU pragma: export #endif // VMECPP_COMMON_FOURIER_BASIS_FAST_POLOIDAL_FOURIER_BASIS_FAST_POLOIDAL_H_ diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/BUILD.bazel b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/BUILD.bazel index 6e267502c..0d641c945 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/BUILD.bazel +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/BUILD.bazel @@ -3,15 +3,10 @@ # SPDX-License-Identifier: MIT cc_library( name = "fourier_basis_fast_toroidal", - srcs = ["fourier_basis_fast_toroidal.cc"], hdrs = ["fourier_basis_fast_toroidal.h"], visibility = ["//visibility:public"], deps = [ - "@abseil-cpp//absl/algorithm:container", - "@abseil-cpp//absl/log:check", - "@abseil-cpp//absl/strings:str_format", - "//vmecpp/common/util:util", - "//vmecpp/common/sizes:sizes", + "//vmecpp/common/fourier_basis", ], ) diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/CMakeLists.txt b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/CMakeLists.txt index e0511fbe0..8bf47828d 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/CMakeLists.txt +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/CMakeLists.txt @@ -1,5 +1,4 @@ list (APPEND vmecpp_sources - ${CMAKE_CURRENT_SOURCE_DIR}/fourier_basis_fast_toroidal.cc ${CMAKE_CURRENT_SOURCE_DIR}/fourier_basis_fast_toroidal.h ) set (vmecpp_sources "${vmecpp_sources}" PARENT_SCOPE) diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.cc b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.cc deleted file mode 100644 index 40384f4f6..000000000 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.cc +++ /dev/null @@ -1,381 +0,0 @@ -// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH -// -// -// SPDX-License-Identifier: MIT -#include "vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h" - -#include -#include - -#include "absl/algorithm/container.h" -#include "absl/log/check.h" -#include "vmecpp/common/util/util.h" - -namespace vmecpp { - -FourierBasisFastToroidal::FourierBasisFastToroidal(const Sizes* s) : s_(*s) { - mscale.resize(s_.mnyq2 + 1); - nscale.resize(s_.nnyq2 + 1); - - cosmu.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - sinmu.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - cosmum.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - sinmum.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - cosmui.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - sinmui.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - cosmumi.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - sinmumi.resize(s_.nThetaReduced * (s_.mnyq2 + 1)); - - cosnv.resize((s_.nnyq2 + 1) * s_.nZeta); - sinnv.resize((s_.nnyq2 + 1) * s_.nZeta); - cosnvn.resize((s_.nnyq2 + 1) * s_.nZeta); - sinnvn.resize((s_.nnyq2 + 1) * s_.nZeta); - - computeFourierBasisFastToroidal(s_.nfp); - - // ----------------- - - xm.resize(s_.mnmax); - xm.setZero(); - xn.resize(s_.mnmax); - xn.setZero(); - - computeConversionIndices(/*m_xm=*/xm, /*m_xn=*/xn, s_.ntor, s_.mpol, s_.nfp); - - xm_nyq.resize(s_.mnmax_nyq); - xm_nyq.setZero(); - xn_nyq.resize(s_.mnmax_nyq); - xn_nyq.setZero(); - - computeConversionIndices(/*m_xm=*/xm_nyq, /*m_xn=*/xn_nyq, s_.nnyq, - s_.mnyq + 1, s_.nfp); -} - -void FourierBasisFastToroidal::computeFourierBasisFastToroidal(int nfp) { - static constexpr double kTwoPi = 2.0 * M_PI; - - // Fourier transforms are always computed in VMEC - // over the reduced theta interval from [0, pi]. - // Thus, need a fixed normalization factor (cannot use dnorm3 or wInt in - // Sizes) here. - const double intNorm = 1.0 / (s_.nZeta * (s_.nThetaReduced - 1)); - - // poloidal - for (int m = 0; m < s_.mnyq2 + 1; ++m) { - // DFTs for m>0 need 1/pi==2/(2pi) normalization factor - // vs. 1/(2pi) for the cos(m=0)-mode. - // --> introduce one sqrt(2) in fwd-DFT (geometry-into-realspace) - // and one sqrt(2) into inv-DFT (forces-into-Fourier) via mscale - if (m == 0) { - mscale[m] = 1.0; - } else { - mscale[m] = std::numbers::sqrt2; - } - } // m - - for (int l = 0; l < s_.nThetaReduced; ++l) { - // need to compute theta grid using _full_ number of theta points! - const double theta = kTwoPi * l / s_.nThetaEven; - for (int m = 0; m < s_.mnyq2 + 1; ++m) { - const int idx_lm = l * (s_.mnyq2 + 1) + m; - - const double arg = m * theta; - - // poloidal Fourier basis - cosmu[idx_lm] = std::cos(arg) * mscale[m]; - sinmu[idx_lm] = std::sin(arg) * mscale[m]; - - // integration - cosmui[idx_lm] = cosmu[idx_lm] * intNorm; - sinmui[idx_lm] = sinmu[idx_lm] * intNorm; - - if (l == 0 || l == s_.nThetaReduced - 1) { - cosmui[idx_lm] /= 2.0; - } - - // poloidal derivatives - cosmum[idx_lm] = m * cosmu[idx_lm]; - sinmum[idx_lm] = -m * sinmu[idx_lm]; - - cosmumi[idx_lm] = m * cosmui[idx_lm]; - sinmumi[idx_lm] = -m * sinmui[idx_lm]; - } // m - } // l - - // toroidal - for (int n = 0; n < s_.nnyq2 + 1; ++n) { - // DFTs for m>0 need 1/pi==2/(2pi) normalization factor - // vs. 1/(2pi) for the cos(m=0)-mode. - // --> introduce one sqrt(2) in fwd-DFT (geometry-into-realspace) - // and one sqrt(2) into inv-DFT (forces-into-Fourier) via nscale - if (n == 0) { - nscale[n] = 1.0; - } else { - nscale[n] = std::numbers::sqrt2; - } - } // n - - for (int k = 0; k < s_.nZeta; ++k) { - const double zeta = kTwoPi * k / s_.nZeta; - for (int n = 0; n < s_.nnyq2 + 1; ++n) { - const int idx_nk = n * s_.nZeta + k; - - const double arg = n * zeta; - - // toroidal Fourier basis - cosnv[idx_nk] = std::cos(arg) * nscale[n]; - sinnv[idx_nk] = std::sin(arg) * nscale[n]; - - // toroidal derivatives - cosnvn[idx_nk] = n * nfp * cosnv[idx_nk]; - sinnvn[idx_nk] = -n * nfp * sinnv[idx_nk]; - } // n - } // k -} - -// convert cos(xm[mn] theta - xn[mn] zeta) into 2D FC array form -int FourierBasisFastToroidal::cos_to_cc_ss(const std::span fcCos, - std::span m_fcCC, - std::span m_fcSS, int n_size, - int m_size) const { - // m = 0: n = 0, 1, ..., ntor --> ntor + 1 - // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) - int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); - - absl::c_fill_n(m_fcCC, m_size * (n_size + 1), 0); - absl::c_fill_n(m_fcSS, m_size * (n_size + 1), 0); - - int mn = 0; - - int m = 0; - for (int n = 0; n < n_size + 1; ++n) { - int abs_n = abs(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); - - double normedFC = basis_norm * fcCos[mn]; - - m_fcCC[abs_n * m_size + m] += normedFC; - // no contribution to fcSS where (m == 0 || n == 0) - - mn++; - } - - for (m = 1; m < m_size; ++m) { - for (int n = -n_size; n < n_size + 1; ++n) { - int abs_n = abs(n); - int sgn_n = signum(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); - - double normedFC = basis_norm * fcCos[mn]; - - m_fcCC[abs_n * m_size + m] += normedFC; - if (abs_n > 0) { - m_fcSS[abs_n * m_size + m] += sgn_n * normedFC; - } - - mn++; - } // n - } // m - - CHECK_EQ(mn, mnmax) << "counting error: mn=" << mn << " should be " << mnmax - << " in cos_to_cc_ss"; - - return mnmax; -} - -int FourierBasisFastToroidal::sin_to_sc_cs(const std::span fcSin, - std::span m_fcSC, - std::span m_fcCS, int n_size, - int m_size) const { - // m = 0: n = 0, 1, ..., ntor --> ntor + 1 - // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) - int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); - - absl::c_fill_n(m_fcSC, m_size * (n_size + 1), 0); - absl::c_fill_n(m_fcCS, m_size * (n_size + 1), 0); - - int mn = 1; - - int m = 0; - for (int n = 1; n < n_size + 1; ++n) { - int abs_n = abs(n); - int sgn_n = signum(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); - - double normedFC = basis_norm * fcSin[mn]; - - // no contribution to fcSC where m == 0 - // check for n > 0 is redundant when starting loop at n=1 - m_fcCS[abs_n * m_size + m] = -sgn_n * normedFC; - - mn++; - } - - for (m = 1; m < m_size; ++m) { - for (int n = -n_size; n < n_size + 1; ++n) { - int abs_n = abs(n); - int sgn_n = signum(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); - - double normedFC = basis_norm * fcSin[mn]; - - m_fcSC[abs_n * m_size + m] += normedFC; - if (abs_n > 0) { - m_fcCS[abs_n * m_size + m] += -sgn_n * normedFC; - } - - mn++; - } // n - } // m - - CHECK_EQ(mn, mnmax) << "counting error: mn=" << mn << " should be " << mnmax - << " in sin_to_sc_cs"; - - return mnmax; -} - -int FourierBasisFastToroidal::cc_ss_to_cos(const std::span fcCC, - const std::span fcSS, - std::span m_fcCos, - int n_size, int m_size) const { - // m = 0: n = 0, 1, ..., ntor --> ntor + 1 - // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) - int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); - - absl::c_fill_n(m_fcCos, mnmax, 0); - - int mn = 0; - - int m = 0; - for (int n = 0; n < n_size + 1; ++n) { - int abs_n = abs(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[n]); - - m_fcCos[mn] = fcCC[abs_n * m_size + m] / basis_norm; - - mn++; - } // n - - for (m = 1; m < m_size; ++m) { - for (int n = -n_size; n < n_size + 1; ++n) { - int abs_n = abs(n); - int sgn_n = signum(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); - - if (abs_n == 0) { - m_fcCos[mn] = fcCC[abs_n * m_size + m] / basis_norm; - } else { - double raw_cc = fcCC[abs_n * m_size + m]; - double raw_ss = fcSS[abs_n * m_size + m]; - m_fcCos[mn] = 0.5 * (raw_cc + sgn_n * raw_ss) / basis_norm; - } - - mn++; - } // n - } // m - - CHECK_EQ(mn, mnmax) << "counting error: mn=" << mn << " should be " << mnmax - << " in cc_ss_to_cos"; - - return mnmax; -} - -int FourierBasisFastToroidal::sc_cs_to_sin(const std::span fcSC, - const std::span fcCS, - std::span m_fcSin, - int n_size, int m_size) const { - // m = 0: n = 0, 1, ..., ntor --> ntor + 1 - // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) - int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); - - absl::c_fill_n(m_fcSin, mnmax, 0); - - int mn = 1; - - int m = 0; - for (int n = 1; n < n_size + 1; ++n) { - int abs_n = abs(n); - double basis_norm = 1.0 / (mscale[m] * nscale[n]); - - m_fcSin[mn] = -fcCS[abs_n * m_size + m] / basis_norm; - - mn++; - } // n - - for (m = 1; m < m_size; ++m) { - for (int n = -n_size; n < n_size + 1; ++n) { - int abs_n = abs(n); - int sgn_n = signum(n); - - double basis_norm = 1.0 / (mscale[m] * nscale[abs_n]); - - if (abs_n == 0) { - m_fcSin[mn] = fcSC[abs_n * m_size + m] / basis_norm; - } else { - double raw_sc = fcSC[abs_n * m_size + m]; - double raw_cs = fcCS[abs_n * m_size + m]; - m_fcSin[mn] = 0.5 * (raw_sc - sgn_n * raw_cs) / basis_norm; - } - - mn++; - } // n - } // m - - CHECK_EQ(mn, mnmax) << "counting error: mn=" << mn << " should be " << mnmax - << " in sc_cs_to_sin"; - - return mnmax; -} - -int FourierBasisFastToroidal::mnIdx(int m, int n) const { - if (m == 0) { - CHECK_GE(n, 0) << "no mn index available for n < 0"; - return n; - } else { - return (s_.ntor + 1) + (m - 1) * (2 * s_.ntor + 1) + (n + s_.ntor); - } -} - -// number of unique Fourier coefficients for -// m = 0, 1, ..., m_size - 1 -// n = -n_size, -(n_size-1), ..., -1, 0, 1, ..., (n_size-1), n_size -int FourierBasisFastToroidal::mnMax(int m_size, int n_size) const { - // m = 0: n = 0, 1, ..., ntor --> ntor + 1 - // m > 0: n = -ntor, ..., ntor --> (mpol - 1) * (2 * ntor + 1) - int mnmax = (n_size + 1) + (m_size - 1) * (2 * n_size + 1); - - return mnmax; -} - -void FourierBasisFastToroidal::computeConversionIndices(Eigen::VectorXi& m_xm, - Eigen::VectorXi& m_xn, - int n_size, int m_size, - int nfp) const { - const int mnmax = mnMax(m_size, n_size); - int mn = 0; - - int m = 0; - for (int n = 0; n < n_size + 1; ++n) { - m_xm[mn] = m; - m_xn[mn] = n * nfp; - mn++; - } - - for (m = 1; m < m_size; ++m) { - for (int n = -n_size; n < n_size + 1; ++n) { - m_xm[mn] = m; - m_xn[mn] = n * nfp; - mn++; - } - } - - CHECK_EQ(mn, mnmax) << "counting error: mn=" << mn << " should be " << mnmax; -} - -} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h index 8f1598c4e..383af2a3a 100644 --- a/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h +++ b/src/vmecpp/cpp/vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h @@ -5,307 +5,9 @@ #ifndef VMECPP_COMMON_FOURIER_BASIS_FAST_TOROIDAL_FOURIER_BASIS_FAST_TOROIDAL_H_ #define VMECPP_COMMON_FOURIER_BASIS_FAST_TOROIDAL_FOURIER_BASIS_FAST_TOROIDAL_H_ -#include -#include - -#include "vmecpp/common/sizes/sizes.h" - -namespace vmecpp { - -// Fourier basis representation optimized for toroidal coordinate operations. -// -// This class provides the fundamental spectral basis for VMEC++ computations, -// representing 3D plasma quantities using Fourier decomposition in flux -// coordinates (s, \theta, \zeta) where: -// s = normalized toroidal flux (radial coordinate) -// \theta = poloidal angle -// \zeta = toroidal angle = nfp * \phi (field period toroidal angle) -// -// Physical quantities are expanded as: -// f(s,\theta,\zeta) = \sum_{m,n} f_{mn}(s) * basis_function(m*\theta, -// n*\zeta) -// -// The "FastToroidal" layout stores data with toroidal (\zeta) coordinate as -// the fast (innermost) loop index, optimizing for operations that iterate -// over toroidal modes. This differs from FastPoloidal layout. -// -// NOTE: Nestor has its own implementation of this class because we want to be -// able to use different data layouts between VMEC++ and Nestor. -// TODO(eguiraud) reduce overall code duplication -class FourierBasisFastToroidal { - public: - explicit FourierBasisFastToroidal(const Sizes* s); - - // ============================================================================ - // FOURIER BASIS SCALING FACTORS - // ============================================================================ - - // [mnyq2+1] Poloidal mode scaling factors: sqrt(2) for m>0, 1.0 for m=0 - // Applied to cos(m*\theta) and sin(m*\theta) basis functions for DFT - // normalization Enables proper normalization: 1/\pi for m>0 modes, 1/(2\pi) - // for m=0 mode - Eigen::VectorXd mscale; - - // [nnyq2+1] Toroidal mode scaling factors: sqrt(2) for n>0, 1.0 for n=0 - // Applied to cos(n*\zeta) and sin(n*\zeta) basis functions for DFT - // normalization Enables proper normalization: 1/\pi for n>0 modes, 1/(2\pi) - // for n=0 mode - Eigen::VectorXd nscale; - - // ============================================================================ - // POLOIDAL BASIS FUNCTIONS (l-major layout: [l][m]) - // ============================================================================ - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal cosine basis - // Layout: cosmu[l*(mnyq2+1) + m] = cos(m*\theta[l]) * mscale[m] - // \theta[l] = 2*\pi*l/nThetaEven for l=0...nThetaReduced-1 (reduced [0,\pi] - // interval) - Eigen::VectorXd cosmu; - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal sine basis - // Layout: sinmu[l*(mnyq2+1) + m] = sin(m*\theta[l]) * mscale[m] - Eigen::VectorXd sinmu; - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal cosine derivative - // Layout: cosmum[l*(mnyq2+1) + m] = m * cos(m*\theta[l]) * mscale[m] - // Used for computing \partial/\partial\theta derivatives in force - // calculations - Eigen::VectorXd cosmum; - - // [nThetaReduced * (mnyq2+1)] Pre-scaled poloidal sine derivative - // Layout: sinmum[l*(mnyq2+1) + m] = -m * sin(m*\theta[l]) * mscale[m] - // Used for computing \partial/\partial\theta derivatives in force - // calculations - Eigen::VectorXd sinmum; - - // ============================================================================ - // POLOIDAL BASIS WITH INTEGRATION WEIGHTS - // ============================================================================ - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal cosine basis - // Layout: cosmui[l*(mnyq2+1) + m] = cosmu[l*(mnyq2+1) + m] * intNorm - // intNorm = 1/(nZeta*(nThetaReduced-1)), with boundary point factor 1/2 - Eigen::VectorXd cosmui; - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal sine basis - // Layout: sinmui[l*(mnyq2+1) + m] = sinmu[l*(mnyq2+1) + m] * intNorm - Eigen::VectorXd sinmui; - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal cosine derivative - // Layout: cosmumi[l*(mnyq2+1) + m] = cosmum[l*(mnyq2+1) + m] * intNorm - Eigen::VectorXd cosmumi; - - // [nThetaReduced * (mnyq2+1)] Integration-weighted poloidal sine derivative - // Layout: sinmumi[l*(mnyq2+1) + m] = sinmum[l*(mnyq2+1) + m] * intNorm - Eigen::VectorXd sinmumi; - - // ============================================================================ - // TOROIDAL BASIS FUNCTIONS (n-major layout: [n][k]) - // ============================================================================ - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal cosine basis - // Layout: cosnv[n*nZeta + k] = cos(n*\zeta[k]) * nscale[n] - // \zeta[k] = 2*\pi*k/nZeta for k=0...nZeta-1 (full [0,2\pi] interval) - Eigen::VectorXd cosnv; - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal sine basis - // Layout: sinnv[n*nZeta + k] = sin(n*\zeta[k]) * nscale[n] - Eigen::VectorXd sinnv; - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal cosine derivative with nfp factor - // Layout: cosnvn[n*nZeta + k] = n*nfp * cos(n*\zeta[k]) * nscale[n] - // Factor nfp converts \partial/\partial\zeta to \partial/\partial\phi - // derivatives - Eigen::VectorXd cosnvn; - - // [(nnyq2+1) * nZeta] Pre-scaled toroidal sine derivative with nfp factor - // Layout: sinnvn[n*nZeta + k] = -n*nfp * sin(n*\zeta[k]) * nscale[n] - // Factor nfp converts \partial/\partial\zeta to \partial/\partial\phi - // derivatives - Eigen::VectorXd sinnvn; - - // ============================================================================ - // FOURIER BASIS CONVERSION FUNCTIONS - // ============================================================================ - // - // These functions convert between VMEC++'s two Fourier basis representations - // using trigonometric identities and pre-computed scaling factors. - // See docs/fourier_basis_implementation.md for complete mathematical details. - // - // Two Fourier basis types: - // 1. COMBINED BASIS (External): cos(m*\theta - n*\zeta), sin(m*\theta - - // n*\zeta) - // - Used in: wout files, Python API, traditional VMEC format - // - Storage: Linear arrays indexed by mode number mn - // - // 2. PRODUCT BASIS (Internal): cos(m*\theta)*cos(n*\zeta), - // sin(m*\theta)*sin(n*\zeta), etc. - // - Used in: Internal computations with separable DFT operations - // - Storage: 2D arrays indexed by (m,n) separately - // - Layout: fcCC[n*m_size + m] (n-major ordering for toroidal class) - // - // Mathematical basis function identity: - // cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + - // sin(m*\theta)*sin(n*\zeta) - - /** - * Convert coefficients from combined cosine basis to separable product basis. - * - * Basis function identity: - * cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + - * sin(m*\theta)*sin(n*\zeta) - * - * This function transforms coefficients for cos(m*\theta - n*\zeta) basis - * functions into coefficients for the separable product basis - * cos(m*\theta)*cos(n*\zeta) and sin(m*\theta)*sin(n*\zeta). The - * transformation accounts for VMEC symmetry where only n >= 0 coefficients - * are stored. - * - * Implementation uses pre-computed scaling factors (mscale, nscale) and - * handles positive/negative toroidal mode symmetry. Standalone function. - * - * Physics context: Converts external coefficient format (wout files) to - * internal product basis coefficients that enable separable DFT operations. - * - * @param fcCos [input] Coefficients for cos(m*\theta - n*\zeta) basis, size - * mnmax - * @param m_fcCC [output] Coefficients for cos(m*\theta)*cos(n*\zeta) basis, - * size m_size*(n_size+1) - * @param m_fcSS [output] Coefficients for sin(m*\theta)*sin(n*\zeta) basis, - * size m_size*(n_size+1) - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int cos_to_cc_ss(const std::span fcCos, - std::span m_fcCC, std::span m_fcSS, - int n_size, int m_size) const; - - /** - * Convert coefficients from combined sine basis to separable product basis. - * - * Basis function identity: - * sin(m*\theta - n*\zeta) = sin(m*\theta)*cos(n*\zeta) - - * cos(m*\theta)*sin(n*\zeta) - * - * This function transforms coefficients for sin(m*\theta - n*\zeta) basis - * functions into coefficients for the separable product basis - * sin(m*\theta)*cos(n*\zeta) and cos(m*\theta)*sin(n*\zeta). Enforces - * sin(0*\theta - 0*\zeta) = 0 constraint. - * - * Physics context: Handles sine-parity quantities like Z coordinates (zmns) - * and \lambda angle functions (lmns coefficients). - * - * @param fcSin [input] Coefficients for sin(m*\theta - n*\zeta) basis, size - * mnmax - * @param m_fcSC [output] Coefficients for sin(m*\theta)*cos(n*\zeta) basis, - * size m_size*(n_size+1) - * @param m_fcCS [output] Coefficients for cos(m*\theta)*sin(n*\zeta) basis, - * size m_size*(n_size+1) - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int sin_to_sc_cs(const std::span fcSin, - std::span m_fcSC, std::span m_fcCS, - int n_size, int m_size) const; - - /** - * Convert coefficients from separable product basis back to combined cosine - * basis. - * - * Inverse transformation using basis function identity: - * cos(m*\theta - n*\zeta) = cos(m*\theta)*cos(n*\zeta) + - * sin(m*\theta)*sin(n*\zeta) - * - * This function reconstructs coefficients for cos(m*\theta - n*\zeta) basis - * from coefficients of the separable product basis. Handles positive/negative - * toroidal mode reconstruction and applies inverse scaling factors. - * - * Physics context: Converts internal computational results back to external - * coefficient format for wout files, Python API, and traditional VMEC output. - * - * @param fcCC [input] Coefficients for cos(m*\theta)*cos(n*\zeta) basis, size - * m_size*(n_size+1) - * @param fcSS [input] Coefficients for sin(m*\theta)*sin(n*\zeta) basis, size - * m_size*(n_size+1) - * @param m_fcCos [output] Coefficients for cos(m*\theta - n*\zeta) basis, - * size mnmax - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int cc_ss_to_cos(const std::span fcCC, - const std::span fcSS, - std::span m_fcCos, int n_size, int m_size) const; - - /** - * Convert coefficients from separable product basis back to combined sine - * basis. - * - * Inverse transformation using basis function identity: - * sin(m*\theta - n*\zeta) = sin(m*\theta)*cos(n*\zeta) - - * cos(m*\theta)*sin(n*\zeta) - * - * This function reconstructs coefficients for sin(m*\theta - n*\zeta) basis - * from coefficients of the separable product basis. Enforces sin(0*\theta - - * 0*\zeta) = 0. - * - * Physics context: Converts internal results for sine-parity quantities - * back to external coefficient format for output and analysis. - * - * @param fcSC [input] Coefficients for sin(m*\theta)*cos(n*\zeta) basis, size - * m_size*(n_size+1) - * @param fcCS [input] Coefficients for cos(m*\theta)*sin(n*\zeta) basis, size - * m_size*(n_size+1) - * @param m_fcSin [output] Coefficients for sin(m*\theta - n*\zeta) basis, - * size mnmax - * @param n_size Toroidal mode range: n in [-n_size, n_size] - * @param m_size Poloidal mode range: m in [0, m_size-1] - * @return Total number of modes processed (mnmax) - */ - int sc_cs_to_sin(const std::span fcSC, - const std::span fcCS, - std::span m_fcSin, int n_size, int m_size) const; - - int mnIdx(int m, int n) const; - int mnMax(int m_size, int n_size) const; - void computeConversionIndices(Eigen::VectorXi& m_xm, Eigen::VectorXi& m_xn, - int n_size, int m_size, int nfp) const; - - // ============================================================================ - // MODE NUMBER MAPPING ARRAYS - // ============================================================================ - - // [mnmax] Poloidal mode numbers for standard resolution Fourier coefficients - // Layout: xm[mn] = poloidal mode number m for the mn-th coefficient - // Maps linear coefficient index mn to 2D mode (m,n) for spectral operations - Eigen::VectorXi xm; - - // [mnmax] Toroidal mode numbers for standard resolution Fourier coefficients - // Layout: xn[mn] = toroidal mode number n*nfp for the mn-th coefficient - // Factor nfp included to convert from field periods to geometric toroidal - // modes - Eigen::VectorXi xn; - - // [mnmax_nyq] Poloidal mode numbers for Nyquist-extended Fourier coefficients - // Layout: xm_nyq[mn] = poloidal mode number m for the mn-th Nyquist - // coefficient Extended resolution to avoid aliasing in nonlinear force - // calculations - Eigen::VectorXi xm_nyq; - - // [mnmax_nyq] Toroidal mode numbers for Nyquist-extended Fourier coefficients - // Layout: xn_nyq[mn] = toroidal mode number n*nfp for the mn-th Nyquist - // coefficient Extended resolution to avoid aliasing in nonlinear force - // calculations - Eigen::VectorXi xn_nyq; - - private: - const Sizes& s_; - - void computeFourierBasisFastToroidal(int nfp); -}; - -} // namespace vmecpp +// FourierBasisFastToroidal is the zeta-fast (n-major) layout of the shared +// FourierBasis template, which now holds the single implementation. This header +// is retained as a stable include path for existing call sites. +#include "vmecpp/common/fourier_basis/fourier_basis.h" // IWYU pragma: export #endif // VMECPP_COMMON_FOURIER_BASIS_FAST_TOROIDAL_FOURIER_BASIS_FAST_TOROIDAL_H_ diff --git a/src/vmecpp/cpp/vmecpp/common/makegrid_lib/makegrid_lib_test.cc b/src/vmecpp/cpp/vmecpp/common/makegrid_lib/makegrid_lib_test.cc index ed2952b5f..d328ee5fa 100644 --- a/src/vmecpp/cpp/vmecpp/common/makegrid_lib/makegrid_lib_test.cc +++ b/src/vmecpp/cpp/vmecpp/common/makegrid_lib/makegrid_lib_test.cc @@ -509,19 +509,23 @@ TEST_P(CheckComputeMagneticFieldResponseTable, MatchesFortranReference) { int ncid = 0; ASSERT_EQ(nc_open(p.reference_nc_file.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - EXPECT_EQ(NetcdfReadInt(ncid, "nfp"), + EXPECT_EQ(NetcdfReadInt(ncid, "nfp").value(), makegrid_parameters.number_of_field_periods); - EXPECT_EQ(NetcdfReadInt(ncid, "ir"), + EXPECT_EQ(NetcdfReadInt(ncid, "ir").value(), makegrid_parameters.number_of_r_grid_points); - EXPECT_EQ(NetcdfReadDouble(ncid, "rmin"), makegrid_parameters.r_grid_minimum); - EXPECT_EQ(NetcdfReadDouble(ncid, "rmax"), makegrid_parameters.r_grid_maximum); - EXPECT_EQ(NetcdfReadInt(ncid, "jz"), + EXPECT_EQ(NetcdfReadDouble(ncid, "rmin").value(), + makegrid_parameters.r_grid_minimum); + EXPECT_EQ(NetcdfReadDouble(ncid, "rmax").value(), + makegrid_parameters.r_grid_maximum); + EXPECT_EQ(NetcdfReadInt(ncid, "jz").value(), makegrid_parameters.number_of_z_grid_points); - EXPECT_EQ(NetcdfReadDouble(ncid, "zmin"), makegrid_parameters.z_grid_minimum); - EXPECT_EQ(NetcdfReadDouble(ncid, "zmax"), makegrid_parameters.z_grid_maximum); - EXPECT_EQ(NetcdfReadInt(ncid, "kp"), + EXPECT_EQ(NetcdfReadDouble(ncid, "zmin").value(), + makegrid_parameters.z_grid_minimum); + EXPECT_EQ(NetcdfReadDouble(ncid, "zmax").value(), + makegrid_parameters.z_grid_maximum); + EXPECT_EQ(NetcdfReadInt(ncid, "kp").value(), makegrid_parameters.number_of_phi_grid_points); - EXPECT_EQ(NetcdfReadInt(ncid, "nextcur"), number_of_serial_circuits); + EXPECT_EQ(NetcdfReadInt(ncid, "nextcur").value(), number_of_serial_circuits); for (int circuit_index = 0; circuit_index < number_of_serial_circuits; ++circuit_index) { @@ -537,11 +541,14 @@ TEST_P(CheckComputeMagneticFieldResponseTable, MatchesFortranReference) { // load mgrid data from NetCDF file std::vector>> b_r_contribution = - NetcdfReadArray3D(ncid, absl::StrFormat("br_%03d", circuit_index + 1)); + NetcdfReadArray3D(ncid, absl::StrFormat("br_%03d", circuit_index + 1)) + .value(); std::vector>> b_p_contribution = - NetcdfReadArray3D(ncid, absl::StrFormat("bp_%03d", circuit_index + 1)); + NetcdfReadArray3D(ncid, absl::StrFormat("bp_%03d", circuit_index + 1)) + .value(); std::vector>> b_z_contribution = - NetcdfReadArray3D(ncid, absl::StrFormat("bz_%03d", circuit_index + 1)); + NetcdfReadArray3D(ncid, absl::StrFormat("bz_%03d", circuit_index + 1)) + .value(); // perform comparison of points that are not explicitly excluded from the // comparison @@ -647,31 +654,31 @@ TEST_P(CheckComputeVectorPotentialCache, MatchesFortranReference) { int ncid = 0; ASSERT_EQ(nc_open(p.reference_nc_file.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - const int nfp = NetcdfReadInt(ncid, "nfp"); + const int nfp = NetcdfReadInt(ncid, "nfp").value(); EXPECT_EQ(nfp, makegrid_parameters.number_of_field_periods); - const int numR = NetcdfReadInt(ncid, "ir"); + const int numR = NetcdfReadInt(ncid, "ir").value(); EXPECT_EQ(numR, makegrid_parameters.number_of_r_grid_points); - const double minR = NetcdfReadDouble(ncid, "rmin"); + const double minR = NetcdfReadDouble(ncid, "rmin").value(); EXPECT_EQ(minR, makegrid_parameters.r_grid_minimum); - const double maxR = NetcdfReadDouble(ncid, "rmax"); + const double maxR = NetcdfReadDouble(ncid, "rmax").value(); EXPECT_EQ(maxR, makegrid_parameters.r_grid_maximum); - const int numZ = NetcdfReadInt(ncid, "jz"); + const int numZ = NetcdfReadInt(ncid, "jz").value(); EXPECT_EQ(numZ, makegrid_parameters.number_of_z_grid_points); - const double minZ = NetcdfReadDouble(ncid, "zmin"); + const double minZ = NetcdfReadDouble(ncid, "zmin").value(); EXPECT_EQ(minZ, makegrid_parameters.z_grid_minimum); - const double maxZ = NetcdfReadDouble(ncid, "zmax"); + const double maxZ = NetcdfReadDouble(ncid, "zmax").value(); EXPECT_EQ(maxZ, makegrid_parameters.z_grid_maximum); - const int numPhi = NetcdfReadInt(ncid, "kp"); + const int numPhi = NetcdfReadInt(ncid, "kp").value(); EXPECT_EQ(numPhi, makegrid_parameters.number_of_phi_grid_points); - const int nextcur = NetcdfReadInt(ncid, "nextcur"); + const int nextcur = NetcdfReadInt(ncid, "nextcur").value(); EXPECT_EQ(nextcur, number_of_serial_circuits); for (int circuit_index = 0; circuit_index < number_of_serial_circuits; @@ -688,11 +695,14 @@ TEST_P(CheckComputeVectorPotentialCache, MatchesFortranReference) { // load mgrid data from NetCDF file std::vector>> a_r_contribution = - NetcdfReadArray3D(ncid, absl::StrFormat("ar_%03d", circuit_index + 1)); + NetcdfReadArray3D(ncid, absl::StrFormat("ar_%03d", circuit_index + 1)) + .value(); std::vector>> a_p_contribution = - NetcdfReadArray3D(ncid, absl::StrFormat("ap_%03d", circuit_index + 1)); + NetcdfReadArray3D(ncid, absl::StrFormat("ap_%03d", circuit_index + 1)) + .value(); std::vector>> a_z_contribution = - NetcdfReadArray3D(ncid, absl::StrFormat("az_%03d", circuit_index + 1)); + NetcdfReadArray3D(ncid, absl::StrFormat("az_%03d", circuit_index + 1)) + .value(); // perform comparison of points that are not explicitly excluded from the // comparison diff --git a/src/vmecpp/cpp/vmecpp/common/sizes/sizes.cc b/src/vmecpp/cpp/vmecpp/common/sizes/sizes.cc index 68669e317..8f812a264 100644 --- a/src/vmecpp/cpp/vmecpp/common/sizes/sizes.cc +++ b/src/vmecpp/cpp/vmecpp/common/sizes/sizes.cc @@ -14,13 +14,19 @@ namespace vmecpp { Sizes::Sizes(const VmecINDATA& id) - : Sizes(id.lasym, id.nfp, id.mpol, id.ntor, id.ntheta, id.nzeta) {} + : Sizes(id.lasym, id.nfp, id.mpol, id.ntor, id.ntheta, id.nzeta, + id.mpol_geometry, id.ntor_geometry) {} -Sizes::Sizes(bool lasym, int nfp, int mpol, int ntor, int ntheta, int nzeta) +Sizes::Sizes(bool lasym, int nfp, int mpol, int ntor, int ntheta, int nzeta, + int mpol_geometry, int ntor_geometry) : lasym(lasym), nfp(nfp), mpol(mpol), ntor(ntor), + mpolGeometry((mpol_geometry < 1 || mpol_geometry > mpol) ? mpol + : mpol_geometry), + ntorGeometry((ntor_geometry < 0 || ntor_geometry > ntor) ? ntor + : ntor_geometry), ntheta(ntheta), nZeta(nzeta) { computeDerivedSizes(); diff --git a/src/vmecpp/cpp/vmecpp/common/sizes/sizes.h b/src/vmecpp/cpp/vmecpp/common/sizes/sizes.h index d774623a5..173bc9de1 100644 --- a/src/vmecpp/cpp/vmecpp/common/sizes/sizes.h +++ b/src/vmecpp/cpp/vmecpp/common/sizes/sizes.h @@ -19,7 +19,8 @@ class Sizes { // object. explicit Sizes(const VmecINDATA& id); - Sizes(bool lasym, int nfp, int mpol, int ntor, int ntheta, int nzeta); + Sizes(bool lasym, int nfp, int mpol, int ntor, int ntheta, int nzeta, + int mpol_geometry = -1, int ntor_geometry = -1); // inputs from INDATA @@ -35,6 +36,12 @@ class Sizes { // number of toroidal Fourier harmoncis int ntor; + // geometry-only resolution: R and Z modes with m >= mpolGeometry or + // n > ntorGeometry are frozen, while lambda keeps the full mpol/ntor. + // Equal to mpol/ntor unless a reduced geometry resolution was requested. + int mpolGeometry; + int ntorGeometry; + // number of poloidal grid points int ntheta; diff --git a/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.cc b/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.cc index 4a1b5f4ef..22fef164f 100644 --- a/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.cc +++ b/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.cc @@ -111,6 +111,8 @@ VmecINDATA::VmecINDATA() { nfp = 1; mpol = 6; ntor = 0; + mpol_geometry = -1; + ntor_geometry = -1; ntheta = 0; nzeta = 0; @@ -250,6 +252,8 @@ absl::Status VmecINDATA::WriteTo(H5::H5File& file) const { WriteH5Dataset(nfp, "/indata/nfp", file); WriteH5Dataset(mpol, "/indata/mpol", file); WriteH5Dataset(ntor, "/indata/ntor", file); + WriteH5Dataset(mpol_geometry, "/indata/mpol_geometry", file); + WriteH5Dataset(ntor_geometry, "/indata/ntor_geometry", file); WriteH5Dataset(ntheta, "/indata/ntheta", file); WriteH5Dataset(nzeta, "/indata/nzeta", file); WriteH5Dataset(phiedge, "/indata/phiedge", file); @@ -323,6 +327,14 @@ absl::Status VmecINDATA::LoadInto(VmecINDATA& m_indata, H5::H5File& from_file) { ReadH5Dataset(m_indata.nfp, "/indata/nfp", from_file); ReadH5Dataset(m_indata.mpol, "/indata/mpol", from_file); ReadH5Dataset(m_indata.ntor, "/indata/ntor", from_file); + // Added after the initial wout schema; read only when present so that files + // written before this field load with the defaults from the constructor. + if (from_file.nameExists("/indata/mpol_geometry")) { + ReadH5Dataset(m_indata.mpol_geometry, "/indata/mpol_geometry", from_file); + } + if (from_file.nameExists("/indata/ntor_geometry")) { + ReadH5Dataset(m_indata.ntor_geometry, "/indata/ntor_geometry", from_file); + } ReadH5Dataset(m_indata.ntheta, "/indata/ntheta", from_file); ReadH5Dataset(m_indata.nzeta, "/indata/nzeta", from_file); ReadH5Dataset(m_indata.phiedge, "/indata/phiedge", from_file); @@ -507,6 +519,22 @@ absl::StatusOr VmecINDATA::FromJson( vmec_indata.ntor = maybe_ntor->value(); } + auto maybe_mpol_geometry = JsonReadInt(j, "mpol_geometry"); + if (!maybe_mpol_geometry.ok()) { + return maybe_mpol_geometry.status(); + } + if (maybe_mpol_geometry->has_value()) { + vmec_indata.mpol_geometry = maybe_mpol_geometry->value(); + } + + auto maybe_ntor_geometry = JsonReadInt(j, "ntor_geometry"); + if (!maybe_ntor_geometry.ok()) { + return maybe_ntor_geometry.status(); + } + if (maybe_ntor_geometry->has_value()) { + vmec_indata.ntor_geometry = maybe_ntor_geometry->value(); + } + auto maybe_ntheta = JsonReadInt(j, "ntheta"); if (!maybe_ntheta.ok()) { return maybe_ntheta.status(); @@ -1083,6 +1111,8 @@ absl::StatusOr VmecINDATA::ToJson() const { output["nfp"] = nfp; output["mpol"] = mpol; output["ntor"] = ntor; + output["mpol_geometry"] = mpol_geometry; + output["ntor_geometry"] = ntor_geometry; output["ntheta"] = ntheta; output["nzeta"] = nzeta; @@ -1430,13 +1460,14 @@ absl::Status IsConsistent(const VmecINDATA& vmec_indata, // nothing to check here: lforbal can be true or false and both are valid... // iteration_style - // For the current state of the code, we only accept VMEC_8_52, - // but in the future [TODO(jons)] also all other (implemented) enum values - // are valid. - if (vmec_indata.iteration_style != IterationStyle::VMEC_8_52) { - return absl::InvalidArgumentError(absl::StrFormat( - "input variable 'iteration_style' must be 'vmec_8_52', but is %s\n", - ToString(vmec_indata.iteration_style))); + // VMEC_8_52 and PARVMEC are both implemented in Vmec::SolveEquilibriumLoop. + if (vmec_indata.iteration_style != IterationStyle::VMEC_8_52 && + vmec_indata.iteration_style != IterationStyle::PARVMEC) { + return absl::InvalidArgumentError( + absl::StrFormat("input variable 'iteration_style' must be 'vmec_8_52' " + "or 'parvmec', but " + "is %s\n", + ToString(vmec_indata.iteration_style))); } // return_outputs_even_if_not_converged diff --git a/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.h b/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.h index 9cf66a193..caaa1ebdc 100644 --- a/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.h +++ b/src/vmecpp/cpp/vmecpp/common/vmec_indata/vmec_indata.h @@ -79,6 +79,13 @@ class VmecINDATA { // ..., ntor-1, ntor int ntor; + // Optional reduced resolution for the geometry (R, Z). When in [1, mpol) / + // [0, ntor), R and Z modes above it are held fixed while lambda keeps the + // full mpol/ntor resolution. < 0 (or >= mpol/ntor) means "use mpol/ntor", + // i.e. geometry and lambda share resolution as before. + int mpol_geometry; + int ntor_geometry; + // number of poloidal grid points; if odd: is rounded to next smaller even // number int ntheta; diff --git a/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/BUILD.bazel b/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/BUILD.bazel index 1a05d184e..d45bfdad1 100644 --- a/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/BUILD.bazel +++ b/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/BUILD.bazel @@ -30,3 +30,16 @@ cc_test( ], size = "small", ) + +cc_binary( + name = "laplace_solver_bench", + srcs = ["laplace_solver_bench.cc"], + deps = [ + ":laplace_solver", + "//vmecpp/common/fourier_basis_fast_toroidal", + "//vmecpp/common/sizes:sizes", + "//vmecpp/free_boundary/tangential_partitioning:tangential_partitioning", + "@google_benchmark//:benchmark_main", + ], + linkopts = ["-llapack"], +) diff --git a/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/laplace_solver_bench.cc b/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/laplace_solver_bench.cc new file mode 100644 index 000000000..752970dd8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/free_boundary/laplace_solver/laplace_solver_bench.cc @@ -0,0 +1,206 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT + +// Microbenchmarks for the free-boundary Laplace solve (NESTOR). +// +// The dense linear system assembled and factorized here is the dominant +// free-boundary cost when NESTOR performs a full update: an +// mnpd x mnpd (mnpd = (mf+1)*(2*nf+1)) matrix is built, LU-factorized via +// LAPACK dgetrf, and back-substituted via dgetrs. We benchmark: +// +// * TransformGreensFunctionDerivative -- the largest of the Fourier +// transforms feeding the source term (uses the manufactured single-mode +// input from laplace_solver_test.cc). +// * BuildMatrix + DecomposeMatrix + SolveForPotential -- the assemble + +// factorize + solve chain, which is the actual "Laplace solve". +// +// Sizes are chosen to bracket real free-boundary runs (cth_like / solovev +// free-boundary configurations use ntor ~ 4-6, mpol ~ 5-8). + +#include +#include +#include +#include +#include +#include +#include + +#include "Eigen/Dense" +#include "benchmark/benchmark.h" +#include "vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h" +#include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/free_boundary/laplace_solver/laplace_solver.h" +#include "vmecpp/free_boundary/tangential_partitioning/tangential_partitioning.h" + +namespace vmecpp { +namespace { + +struct ResParams { + int nfp; + int mpol; + int ntor; + const char* label; +}; + +// (nfp, mpol, ntor) sizes bracketing real free-boundary runs. +constexpr ResParams kResolutions[] = { + {5, 5, 4, "5x4"}, + {5, 8, 6, "8x6"}, + {5, 12, 8, "12x8"}, +}; + +// ---------------------------------------------------------------------------- +// Fixture matching laplace_solver_test.cc's minimal single-threaded setup: +// a non-mocked LaplaceSolver with flat matrixShare / iPiv / bvecShare backing +// storage. +// ---------------------------------------------------------------------------- +struct BenchFixture { + Sizes s; + FourierBasisFastToroidal fb; + TangentialPartitioning tp; + + int nf; + int mf; + int mnpd; + + std::vector matrixShare; + std::vector iPiv; + std::vector bvecShare; + + std::unique_ptr ls; + + // Seeded, well-conditioned system state re-applied before each timed solve. + Eigen::VectorXd amat_seed; // diagonally-dominant [mnpd*mnpd] + Eigen::VectorXd bvec_singular_seed; // [mnpd] + + // Manufactured single-mode Green's-function-derivative input. + Eigen::VectorXd greenp; + + explicit BenchFixture(int nfp, int mpol, int ntor) + : s(/*lasym=*/false, nfp, mpol, ntor, /*ntheta=*/0, + /*nzeta=*/4 * (ntor + 1)), + fb(&s), + tp(s.nZnT), + nf(ntor), + mf(mpol + 1), + mnpd((mf + 1) * (2 * nf + 1)), + matrixShare(mnpd * mnpd, 0.0), + iPiv(mnpd, 0), + bvecShare(mnpd, 0.0) { + ls = std::make_unique( + &s, &fb, &tp, nf, mf, std::span(matrixShare), + std::span(iPiv), std::span(bvecShare)); + + std::mt19937 rng(42); + std::uniform_real_distribution dist(-1.0, 1.0); + + // Diagonally-dominant matrix so dgetrf never hits a singular pivot. + amat_seed.resize(mnpd * mnpd); + for (int col = 0; col < mnpd; ++col) { + for (int row = 0; row < mnpd; ++row) { + amat_seed[col * mnpd + row] = dist(rng); + } + // BuildMatrix() adds +0.5 on the diagonal; add a large diagonal boost + // here too to guarantee well-conditioned LU. + amat_seed[col * mnpd + col] += 2.0 * mnpd; + } + + bvec_singular_seed.resize(mnpd); + for (int i = 0; i < mnpd; ++i) bvec_singular_seed[i] = dist(rng); + + // Manufactured single-mode greenp, as in laplace_solver_test.cc. + const int numLocal = tp.ztMax - tp.ztMin; + const int nThetaEven = s.nThetaEven; + const int nZeta = s.nZeta; + greenp = Eigen::VectorXd::Zero(numLocal * nThetaEven * nZeta); + const int m0 = std::min(2, mpol - 1); + const int n0 = std::min(1, ntor); + for (int klpRel = 0; klpRel < numLocal; ++klpRel) { + for (int l = 0; l < nThetaEven; ++l) { + const double theta = 2.0 * std::numbers::pi * l / nThetaEven; + for (int k = 0; k < nZeta; ++k) { + const double phi = 2.0 * std::numbers::pi * k / nZeta; + const int idx = klpRel * nThetaEven * nZeta + l * nZeta + k; + greenp[idx] = std::sin(m0 * theta - n0 * phi); + } + } + } + } + + // Re-seed the LaplaceSolver's system state to the well-conditioned baseline. + // dgetrf destroys matrixShare in place, so this must run before each + // decompose+solve iteration. + void ResetSystem() { + ls->amat_sin_sin = amat_seed; + ls->bvec_sin = Eigen::VectorXd::Zero(mnpd); + } +}; + +// The assemble + factorize + solve chain: this is the actual Laplace solve. +template +void BM_LaplaceSolve(benchmark::State& state) { + static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, + kResolutions[kIdx].ntor); + for (auto _ : state) { + state.PauseTiming(); + fx.ResetSystem(); + state.ResumeTiming(); + + fx.ls->BuildMatrix(); + fx.ls->DecomposeMatrix(); + fx.ls->SolveForPotential(fx.bvec_singular_seed); + benchmark::ClobberMemory(); + } + state.SetLabel(kResolutions[kIdx].label); +} + +// Just the LU factorization (dgetrf), the O(mnpd^3) hotspot. +template +void BM_LaplaceDecompose(benchmark::State& state) { + static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, + kResolutions[kIdx].ntor); + for (auto _ : state) { + state.PauseTiming(); + fx.ResetSystem(); + fx.ls->BuildMatrix(); + state.ResumeTiming(); + + fx.ls->DecomposeMatrix(); + benchmark::ClobberMemory(); + } + state.SetLabel(kResolutions[kIdx].label); +} + +// The largest Green's-function-derivative Fourier transform. +template +void BM_TransformGreensFunctionDerivative(benchmark::State& state) { + static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, + kResolutions[kIdx].ntor); + for (auto _ : state) { + fx.ls->TransformGreensFunctionDerivative(fx.greenp); + benchmark::ClobberMemory(); + } + state.SetLabel(kResolutions[kIdx].label); +} + +BENCHMARK_TEMPLATE(BM_LaplaceSolve, 0)->Name("LaplaceSolve/5x4"); +BENCHMARK_TEMPLATE(BM_LaplaceSolve, 1)->Name("LaplaceSolve/8x6"); +BENCHMARK_TEMPLATE(BM_LaplaceSolve, 2)->Name("LaplaceSolve/12x8"); + +BENCHMARK_TEMPLATE(BM_LaplaceDecompose, 0)->Name("LaplaceDecompose/5x4"); +BENCHMARK_TEMPLATE(BM_LaplaceDecompose, 1)->Name("LaplaceDecompose/8x6"); +BENCHMARK_TEMPLATE(BM_LaplaceDecompose, 2)->Name("LaplaceDecompose/12x8"); + +BENCHMARK_TEMPLATE(BM_TransformGreensFunctionDerivative, 0) + ->Name("TransformGreensFunctionDerivative/5x4"); +BENCHMARK_TEMPLATE(BM_TransformGreensFunctionDerivative, 1) + ->Name("TransformGreensFunctionDerivative/8x6"); +BENCHMARK_TEMPLATE(BM_TransformGreensFunctionDerivative, 2) + ->Name("TransformGreensFunctionDerivative/12x8"); + +} // namespace +} // namespace vmecpp + +BENCHMARK_MAIN(); diff --git a/src/vmecpp/cpp/vmecpp/free_boundary/mgrid_provider/mgrid_provider.cc b/src/vmecpp/cpp/vmecpp/free_boundary/mgrid_provider/mgrid_provider.cc index e6a02b5a2..b1291d81e 100644 --- a/src/vmecpp/cpp/vmecpp/free_boundary/mgrid_provider/mgrid_provider.cc +++ b/src/vmecpp/cpp/vmecpp/free_boundary/mgrid_provider/mgrid_provider.cc @@ -26,6 +26,40 @@ using netcdf_io::NetcdfReadDouble; using netcdf_io::NetcdfReadInt; using netcdf_io::NetcdfReadString; +namespace { + +absl::Status ValidateFieldContributionShape( + const std::vector > >& field_contribution, + const std::string& variable_name, int num_phi, int num_z, int num_r) { + if (field_contribution.size() != static_cast(num_phi)) { + return absl::InvalidArgumentError( + absl::StrFormat("Variable '%s' has %d phi slices, expected %d.", + variable_name, field_contribution.size(), num_phi)); + } + + for (int index_phi = 0; index_phi < num_phi; ++index_phi) { + if (field_contribution[index_phi].size() != static_cast(num_z)) { + return absl::InvalidArgumentError(absl::StrFormat( + "Variable '%s' has %d z slices at phi index %d, expected %d.", + variable_name, field_contribution[index_phi].size(), index_phi, + num_z)); + } + for (int index_z = 0; index_z < num_z; ++index_z) { + if (field_contribution[index_phi][index_z].size() != + static_cast(num_r)) { + return absl::InvalidArgumentError(absl::StrFormat( + "Variable '%s' has %d r points at phi index %d and z index %d, " + "expected %d.", + variable_name, field_contribution[index_phi][index_z].size(), + index_phi, index_z, num_r)); + } + } + } + return absl::OkStatus(); +} + +} // namespace + MGridProvider::MGridProvider() { nfp = -1; @@ -73,30 +107,71 @@ absl::Status MGridProvider::LoadFile(const std::filesystem::path& filename, filename.string())); } - // TODO(jurasic) All of these should be handled with abseil status, but - // terminate on error with absl::CHECK instead. - nfp = NetcdfReadInt(ncid, "nfp"); + // Reads below return absl::Status on failure (e.g. a missing variable), + // which we propagate to the caller instead of aborting the process. + auto with_context = [&filename](const absl::Status& s) { + return absl::Status(s.code(), + absl::StrFormat("While reading mgrid file '%s': %s", + filename.string(), s.message())); + }; + + absl::StatusOr nfp_or = NetcdfReadInt(ncid, "nfp"); + + absl::StatusOr num_r_or = NetcdfReadInt(ncid, "ir"); + absl::StatusOr min_r_or = NetcdfReadDouble(ncid, "rmin"); + absl::StatusOr max_r_or = NetcdfReadDouble(ncid, "rmax"); + + absl::StatusOr num_z_or = NetcdfReadInt(ncid, "jz"); + absl::StatusOr min_z_or = NetcdfReadDouble(ncid, "zmin"); + absl::StatusOr max_z_or = NetcdfReadDouble(ncid, "zmax"); + + absl::StatusOr num_phi_or = NetcdfReadInt(ncid, "kp"); + + absl::StatusOr nextcur_or = NetcdfReadInt(ncid, "nextcur"); + + absl::StatusOr mgrid_mode_or = + NetcdfReadString(ncid, "mgrid_mode"); + + absl::Status read_status; + read_status.Update(nfp_or.status()); + read_status.Update(num_r_or.status()); + read_status.Update(min_r_or.status()); + read_status.Update(max_r_or.status()); + read_status.Update(num_z_or.status()); + read_status.Update(min_z_or.status()); + read_status.Update(max_z_or.status()); + read_status.Update(num_phi_or.status()); + read_status.Update(nextcur_or.status()); + read_status.Update(mgrid_mode_or.status()); + if (!read_status.ok()) { + nc_close(ncid); + return with_context(read_status); + } + + nfp = *nfp_or; - numR = NetcdfReadInt(ncid, "ir"); - minR = NetcdfReadDouble(ncid, "rmin"); - maxR = NetcdfReadDouble(ncid, "rmax"); + numR = *num_r_or; + minR = *min_r_or; + maxR = *max_r_or; deltaR = (maxR - minR) / (numR - 1.0); - numZ = NetcdfReadInt(ncid, "jz"); - minZ = NetcdfReadDouble(ncid, "zmin"); - maxZ = NetcdfReadDouble(ncid, "zmax"); + numZ = *num_z_or; + minZ = *min_z_or; + maxZ = *max_z_or; deltaZ = (maxZ - minZ) / (numZ - 1.0); - numPhi = NetcdfReadInt(ncid, "kp"); + numPhi = *num_phi_or; - nextcur = NetcdfReadInt(ncid, "nextcur"); + nextcur = *nextcur_or; if (coil_currents.size() != nextcur) { + nc_close(ncid); return absl::InvalidArgumentError( absl::StrFormat("Number of currents %d does not match number of mgrid " "coil fields nextcur=%d.", coil_currents.size(), nextcur)); } - mgrid_mode = NetcdfReadString(ncid, "mgrid_mode"); + + mgrid_mode = *mgrid_mode_or; // Resize and make sure that the accumulation arrays are reset to zeros // if they contained previous contents from an earlier call to this routine. @@ -111,16 +186,44 @@ absl::Status MGridProvider::LoadFile(const std::filesystem::path& filename, // from i=1, 2, ..., nextcur std::string br_variable = absl::StrFormat("br_%03d", i + 1); - std::vector > > b_r_contribution = - NetcdfReadArray3D(ncid, br_variable); + absl::StatusOr > > > + b_r_contribution_or = NetcdfReadArray3D(ncid, br_variable); std::string bp_variable = absl::StrFormat("bp_%03d", i + 1); - std::vector > > b_p_contribution = - NetcdfReadArray3D(ncid, bp_variable); + absl::StatusOr > > > + b_p_contribution_or = NetcdfReadArray3D(ncid, bp_variable); std::string bz_variable = absl::StrFormat("bz_%03d", i + 1); + absl::StatusOr > > > + b_z_contribution_or = NetcdfReadArray3D(ncid, bz_variable); + + absl::Status contribution_status; + contribution_status.Update(b_r_contribution_or.status()); + contribution_status.Update(b_p_contribution_or.status()); + contribution_status.Update(b_z_contribution_or.status()); + if (!contribution_status.ok()) { + nc_close(ncid); + return with_context(contribution_status); + } + + std::vector > > b_r_contribution = + std::move(*b_r_contribution_or); + std::vector > > b_p_contribution = + std::move(*b_p_contribution_or); std::vector > > b_z_contribution = - NetcdfReadArray3D(ncid, bz_variable); + std::move(*b_z_contribution_or); + + absl::Status shape_status; + shape_status.Update(ValidateFieldContributionShape( + b_r_contribution, br_variable, numPhi, numZ, numR)); + shape_status.Update(ValidateFieldContributionShape( + b_p_contribution, bp_variable, numPhi, numZ, numR)); + shape_status.Update(ValidateFieldContributionShape( + b_z_contribution, bz_variable, numPhi, numZ, numR)); + if (!shape_status.ok()) { + nc_close(ncid); + return with_context(shape_status); + } for (int index_phi = 0; index_phi < numPhi; ++index_phi) { for (int index_z = 0; index_z < numZ; ++index_z) { diff --git a/src/vmecpp/cpp/vmecpp/test_data/parvmec_cth_like_fixed_bdy_force_trace.csv b/src/vmecpp/cpp/vmecpp/test_data/parvmec_cth_like_fixed_bdy_force_trace.csv new file mode 100644 index 000000000..57c74bc5a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/test_data/parvmec_cth_like_fixed_bdy_force_trace.csv @@ -0,0 +1,125 @@ +# Per-iteration force residuals (fsqr, fsqz, fsql) from ORNL-Fusion/PARVMEC +# (PARVMEC / VMEC2000, version 10.0) for input.cth_like_fixed_bdy at ns=25, +# ftol=1e-6, single radial grid. Pins the native parvmec iteration style to the +# independent Fortran implementation. See test_parvmec_follows_ornl_parvmec_trace. +iteration,fsqr,fsqz,fsql +1,2.4089006554949474e-01,1.8189242874036761e-02,5.3233806831922206e-02 +2,3.6681393963863773e-02,2.9257078637605996e-03,2.0822882493332223e-02 +3,2.7779199334269252e-02,3.1344672791890939e-03,7.8400861928866594e-03 +4,4.5783030023920118e-02,4.9600076740968823e-03,1.1774119147540077e-02 +5,5.1533978999608258e-02,4.2652972219809670e-03,1.7993385241339890e-02 +6,5.7018736996709410e-02,4.6757668824585806e-03,1.7574015932580466e-02 +7,4.3109330291012618e-02,3.7895229757328045e-03,1.4163129388007296e-02 +8,3.5282867818118714e-02,9.3090538363044869e-03,1.4740903073900581e-02 +9,6.7512273795342706e-02,1.0963609530785181e-02,1.2272875086431585e-02 +10,2.7731565647694276e-02,5.4971626708317858e-03,7.0968082879577458e-03 +11,1.8717883628984681e-02,7.9409877631612287e-03,7.7416656727391040e-03 +12,2.5547247380531962e-02,5.1424085690450535e-03,9.7358643588169400e-03 +13,2.8975258027980587e-02,4.8055608935682372e-03,9.0112340635940102e-03 +14,2.4286783100253121e-02,5.4042619245261983e-03,6.0005852113188245e-03 +15,2.4623084138782503e-02,5.0198621981307860e-03,4.0754030267348669e-03 +16,2.5198600190923900e-02,4.5242919425412254e-03,5.0709829354750732e-03 +17,2.9336677006333411e-02,5.5715757575800348e-03,6.5578684491351099e-03 +18,3.4250965694387604e-02,5.8341711391764889e-03,5.0424903948993807e-03 +19,1.4890461945285590e-02,4.0595884422078218e-03,2.6995555783096421e-03 +20,1.0960954530469752e-02,3.6337629330389833e-03,2.4430551668922938e-03 +21,1.4952388678969699e-02,3.7276251824249918e-03,3.1916765493162943e-03 +22,1.9072944625196837e-02,4.4314470737497752e-03,3.3141794810079331e-03 +23,1.7087456203280744e-02,4.4834765275410032e-03,2.4722947963312925e-03 +24,1.0740281367609138e-02,3.0186777469101622e-03,1.9368825172277929e-03 +25,1.2840504816407781e-02,2.6206319864030322e-03,2.3728354525726779e-03 +26,2.0227894874843701e-02,3.5341442533740690e-03,2.8087096115284446e-03 +27,9.1854065263426831e-03,3.1106250041615323e-03,1.6839643143148856e-03 +28,8.1929531223409232e-03,2.4021569329149587e-03,1.4245228455584296e-03 +29,9.9063901357674174e-03,2.1780369906444432e-03,1.8151202969998671e-03 +30,8.4477400213595205e-03,2.5177223881340822e-03,1.6931479868236103e-03 +31,7.3751233951450832e-03,2.4661877740712592e-03,1.1036347771694944e-03 +32,6.5140312161359199e-03,1.6737840375596028e-03,9.0185973458750408e-04 +33,4.8665154345577666e-03,1.7609872012311961e-03,1.1547369581585613e-03 +34,5.9785995061611315e-03,2.1594629331621465e-03,1.2380368015390739e-03 +35,4.7391882750653551e-03,1.4704845093805891e-03,9.3795350370076387e-04 +36,2.7872560872948013e-03,9.4778206777475726e-04,7.4110996319325822e-04 +37,3.1287264530982461e-03,1.1977431712061541e-03,9.1157208890838633e-04 +38,3.8888019508756789e-03,1.2647909226180031e-03,1.0006383836476552e-03 +39,2.9780133015655354e-03,9.2515682752382995e-04,6.9478974931391551e-04 +40,1.7669386983827143e-03,6.4915889677512589e-04,5.1798859153854974e-04 +41,2.1048767614347910e-03,6.2215028317566545e-04,7.4684884344045977e-04 +42,2.8273637192167468e-03,7.2494305230094203e-04,8.0638310097971377e-04 +43,2.0184520142943643e-03,6.8451266247316429e-04,5.0095729470111562e-04 +44,1.2320260438745210e-03,4.5200918435776139e-04,3.4306803363647693e-04 +45,1.5633870223955200e-03,3.4189828310606429e-04,4.5906579613510926e-04 +46,1.7533603612993433e-03,4.4243567846981725e-04,4.6074948824261012e-04 +47,1.2762851718127464e-03,4.6209761253911624e-04,3.2269268416470722e-04 +48,1.0360272162643995e-03,3.1282784108317382e-04,2.8070184347688833e-04 +49,1.2739551513741842e-03,2.4669424019462221e-04,2.7789810658378851e-04 +50,1.2118834611176486e-03,2.8490012492095611e-04,2.1730078826885340e-04 +51,9.2143954616726780e-04,2.4898249862150251e-04,1.8560199983736977e-04 +52,7.7453959063069624e-04,1.7700436246373088e-04,1.9295616902615287e-04 +53,8.2803332123056606e-04,1.8260210751007069e-04,1.8170107182194307e-04 +54,8.8077280714586408e-04,2.0111185390611454e-04,1.4721096556302981e-04 +55,6.3953808033151731e-04,1.4786771753090290e-04,1.0979691075920456e-04 +56,4.6613720004616343e-04,1.0764713748773060e-04,1.1428979781776200e-04 +57,5.3783246418038480e-04,1.5356273011109318e-04,1.3334839660373454e-04 +58,5.8737697605561038e-04,1.6421612478678200e-04,1.0317001510912678e-04 +59,4.3041340767152906e-04,9.2315441238424853e-05,6.6155471587168573e-05 +60,2.7401718837970337e-04,8.4200187951912430e-05,8.4187425665565430e-05 +61,2.9377728556985981e-04,1.2112390177755989e-04,9.6228748378130450e-05 +62,3.2046565443466556e-04,8.6245427680554625e-05,5.7998596467513980e-05 +63,2.6635492112791093e-04,5.7496717496859106e-05,3.7055868372997421e-05 +64,1.8325185763783775e-04,7.6560955876649520e-05,5.7826003418891111e-05 +65,1.7193748555547836e-04,6.8973295525026561e-05,6.1390482949141541e-05 +66,1.9149982902609764e-04,4.6508665609842873e-05,3.8555178754464992e-05 +67,1.8521029634335786e-04,5.0715556091417724e-05,3.0938658432605484e-05 +68,1.4951149711365264e-04,5.6654581065966857e-05,3.6153171650008441e-05 +69,9.5066730814980337e-05,4.1790947417216183e-05,3.4730935250607754e-05 +70,1.1522448533967846e-04,3.2755314977542116e-05,3.2110748970670513e-05 +71,1.3215060028283192e-04,4.2282367000290102e-05,2.7918495552995390e-05 +72,9.5251933020723005e-05,4.0178042359465423e-05,2.3133253778786973e-05 +73,7.3717973702780459e-05,2.7737771916274311e-05,2.6037061070436951e-05 +74,7.6840052138871972e-05,3.2061872281407278e-05,2.6424430581407548e-05 +75,8.5632192316582225e-05,3.2596710010716295e-05,1.8626669170519188e-05 +76,6.6980285358956732e-05,2.2420356055828839e-05,1.7171008868068926e-05 +77,5.1597980251584379e-05,2.4106560232429674e-05,2.2873255937497923e-05 +78,4.8460133817226004e-05,2.4896744131165897e-05,2.0195807226981035e-05 +79,5.1534105677286906e-05,1.9479617993564232e-05,1.2693547255740077e-05 +80,4.7965676036113929e-05,1.8275208850858940e-05,1.3344494556237672e-05 +81,3.5000987072786026e-05,1.6746671093858607e-05,1.6774582185270918e-05 +82,3.2020293817422061e-05,1.4045305643726987e-05,1.3752620552954986e-05 +83,3.4571481241582132e-05,1.3222284564468306e-05,8.9849791597011068e-06 +84,3.6445289666553020e-05,1.3490211875571353e-05,7.6715832688247774e-06 +85,2.6836598884880545e-05,1.2228820709752092e-05,7.1047069567287085e-06 +86,2.1103703548172135e-05,9.2461388576749575e-06,6.7335117314720831e-06 +87,2.3045574529612850e-05,8.2783972746246295e-06,6.6274790604370499e-06 +88,2.0370542800839981e-05,8.7002943805473195e-06,5.2252480315205973e-06 +89,1.7977669721492016e-05,7.8672988854320640e-06,3.7936399705513430e-06 +90,1.3430524155009589e-05,6.9087201322425244e-06,3.2787527308475006e-06 +91,1.1181120201723126e-05,5.4025043317155100e-06,3.0809032723935404e-06 +92,1.3559887209373415e-05,4.2014661938091536e-06,3.4608729407792537e-06 +93,1.2746061880701487e-05,5.1789278661230076e-06,3.5352969772966303e-06 +94,9.4217905731992719e-06,4.9835523918641098e-06,2.2751170648794482e-06 +95,7.7366127289888493e-06,3.0759568914052026e-06,1.5196010009991481e-06 +96,8.3603327348265684e-06,2.9096250885540066e-06,2.1524084232659252e-06 +97,8.6955511799238599e-06,3.2835936714182820e-06,2.1679155065792652e-06 +98,6.9502126484870322e-06,2.5593521364206751e-06,1.3457562878104268e-06 +99,5.9463989880255614e-06,2.2659281857306051e-06,1.2728569415488959e-06 +100,5.5438900783405735e-06,2.2731303145953447e-06,1.5086087107421557e-06 +101,5.0693593578870755e-06,1.7912387403060682e-06,1.0948523289948467e-06 +102,4.8241421692710616e-06,1.3960215997118064e-06,8.2136369354832465e-07 +103,4.5679347253786716e-06,1.3256231291206880e-06,1.0512473810209935e-06 +104,4.1855115377915792e-06,1.2833385807810773e-06,1.0037105339563841e-06 +105,3.1489417069699166e-06,1.1025622870406821e-06,6.5276467896386802e-07 +106,3.2098909735179557e-06,9.3601268365983292e-07,5.3290041464301652e-07 +107,3.2205881914185780e-06,8.1964263628709349e-07,5.5528555685447722e-07 +108,2.6896939040987748e-06,8.9278193965618380e-07,4.9394894423187446e-07 +109,2.3377317959143821e-06,8.5659235693917731e-07,4.3174297964198452e-07 +110,1.9391127073720760e-06,6.3856890892719942e-07,3.9759929688946925e-07 +111,1.9175605674709595e-06,6.4151677568300660e-07,3.6914280286888421e-07 +112,1.5977791741740498e-06,6.3857749544403374e-07,3.5828333026535638e-07 +113,1.4921799483519888e-06,5.1292691554744418e-07,3.1973232345980027e-07 +114,1.4023514921744768e-06,4.8103063561005090e-07,2.6861565212357621e-07 +115,1.3156479553749446e-06,4.8034511015759358e-07,2.7239727527235290e-07 +116,1.4063099029231428e-06,4.6454601027385580e-07,2.6220737517779700e-07 +117,1.1147425009542418e-06,4.2478177802809816e-07,1.9162536410246975e-07 +118,1.0646051378747073e-06,3.6844629041079497e-07,1.8411084320916765e-07 +119,1.0231548922946661e-06,3.3310841632637473e-07,2.5467984006468637e-07 +120,9.3467676899647807e-07,3.1138879132238200e-07,2.6141971225702011e-07 diff --git a/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.cc b/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.cc index a48c259af..ca76432d6 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.cc @@ -198,6 +198,42 @@ void FourierCoeffs::m1Constraint(double scalingFactor, } // j } +void FourierCoeffs::maskGeometryAbove(int mpolGeom, int ntorGeom) { + // Same surface range as decomposeInto (owned slab plus boundary). + int jMaxIncludingBoundary = nsMax_; + if (r_.nsMaxF1 == ns) { + jMaxIncludingBoundary = ns; + } + + for (int jF = nsMin_; jF < jMaxIncludingBoundary; ++jF) { + for (int m = 0; m < s_.mpol; ++m) { + for (int n = 0; n < s_.ntor + 1; ++n) { + if (m < mpolGeom && n <= ntorGeom) { + continue; + } + + int idx_fc = ((jF - nsMin_) * s_.mpol + m) * (s_.ntor + 1) + n; + + rcc[idx_fc] = 0.0; + zsc[idx_fc] = 0.0; + if (s_.lthreed) { + rss[idx_fc] = 0.0; + zcs[idx_fc] = 0.0; + } + if (s_.lasym) { + rsc[idx_fc] = 0.0; + zcc[idx_fc] = 0.0; + if (s_.lthreed) { + rcs[idx_fc] = 0.0; + zss[idx_fc] = 0.0; + } + } + // lambda left untouched + } // n + } // m + } // j +} + double FourierCoeffs::rzNorm(bool include_offset, int nsMinHere, int nsMaxHere) const { // accumulator for local thread diff --git a/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.h b/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.h index 9196b21d8..cec8b1948 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.h +++ b/src/vmecpp/cpp/vmecpp/vmec/fourier_coefficients/fourier_coefficients.h @@ -31,6 +31,11 @@ class FourierCoeffs { void m1Constraint(double scalingFactor, std::optional jMax = std::nullopt); + // Zero R and Z coefficients with m >= mpolGeom or n > ntorGeom; lambda is + // left untouched. On the force, this holds geometry at mpolGeom/ntorGeom + // while lambda keeps the full mpol/ntor resolution. + void maskGeometryAbove(int mpolGeom, int ntorGeom); + // Get the sum of squared coefficients for R and Z. // If includeOffset is false, the (0,0)-coefficients for cos(mu)*cos(nv) are // left out. The range of flux surface to count in is specified as [nsMinHere, diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/BUILD.bazel b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/BUILD.bazel index e8df6160b..7f5c618d6 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/BUILD.bazel +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/BUILD.bazel @@ -115,3 +115,42 @@ cc_library( "@abseil-cpp//absl/status", ], ) + +cc_binary( + name = "fft_toroidal_bench", + srcs = ["fft_toroidal_bench.cc"], + deps = [ + ":ideal_mhd_model", + "//vmecpp/common/flow_control:flow_control", + "//vmecpp/common/fourier_basis_fast_poloidal", + "//vmecpp/common/sizes:sizes", + "//vmecpp/common/util:util", + "//vmecpp/common/vmec_indata:vmec_indata", + "//vmecpp/vmec/fourier_forces:fourier_forces", + "//vmecpp/vmec/fourier_geometry:fourier_geometry", + "//vmecpp/vmec/handover_storage:handover_storage", + "//vmecpp/vmec/radial_partitioning:radial_partitioning", + "//vmecpp/vmec/radial_profiles:radial_profiles", + "//vmecpp/vmec/thread_local_storage:thread_local_storage", + "//vmecpp/vmec/vmec_constants:vmec_constants", + "@eigen", + "@google_benchmark//:benchmark_main", + ], +) + +cc_binary( + name = "dealias_constraint_force_bench", + srcs = ["dealias_constraint_force_bench.cc"], + deps = [ + ":ideal_mhd_model", + "//vmecpp/common/flow_control:flow_control", + "//vmecpp/common/fourier_basis_fast_poloidal", + "//vmecpp/common/sizes:sizes", + "//vmecpp/common/vmec_indata:vmec_indata", + "//vmecpp/vmec/handover_storage:handover_storage", + "//vmecpp/vmec/radial_partitioning:radial_partitioning", + "//vmecpp/vmec/radial_profiles:radial_profiles", + "@eigen", + "@google_benchmark//:benchmark_main", + ], +) diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/bco_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/bco_kernel.h new file mode 100644 index 000000000..4303c41d5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/bco_kernel.h @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_BCO_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_BCO_KERNEL_H_ + +namespace vmecpp { + +// Lower the index on the contravariant field with the metric tensor: +// bsubu = guu B^u + guv B^v +// bsubv = guv B^u + gvv B^v +// In 2D guv is absent and drops out. Shared, allocation-free over flat buffers +// (n = number of half-grid points), between IdealMhdModel::computeBCo and the +// Enzyme autodiff path. +inline void ComputeBCo(const double* guu, const double* guv, const double* gvv, + const double* bsupu, const double* bsupv, bool lthreed, + int n, double* bsubu, double* bsubv) { + if (lthreed) { + for (int i = 0; i < n; ++i) { + bsubu[i] = guu[i] * bsupu[i] + guv[i] * bsupv[i]; + bsubv[i] = guv[i] * bsupu[i] + gvv[i] * bsupv[i]; + } + } else { + for (int i = 0; i < n; ++i) { + bsubu[i] = guu[i] * bsupu[i]; + bsubv[i] = gvv[i] * bsupv[i]; + } + } +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_BCO_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/bcontra_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/bcontra_kernel.h new file mode 100644 index 000000000..026c30a45 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/bcontra_kernel.h @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_BCONTRA_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_BCONTRA_KERNEL_H_ + +namespace vmecpp { + +// Half-grid contravariant magnetic field from the (already lambda-normalized) +// angular lambda derivatives and the Jacobian gsqrt: +// bsupv = 0.5 [ (lu_in + lu_out) + sqrtSH (luo_in + luo_out) ] / gsqrt +// bsupu = 0.5 [ (lv_in + lv_out) + sqrtSH (lvo_in + lvo_out) ] / gsqrt (3D) +// In 2D bsupu starts at zero here and the chip'/gsqrt term is added by the +// caller. Shared, allocation-free over flat buffers, between +// IdealMhdModel::computeBContra and the Enzyme autodiff path. Same indexing +// conventions as jacobian_kernel.h. lue/luo/lve/lvo are the normalized lambda +// arrays (lu already includes the + phi' term applied by the caller). +inline void ComputeBsupContra(const double* lue, const double* luo, + const double* lve, const double* lvo, + const double* gsqrt, const double* sqrtSH, + bool lthreed, int nZnT, int nsMinF1, int nsMinH, + int nsMaxH, double* bsupu, double* bsupv) { + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + const double sH = sqrtSH[jH - nsMinH]; + for (int kl = 0; kl < nZnT; ++kl) { + const int i_in = (jH - nsMinF1) * nZnT + kl; + const int i_out = (jH + 1 - nsMinF1) * nZnT + kl; + const int ih = (jH - nsMinH) * nZnT + kl; + + if (lthreed) { + bsupu[ih] = 0.5 * + ((lve[i_in] + lve[i_out]) + sH * (lvo[i_in] + lvo[i_out])) / + gsqrt[ih]; + } else { + bsupu[ih] = 0.0; + } + bsupv[ih] = 0.5 * + ((lue[i_in] + lue[i_out]) + sH * (luo[i_in] + luo[i_out])) / + gsqrt[ih]; + } + } +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_BCONTRA_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/constraint_force_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/constraint_force_kernel.h new file mode 100644 index 000000000..b5078a6f1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/constraint_force_kernel.h @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_CONSTRAINT_FORCE_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_CONSTRAINT_FORCE_KERNEL_H_ + +#include + +namespace vmecpp { + +// The two local (non-transform) pieces of VMEC's spectral-condensation +// constraint force. The Fourier-space bandpass between them is the separate +// shared free function deAliasConstraintForce. All full-grid buffers are +// indexed (jF-nsMinF)*nZnT except sqrtSF, which is indexed (jF-nsMinF1). +// Allocation-free, shared between the solver and the Enzyme autodiff path. + +// Effective constraint force gConEff = (rCon - rCon0) ru + (zCon - zCon0) zu. +// No constraint on the axis (it has no poloidal angle), so the axis surface is +// skipped, matching deAliasConstraintForce. +inline void ComputeEffectiveConstraintForce( + const double* rCon, const double* rCon0, const double* zCon, + const double* zCon0, const double* ruFull, const double* zuFull, int nZnT, + int nsMinF, int nsMaxFIncludingLcfs, double* gConEff) { + int jMin = 0; + if (nsMinF == 0) { + jMin = 1; + } + for (int jF = std::max(jMin, nsMinF); jF < nsMaxFIncludingLcfs; ++jF) { + for (int kl = 0; kl < nZnT; ++kl) { + int idx_kl = (jF - nsMinF) * nZnT + kl; + gConEff[idx_kl] = (rCon[idx_kl] - rCon0[idx_kl]) * ruFull[idx_kl] + + (zCon[idx_kl] - zCon0[idx_kl]) * zuFull[idx_kl]; + } // kl + } // jF +} + +// Add the bandpass-filtered constraint force gCon back into the MHD R/Z forces +// (brmn, bzmn) and write the constraint-force outputs (frcon, fzcon). +inline void AddConstraintForces( + const double* rCon, const double* rCon0, const double* zCon, + const double* zCon0, const double* ruFull, const double* zuFull, + const double* gCon, const double* sqrtSF, int nZnT, int nsMinF, int nsMinF1, + int nsMaxF, double* brmn_e, double* brmn_o, double* bzmn_e, double* bzmn_o, + double* frcon_e, double* frcon_o, double* fzcon_e, double* fzcon_o) { + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + for (int kl = 0; kl < nZnT; ++kl) { + int idx_kl = (jF - nsMinF) * nZnT + kl; + + double brcon = (rCon[idx_kl] - rCon0[idx_kl]) * gCon[idx_kl]; + double bzcon = (zCon[idx_kl] - zCon0[idx_kl]) * gCon[idx_kl]; + + brmn_e[idx_kl] += brcon; + bzmn_e[idx_kl] += bzcon; + brmn_o[idx_kl] += brcon * sqrtSF[jF - nsMinF1]; + bzmn_o[idx_kl] += bzcon * sqrtSF[jF - nsMinF1]; + + frcon_e[idx_kl] = ruFull[idx_kl] * gCon[idx_kl]; + fzcon_e[idx_kl] = zuFull[idx_kl] * gCon[idx_kl]; + frcon_o[idx_kl] = frcon_e[idx_kl] * sqrtSF[jF - nsMinF1]; + fzcon_o[idx_kl] = fzcon_e[idx_kl] * sqrtSF[jF - nsMinF1]; + } // kl + } // jF +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_CONSTRAINT_FORCE_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dealias_constraint_force_bench.cc b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dealias_constraint_force_bench.cc new file mode 100644 index 000000000..b8c553bdd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dealias_constraint_force_bench.cc @@ -0,0 +1,132 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT + +// Microbenchmark for deAliasConstraintForce, the spectral-condensation +// constraint-force de-aliasing step (a forward+inverse poloidal/toroidal +// transform pair) run every iteration inside IdealMhdModel::update(). +// +// Sweeps the same four representative (nfp, mpol, ntor) resolutions used by +// fft_toroidal_bench.cc so the constraint-force cost can be compared directly +// against the geometry/force transforms at each resolution. + +#include +#include +#include +#include + +#include "Eigen/Dense" +#include "benchmark/benchmark.h" +#include "vmecpp/common/flow_control/flow_control.h" +#include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" +#include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/handover_storage/handover_storage.h" +#include "vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h" +#include "vmecpp/vmec/radial_partitioning/radial_partitioning.h" +#include "vmecpp/vmec/radial_profiles/radial_profiles.h" + +namespace vmecpp { +namespace { + +// ns = 51 is representative of a medium-resolution VMEC run (matches the +// convention used in fft_toroidal_bench.cc). +constexpr int kNs = 51; + +// (nfp, mpol, ntor) resolutions, matching fft_toroidal_bench.cc for direct +// comparability. +struct ResParams { + int nfp; + int mpol; + int ntor; + const char* label; +}; + +constexpr ResParams kResolutions[] = { + {1, 4, 4, "4x4"}, + {1, 7, 1, "7x1"}, + {5, 12, 12, "12x12"}, + {5, 16, 18, "16x18"}, +}; + +// ---------------------------------------------------------------------------- +// Shared fixture data, built once per (nfp, mpol, ntor) combination. +// +// Mirrors the buffer sizes established in IdealMhdModel::allocate(): +// faccon: s.mpol, with faccon[m-1] = -0.25 / xmpq[m]^2 for m > 1 +// tcon: nsMaxFIncludingLcfs - nsMinF +// gConEff: nZnT * (nsMaxFIncludingLcfs - nsMinF) (nrztIncludingBoundary) +// gsc/gcs: ntor + 1 +// gCon: nrztIncludingBoundary +// ---------------------------------------------------------------------------- +struct BenchFixture { + Sizes s; + RadialPartitioning rp; + FourierBasisFastPoloidal fb; + + Eigen::VectorXd faccon; + Eigen::VectorXd tcon; + Eigen::VectorXd gConEff; + Eigen::VectorXd gsc; + Eigen::VectorXd gcs; + Eigen::VectorXd gCon; + + explicit BenchFixture(int nfp, int mpol, int ntor) + : s(/*lasym=*/false, nfp, mpol, ntor, /*ntheta=*/0, /*nzeta=*/0), fb(&s) { + rp.adjustRadialPartitioning(/*num_threads=*/1, /*thread_id=*/0, kNs, + /*lfreeb=*/false, /*printout=*/false); + + const int nrztIncludingBoundary = + s.nZnT * (rp.nsMaxFIncludingLcfs - rp.nsMinF); + + // faccon[m] = -0.25 / (m*(m-1))^2 for m > 1 (signOfJacobian = -1 gives the + // same magnitude sign convention as the solver; the exact sign does not + // affect the timing). + faccon.setZero(s.mpol); + for (int m = 2; m < s.mpol; ++m) { + const double xmpq = m * (m - 1); + faccon[m - 1] = -0.25 * (-1) / (xmpq * xmpq); + } + + std::mt19937 rng(42); + std::uniform_real_distribution dist(-1.0, 1.0); + auto rfill = [&](Eigen::VectorXd& v, int n) { + v.resize(n); + for (int i = 0; i < n; ++i) v[i] = dist(rng); + }; + + rfill(tcon, rp.nsMaxFIncludingLcfs - rp.nsMinF); + rfill(gConEff, nrztIncludingBoundary); + + gsc.setZero(s.ntor + 1); + gcs.setZero(s.ntor + 1); + gCon.setZero(nrztIncludingBoundary); + } +}; + +template +void BM_DeAliasConstraintForce(benchmark::State& state) { + static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, + kResolutions[kIdx].ntor); + for (auto _ : state) { + deAliasConstraintForce(fx.rp, fx.fb, fx.s, fx.faccon, fx.tcon, fx.gConEff, + fx.gsc, fx.gcs, fx.gCon); + benchmark::ClobberMemory(); + } + state.SetLabel(kResolutions[kIdx].label); +} + +BENCHMARK_TEMPLATE(BM_DeAliasConstraintForce, 0) + ->Name("DeAliasConstraintForce/4x4"); +BENCHMARK_TEMPLATE(BM_DeAliasConstraintForce, 1) + ->Name("DeAliasConstraintForce/7x1"); +BENCHMARK_TEMPLATE(BM_DeAliasConstraintForce, 2) + ->Name("DeAliasConstraintForce/12x12"); +BENCHMARK_TEMPLATE(BM_DeAliasConstraintForce, 3) + ->Name("DeAliasConstraintForce/16x18"); + +} // namespace +} // namespace vmecpp + +BENCHMARK_MAIN(); diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dft_toroidal.cc b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dft_toroidal.cc index be9acf83c..d2e92218e 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dft_toroidal.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/dft_toroidal.cc @@ -51,95 +51,75 @@ void ForcesToFourier3DSymmFastPoloidal( const auto& fzcon = m_even ? d.fzcon_e : d.fzcon_o; for (int k = 0; k < s.nZeta; ++k) { + double rmkcc = 0.0; + double rmkcc_n = 0.0; + double rmkss = 0.0; + double rmkss_n = 0.0; + double zmksc = 0.0; + double zmksc_n = 0.0; + double zmkcs = 0.0; + double zmkcs_n = 0.0; + double lmksc = 0.0; + double lmksc_n = 0.0; + double lmkcs = 0.0; + double lmkcs_n = 0.0; + const int idx_kl_base = ((jF - rp.nsMinF) * s.nZeta + k) * s.nThetaEff; const int idx_ml_base = m * s.nThetaReduced; - // Vectorized poloidal loop using Eigen operations - auto cosmui_seg = fb.cosmui.segment(idx_ml_base, s.nThetaReduced); - auto sinmui_seg = fb.sinmui.segment(idx_ml_base, s.nThetaReduced); - auto cosmumi_seg = fb.cosmumi.segment(idx_ml_base, s.nThetaReduced); - auto sinmumi_seg = fb.sinmumi.segment(idx_ml_base, s.nThetaReduced); - - auto blmn_seg = Eigen::Map( - blmn.data() + idx_kl_base, s.nThetaReduced); - auto clmn_seg = Eigen::Map( - clmn.data() + idx_kl_base, s.nThetaReduced); - auto crmn_seg = Eigen::Map( - crmn.data() + idx_kl_base, s.nThetaReduced); - auto czmn_seg = Eigen::Map( - czmn.data() + idx_kl_base, s.nThetaReduced); - auto armn_seg = Eigen::Map( - armn.data() + idx_kl_base, s.nThetaReduced); - auto azmn_seg = Eigen::Map( - azmn.data() + idx_kl_base, s.nThetaReduced); - auto brmn_seg = Eigen::Map( - brmn.data() + idx_kl_base, s.nThetaReduced); - auto bzmn_seg = Eigen::Map( - bzmn.data() + idx_kl_base, s.nThetaReduced); - auto frcon_seg = Eigen::Map( - frcon.data() + idx_kl_base, s.nThetaReduced); - auto fzcon_seg = Eigen::Map( - fzcon.data() + idx_kl_base, s.nThetaReduced); - - double lmksc = blmn_seg.dot(cosmumi_seg); - double lmkcs = blmn_seg.dot(sinmumi_seg); - double lmkcs_n = -clmn_seg.dot(cosmui_seg); - double lmksc_n = -clmn_seg.dot(sinmui_seg); - - double rmkcc_n = -crmn_seg.dot(cosmui_seg); - double zmkcs_n = -czmn_seg.dot(cosmui_seg); - - double rmkss_n = -crmn_seg.dot(sinmui_seg); - double zmksc_n = -czmn_seg.dot(sinmui_seg); - - // Assemble effective R and Z forces from MHD and spectral condensation - // contributions. Materialize to avoid re-evaluation in each dot - // product. - // Per-thread scratch reused across iterations instead of a heap - // temporary in this innermost loop; still materialized once and then - // used in the two dot products below. - thread_local Eigen::VectorXd tempR_seg; - thread_local Eigen::VectorXd tempZ_seg; - tempR_seg = armn_seg + xmpq[m] * frcon_seg; - tempZ_seg = azmn_seg + xmpq[m] * fzcon_seg; - - double rmkcc = tempR_seg.dot(cosmui_seg) + brmn_seg.dot(sinmumi_seg); - double rmkss = tempR_seg.dot(sinmui_seg) + brmn_seg.dot(cosmumi_seg); - double zmksc = tempZ_seg.dot(sinmui_seg) + bzmn_seg.dot(cosmumi_seg); - double zmkcs = tempZ_seg.dot(cosmui_seg) + bzmn_seg.dot(sinmumi_seg); - - // Vectorized toroidal scatter: segment ops replace scalar n-loop - const int ntorp1 = s.ntor + 1; - const int idx_mn_base = ((jF - rp.nsMinF) * s.mpol + m) * ntorp1; - const int idx_kn_base = k * (s.nnyq2 + 1); - - auto cosnv_seg = fb.cosnv.segment(idx_kn_base, ntorp1); - auto sinnv_seg = fb.sinnv.segment(idx_kn_base, ntorp1); - auto cosnvn_seg = fb.cosnvn.segment(idx_kn_base, ntorp1); - auto sinnvn_seg = fb.sinnvn.segment(idx_kn_base, ntorp1); - - Eigen::Map frcc_seg( - m_physical_forces.frcc.data() + idx_mn_base, ntorp1); - Eigen::Map frss_seg( - m_physical_forces.frss.data() + idx_mn_base, ntorp1); - Eigen::Map fzsc_seg( - m_physical_forces.fzsc.data() + idx_mn_base, ntorp1); - Eigen::Map fzcs_seg( - m_physical_forces.fzcs.data() + idx_mn_base, ntorp1); - - frcc_seg += rmkcc * cosnv_seg + rmkcc_n * sinnvn_seg; - frss_seg += rmkss * sinnv_seg + rmkss_n * cosnvn_seg; - fzsc_seg += zmksc * cosnv_seg + zmksc_n * sinnvn_seg; - fzcs_seg += zmkcs * sinnv_seg + zmkcs_n * cosnvn_seg; - - if (jMinL <= jF) { - Eigen::Map flsc_seg( - m_physical_forces.flsc.data() + idx_mn_base, ntorp1); - Eigen::Map flcs_seg( - m_physical_forces.flcs.data() + idx_mn_base, ntorp1); - flsc_seg += lmksc * cosnv_seg + lmksc_n * sinnvn_seg; - flcs_seg += lmkcs * sinnv_seg + lmkcs_n * cosnvn_seg; - } + // NOTE: nThetaReduced is usually pretty small, 9 for cma.json + // and 16 for w7x_ref_167_12_12.json, so in our benchmark forcing + // the compiler to auto-vectorize this loop was a pessimization. + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_kl = idx_kl_base + l; + const int idx_ml = idx_ml_base + l; + + const double cosmui = fb.cosmui[idx_ml]; + const double sinmui = fb.sinmui[idx_ml]; + const double cosmumi = fb.cosmumi[idx_ml]; + const double sinmumi = fb.sinmumi[idx_ml]; + + lmksc += blmn[idx_kl] * cosmumi; // --> flsc (no A) + lmkcs += blmn[idx_kl] * sinmumi; // --> flcs + lmkcs_n -= clmn[idx_kl] * cosmui; // --> flcs + lmksc_n -= clmn[idx_kl] * sinmui; // --> flsc + + rmkcc_n -= crmn[idx_kl] * cosmui; // --> frcc + zmkcs_n -= czmn[idx_kl] * cosmui; // --> fzcs + + rmkss_n -= crmn[idx_kl] * sinmui; // --> frss + zmksc_n -= czmn[idx_kl] * sinmui; // --> fzsc + + // assemble effective R and Z forces from MHD and spectral + // condensation contributions + const double tempR = armn[idx_kl] + xmpq[m] * frcon[idx_kl]; + const double tempZ = azmn[idx_kl] + xmpq[m] * fzcon[idx_kl]; + + rmkcc += tempR * cosmui + brmn[idx_kl] * sinmumi; // --> frcc + rmkss += tempR * sinmui + brmn[idx_kl] * cosmumi; // --> frss + zmksc += tempZ * sinmui + bzmn[idx_kl] * cosmumi; // --> fzsc + zmkcs += tempZ * cosmui + bzmn[idx_kl] * sinmumi; // --> fzcs + } // l + + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = ((jF - rp.nsMinF) * s.mpol + m) * (s.ntor + 1) + n; + const int idx_kn = k * (s.nnyq2 + 1) + n; + + const double cosnv = fb.cosnv[idx_kn]; + const double sinnv = fb.sinnv[idx_kn]; + const double cosnvn = fb.cosnvn[idx_kn]; + const double sinnvn = fb.sinnvn[idx_kn]; + + m_physical_forces.frcc[idx_mn] += rmkcc * cosnv + rmkcc_n * sinnvn; + m_physical_forces.frss[idx_mn] += rmkss * sinnv + rmkss_n * cosnvn; + m_physical_forces.fzsc[idx_mn] += zmksc * cosnv + zmksc_n * sinnvn; + m_physical_forces.fzcs[idx_mn] += zmkcs * sinnv + zmkcs_n * cosnvn; + + if (jMinL <= jF) { + m_physical_forces.flsc[idx_mn] += lmksc * cosnv + lmksc_n * sinnvn; + m_physical_forces.flcs[idx_mn] += lmkcs * sinnv + lmkcs_n * cosnvn; + } + } // n } // k } // m } // jF @@ -154,42 +134,41 @@ void ForcesToFourier3DSymmFastPoloidal( const auto& clmn = m_even ? d.clmn_e : d.clmn_o; for (int k = 0; k < s.nZeta; ++k) { + double lmksc = 0.0; + double lmksc_n = 0.0; + double lmkcs = 0.0; + double lmkcs_n = 0.0; + const int idx_kl_base = ((jF - rp.nsMinF) * s.nZeta + k) * s.nThetaEff; const int idx_ml_base = m * s.nThetaReduced; - // Vectorized poloidal loop using Eigen operations - auto cosmui_seg = fb.cosmui.segment(idx_ml_base, s.nThetaReduced); - auto sinmui_seg = fb.sinmui.segment(idx_ml_base, s.nThetaReduced); - auto cosmumi_seg = fb.cosmumi.segment(idx_ml_base, s.nThetaReduced); - auto sinmumi_seg = fb.sinmumi.segment(idx_ml_base, s.nThetaReduced); - - auto blmn_seg = Eigen::Map( - blmn.data() + idx_kl_base, s.nThetaReduced); - auto clmn_seg = Eigen::Map( - clmn.data() + idx_kl_base, s.nThetaReduced); - - double lmksc = blmn_seg.dot(cosmumi_seg); - double lmkcs = blmn_seg.dot(sinmumi_seg); - double lmkcs_n = -clmn_seg.dot(cosmui_seg); - double lmksc_n = -clmn_seg.dot(sinmui_seg); - - // Vectorized toroidal scatter for lambda-only section - const int ntorp1 = s.ntor + 1; - const int idx_mn_base = ((jF - rp.nsMinF) * s.mpol + m) * ntorp1; - const int idx_kn_base = k * (s.nnyq2 + 1); - - auto cosnv_seg = fb.cosnv.segment(idx_kn_base, ntorp1); - auto sinnv_seg = fb.sinnv.segment(idx_kn_base, ntorp1); - auto cosnvn_seg = fb.cosnvn.segment(idx_kn_base, ntorp1); - auto sinnvn_seg = fb.sinnvn.segment(idx_kn_base, ntorp1); - - Eigen::Map flsc_seg( - m_physical_forces.flsc.data() + idx_mn_base, ntorp1); - Eigen::Map flcs_seg( - m_physical_forces.flcs.data() + idx_mn_base, ntorp1); - - flsc_seg += lmksc * cosnv_seg + lmksc_n * sinnvn_seg; - flcs_seg += lmkcs * sinnv_seg + lmkcs_n * cosnvn_seg; + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_kl = idx_kl_base + l; + const int idx_ml = idx_ml_base + l; + + const double cosmui = fb.cosmui[idx_ml]; + const double sinmui = fb.sinmui[idx_ml]; + const double cosmumi = fb.cosmumi[idx_ml]; + const double sinmumi = fb.sinmumi[idx_ml]; + + lmksc += blmn[idx_kl] * cosmumi; // --> flsc (no A) + lmkcs += blmn[idx_kl] * sinmumi; // --> flcs + lmkcs_n -= clmn[idx_kl] * cosmui; // --> flcs + lmksc_n -= clmn[idx_kl] * sinmui; // --> flsc + } // l + + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = ((jF - rp.nsMinF) * s.mpol + m) * (s.ntor + 1) + n; + const int idx_kn = k * (s.nnyq2 + 1) + n; + + const double cosnv = fb.cosnv[idx_kn]; + const double sinnv = fb.sinnv[idx_kn]; + const double cosnvn = fb.cosnvn[idx_kn]; + const double sinnvn = fb.sinnvn[idx_kn]; + + m_physical_forces.flsc[idx_mn] += lmksc * cosnv + lmksc_n * sinnvn; + m_physical_forces.flcs[idx_mn] += lmkcs * sinnv + lmkcs_n * cosnvn; + } // n } // k } // m } // jF @@ -257,97 +236,100 @@ void FourierToReal3DSymmFastPoloidal(const FourierGeometry& physical_x, } for (int k = 0; k < s.nZeta; ++k) { - // INVERSE TRANSFORM IN N-ZETA, FOR FIXED M - // Vectorized toroidal accumulation loop - const int idx_kn_base = k * (s.nnyq2 + 1); - const int idx_mn_base = ((jF - nsMinF1) * s.mpol + m) * (s.ntor + 1); - - auto cosnv_seg = fb.cosnv.segment(idx_kn_base, s.ntor + 1); - auto sinnv_seg = fb.sinnv.segment(idx_kn_base, s.ntor + 1); - auto sinnvn_seg = fb.sinnvn.segment(idx_kn_base, s.ntor + 1); - auto cosnvn_seg = fb.cosnvn.segment(idx_kn_base, s.ntor + 1); - - auto rmncc_seg = Eigen::Map( - physical_x.rmncc.data() + idx_mn_base, s.ntor + 1); - auto rmnss_seg = Eigen::Map( - physical_x.rmnss.data() + idx_mn_base, s.ntor + 1); - auto zmnsc_seg = Eigen::Map( - physical_x.zmnsc.data() + idx_mn_base, s.ntor + 1); - auto zmncs_seg = Eigen::Map( - physical_x.zmncs.data() + idx_mn_base, s.ntor + 1); - auto lmnsc_seg = Eigen::Map( - physical_x.lmnsc.data() + idx_mn_base, s.ntor + 1); - auto lmncs_seg = Eigen::Map( - physical_x.lmncs.data() + idx_mn_base, s.ntor + 1); - - double rmkcc = rmncc_seg.dot(cosnv_seg); - double rmkcc_n = rmncc_seg.dot(sinnvn_seg); - double rmkss = rmnss_seg.dot(sinnv_seg); - double rmkss_n = rmnss_seg.dot(cosnvn_seg); - double zmksc = zmnsc_seg.dot(cosnv_seg); - double zmksc_n = zmnsc_seg.dot(sinnvn_seg); - double zmkcs = zmncs_seg.dot(sinnv_seg); - double zmkcs_n = zmncs_seg.dot(cosnvn_seg); - double lmksc = lmnsc_seg.dot(cosnv_seg); - double lmksc_n = lmnsc_seg.dot(sinnvn_seg); - double lmkcs = lmncs_seg.dot(sinnv_seg); - double lmkcs_n = lmncs_seg.dot(cosnvn_seg); + double rmkcc = 0.0; + double rmkcc_n = 0.0; + double rmkss = 0.0; + double rmkss_n = 0.0; + double zmksc = 0.0; + double zmksc_n = 0.0; + double zmkcs = 0.0; + double zmkcs_n = 0.0; + double lmksc = 0.0; + double lmksc_n = 0.0; + double lmkcs = 0.0; + double lmkcs_n = 0.0; + + for (int n = 0; n < s.ntor + 1; ++n) { + // INVERSE TRANSFORM IN N-ZETA, FOR FIXED M + + const int idx_kn = k * (s.nnyq2 + 1) + n; + + double cosnv = fb.cosnv[idx_kn]; + double sinnv = fb.sinnv[idx_kn]; + double sinnvn = fb.sinnvn[idx_kn]; + double cosnvn = fb.cosnvn[idx_kn]; + + int idx_mn = ((jF - nsMinF1) * s.mpol + m) * (s.ntor + 1) + n; + + rmkcc += physical_x.rmncc[idx_mn] * cosnv; + rmkcc_n += physical_x.rmncc[idx_mn] * sinnvn; + rmkss += physical_x.rmnss[idx_mn] * sinnv; + rmkss_n += physical_x.rmnss[idx_mn] * cosnvn; + zmksc += physical_x.zmnsc[idx_mn] * cosnv; + zmksc_n += physical_x.zmnsc[idx_mn] * sinnvn; + zmkcs += physical_x.zmncs[idx_mn] * sinnv; + zmkcs_n += physical_x.zmncs[idx_mn] * cosnvn; + lmksc += physical_x.lmnsc[idx_mn] * cosnv; + lmksc_n += physical_x.lmnsc[idx_mn] * sinnvn; + lmkcs += physical_x.lmncs[idx_mn] * sinnv; + lmkcs_n += physical_x.lmncs[idx_mn] * cosnvn; + } // n // INVERSE TRANSFORM IN M-THETA, FOR ALL RADIAL, ZETA VALUES const int idx_kl_base = ((jF - nsMinF1) * s.nZeta + k) * s.nThetaEff; - // Vectorized poloidal loops using Eigen operations - auto sinmum_seg = fb.sinmum.segment(idx_ml_base, s.nThetaReduced); - auto cosmum_seg = fb.cosmum.segment(idx_ml_base, s.nThetaReduced); - - auto ru_seg = Eigen::Map(ru.data() + idx_kl_base, - s.nThetaReduced); - auto zu_seg = Eigen::Map(zu.data() + idx_kl_base, - s.nThetaReduced); - auto lu_seg = Eigen::Map(lu.data() + idx_kl_base, - s.nThetaReduced); - - // NOTE: element-wise multiplication - ru_seg += rmkcc * sinmum_seg + rmkss * cosmum_seg; - zu_seg += zmksc * cosmum_seg + zmkcs * sinmum_seg; - lu_seg += lmksc * cosmum_seg + lmkcs * sinmum_seg; - - auto cosmu_seg = fb.cosmu.segment(idx_ml_base, s.nThetaReduced); - auto sinmu_seg = fb.sinmu.segment(idx_ml_base, s.nThetaReduced); - - auto rv_seg = Eigen::Map(rv.data() + idx_kl_base, - s.nThetaReduced); - auto zv_seg = Eigen::Map(zv.data() + idx_kl_base, - s.nThetaReduced); - auto lv_seg = Eigen::Map(lv.data() + idx_kl_base, - s.nThetaReduced); - - // NOTE: element-wise multiplication - rv_seg += rmkcc_n * cosmu_seg + rmkss_n * sinmu_seg; - zv_seg += zmksc_n * sinmu_seg + zmkcs_n * cosmu_seg; - // it is here that lv gets a negative sign! - lv_seg -= lmksc_n * sinmu_seg + lmkcs_n * cosmu_seg; - - auto r1_seg = Eigen::Map(r1.data() + idx_kl_base, - s.nThetaReduced); - auto z1_seg = Eigen::Map(z1.data() + idx_kl_base, - s.nThetaReduced); - - r1_seg += rmkcc * cosmu_seg + rmkss * sinmu_seg; - z1_seg += zmksc * sinmu_seg + zmkcs * cosmu_seg; + // the loop over l is split to help compiler auto-vectorization + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_ml = idx_ml_base + l; - if (nsMinF <= jF && jF < r.nsMaxFIncludingLcfs) { - // spectral condensation is local per flux surface - const int idx_con_base = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff; + const double sinmum = fb.sinmum[idx_ml]; + const double cosmum = fb.cosmum[idx_ml]; + + const int idx_kl = idx_kl_base + l; + ru[idx_kl] += rmkcc * sinmum + rmkss * cosmum; + zu[idx_kl] += zmksc * cosmum + zmkcs * sinmum; + lu[idx_kl] += lmksc * cosmum + lmkcs * sinmum; + } // l + + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_kl = idx_kl_base + l; + const int idx_ml = idx_ml_base + l; - auto rCon_seg = Eigen::Map( - m_geometry.rCon.data() + idx_con_base, s.nThetaReduced); - auto zCon_seg = Eigen::Map( - m_geometry.zCon.data() + idx_con_base, s.nThetaReduced); + const double cosmu = fb.cosmu[idx_ml]; + const double sinmu = fb.sinmu[idx_ml]; + rv[idx_kl] += rmkcc_n * cosmu + rmkss_n * sinmu; + zv[idx_kl] += zmksc_n * sinmu + zmkcs_n * cosmu; + // it is here that lv gets a negative sign! + lv[idx_kl] -= lmksc_n * sinmu + lmkcs_n * cosmu; + } // l - rCon_seg += (rmkcc * cosmu_seg + rmkss * sinmu_seg) * con_factor; - zCon_seg += (zmksc * sinmu_seg + zmkcs * cosmu_seg) * con_factor; - } + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_ml = idx_ml_base + l; + + const double cosmu = fb.cosmu[idx_ml]; + const double sinmu = fb.sinmu[idx_ml]; + + const int idx_kl = idx_kl_base + l; + + r1[idx_kl] += rmkcc * cosmu + rmkss * sinmu; + z1[idx_kl] += zmksc * sinmu + zmkcs * cosmu; + } // l + + if (nsMinF <= jF && jF < r.nsMaxFIncludingLcfs) { + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_ml = idx_ml_base + l; + const double cosmu = fb.cosmu[idx_ml]; + const double sinmu = fb.sinmu[idx_ml]; + + // spectral condensation is local per flux surface + // --> no need for numFull1 + const int idx_con = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + m_geometry.rCon[idx_con] += + (rmkcc * cosmu + rmkss * sinmu) * con_factor; + m_geometry.zCon[idx_con] += + (zmksc * sinmu + zmkcs * cosmu) * con_factor; + } + } // l } // k } // m } // j diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal.cc b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal.cc index 8b845c752..4323a1c30 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal.cc @@ -459,10 +459,6 @@ void ForcesToFourier3DSymmFastPoloidalFft( const auto& fzcon = m_even ? d.fzcon_e : d.fzcon_o; const int idx_ml_base = m * s.nThetaReduced; - auto cosmui_seg = fb.cosmui.segment(idx_ml_base, s.nThetaReduced); - auto sinmui_seg = fb.sinmui.segment(idx_ml_base, s.nThetaReduced); - auto cosmumi_seg = fb.cosmumi.segment(idx_ml_base, s.nThetaReduced); - auto sinmumi_seg = fb.sinmumi.segment(idx_ml_base, s.nThetaReduced); double* rmkcc_buf = in_slot(m, kRmkcc); double* rmkss_buf = in_slot(m, kRmkss); @@ -477,47 +473,65 @@ void ForcesToFourier3DSymmFastPoloidalFft( double* lmksc_n_buf = in_slot(m, kLmkscN); double* lmkcs_n_buf = in_slot(m, kLmkcsN); + const double xmpq_m = xmpq[m]; for (int k = 0; k < s.nZeta; ++k) { const int idx_kl_base = ((jF - rp.nsMinF) * s.nZeta + k) * s.nThetaEff; - auto blmn_seg = Eigen::Map( - blmn.data() + idx_kl_base, s.nThetaReduced); - auto clmn_seg = Eigen::Map( - clmn.data() + idx_kl_base, s.nThetaReduced); - auto crmn_seg = Eigen::Map( - crmn.data() + idx_kl_base, s.nThetaReduced); - auto czmn_seg = Eigen::Map( - czmn.data() + idx_kl_base, s.nThetaReduced); - auto armn_seg = Eigen::Map( - armn.data() + idx_kl_base, s.nThetaReduced); - auto azmn_seg = Eigen::Map( - azmn.data() + idx_kl_base, s.nThetaReduced); - auto brmn_seg = Eigen::Map( - brmn.data() + idx_kl_base, s.nThetaReduced); - auto bzmn_seg = Eigen::Map( - bzmn.data() + idx_kl_base, s.nThetaReduced); - auto frcon_seg = Eigen::Map( - frcon.data() + idx_kl_base, s.nThetaReduced); - auto fzcon_seg = Eigen::Map( - fzcon.data() + idx_kl_base, s.nThetaReduced); - - lmksc_buf[k] = blmn_seg.dot(cosmumi_seg); - lmkcs_buf[k] = blmn_seg.dot(sinmumi_seg); - lmkcs_n_buf[k] = -clmn_seg.dot(cosmui_seg); - lmksc_n_buf[k] = -clmn_seg.dot(sinmui_seg); - - rmkcc_n_buf[k] = -crmn_seg.dot(cosmui_seg); - zmkcs_n_buf[k] = -czmn_seg.dot(cosmui_seg); - rmkss_n_buf[k] = -crmn_seg.dot(sinmui_seg); - zmksc_n_buf[k] = -czmn_seg.dot(sinmui_seg); - - const Eigen::VectorXd tempR = (armn_seg + xmpq[m] * frcon_seg).eval(); - const Eigen::VectorXd tempZ = (azmn_seg + xmpq[m] * fzcon_seg).eval(); - - rmkcc_buf[k] = tempR.dot(cosmui_seg) + brmn_seg.dot(sinmumi_seg); - rmkss_buf[k] = tempR.dot(sinmui_seg) + brmn_seg.dot(cosmumi_seg); - zmksc_buf[k] = tempZ.dot(sinmui_seg) + bzmn_seg.dot(cosmumi_seg); - zmkcs_buf[k] = tempZ.dot(cosmui_seg) + bzmn_seg.dot(sinmumi_seg); + double rmkcc = 0.0; + double rmkcc_n = 0.0; + double rmkss = 0.0; + double rmkss_n = 0.0; + double zmksc = 0.0; + double zmksc_n = 0.0; + double zmkcs = 0.0; + double zmkcs_n = 0.0; + double lmksc = 0.0; + double lmksc_n = 0.0; + double lmkcs = 0.0; + double lmkcs_n = 0.0; + + // Fused poloidal reduction, matching ForcesToFourier3DSymmFastPoloidal: + // one pass over the short theta axis, no per-iteration heap temporary. + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_kl = idx_kl_base + l; + const int idx_ml = idx_ml_base + l; + + const double cosmui = fb.cosmui[idx_ml]; + const double sinmui = fb.sinmui[idx_ml]; + const double cosmumi = fb.cosmumi[idx_ml]; + const double sinmumi = fb.sinmumi[idx_ml]; + + lmksc += blmn[idx_kl] * cosmumi; + lmkcs += blmn[idx_kl] * sinmumi; + lmkcs_n -= clmn[idx_kl] * cosmui; + lmksc_n -= clmn[idx_kl] * sinmui; + + rmkcc_n -= crmn[idx_kl] * cosmui; + zmkcs_n -= czmn[idx_kl] * cosmui; + rmkss_n -= crmn[idx_kl] * sinmui; + zmksc_n -= czmn[idx_kl] * sinmui; + + const double tempR = armn[idx_kl] + xmpq_m * frcon[idx_kl]; + const double tempZ = azmn[idx_kl] + xmpq_m * fzcon[idx_kl]; + + rmkcc += tempR * cosmui + brmn[idx_kl] * sinmumi; + rmkss += tempR * sinmui + brmn[idx_kl] * cosmumi; + zmksc += tempZ * sinmui + bzmn[idx_kl] * cosmumi; + zmkcs += tempZ * cosmui + bzmn[idx_kl] * sinmumi; + } // l + + rmkcc_buf[k] = rmkcc; + rmkss_buf[k] = rmkss; + rmkcc_n_buf[k] = rmkcc_n; + rmkss_n_buf[k] = rmkss_n; + zmksc_buf[k] = zmksc; + zmkcs_buf[k] = zmkcs; + zmksc_n_buf[k] = zmksc_n; + zmkcs_n_buf[k] = zmkcs_n; + lmksc_buf[k] = lmksc; + lmkcs_buf[k] = lmkcs; + lmksc_n_buf[k] = lmksc_n; + lmkcs_n_buf[k] = lmkcs_n; } // k } // m (fill) @@ -590,10 +604,6 @@ void ForcesToFourier3DSymmFastPoloidalFft( const auto& clmn = m_even ? d.clmn_e : d.clmn_o; const int idx_ml_base = m * s.nThetaReduced; - auto cosmui_seg = fb.cosmui.segment(idx_ml_base, s.nThetaReduced); - auto sinmui_seg = fb.sinmui.segment(idx_ml_base, s.nThetaReduced); - auto cosmumi_seg = fb.cosmumi.segment(idx_ml_base, s.nThetaReduced); - auto sinmumi_seg = fb.sinmumi.segment(idx_ml_base, s.nThetaReduced); double* lmksc_buf = in_slot(m, kLmksc); double* lmkcs_buf = in_slot(m, kLmkcs); @@ -602,15 +612,32 @@ void ForcesToFourier3DSymmFastPoloidalFft( for (int k = 0; k < s.nZeta; ++k) { const int idx_kl_base = ((jF - rp.nsMinF) * s.nZeta + k) * s.nThetaEff; - auto blmn_seg = Eigen::Map( - blmn.data() + idx_kl_base, s.nThetaReduced); - auto clmn_seg = Eigen::Map( - clmn.data() + idx_kl_base, s.nThetaReduced); - - lmksc_buf[k] = blmn_seg.dot(cosmumi_seg); - lmkcs_buf[k] = blmn_seg.dot(sinmumi_seg); - lmkcs_n_buf[k] = -clmn_seg.dot(cosmui_seg); - lmksc_n_buf[k] = -clmn_seg.dot(sinmui_seg); + + double lmksc = 0.0; + double lmksc_n = 0.0; + double lmkcs = 0.0; + double lmkcs_n = 0.0; + + // Fused poloidal reduction (see main-loop note). + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_kl = idx_kl_base + l; + const int idx_ml = idx_ml_base + l; + + const double cosmui = fb.cosmui[idx_ml]; + const double sinmui = fb.sinmui[idx_ml]; + const double cosmumi = fb.cosmumi[idx_ml]; + const double sinmumi = fb.sinmumi[idx_ml]; + + lmksc += blmn[idx_kl] * cosmumi; + lmkcs += blmn[idx_kl] * sinmumi; + lmkcs_n -= clmn[idx_kl] * cosmui; + lmksc_n -= clmn[idx_kl] * sinmui; + } // l + + lmksc_buf[k] = lmksc; + lmkcs_buf[k] = lmkcs; + lmksc_n_buf[k] = lmksc_n; + lmkcs_n_buf[k] = lmkcs_n; } // k } // m (fill) diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal_bench.cc b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal_bench.cc index 04191d42b..d67b631dc 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal_bench.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/fft_toroidal_bench.cc @@ -3,98 +3,97 @@ // // SPDX-License-Identifier: MIT -// Microbenchmarks for the toroidal FFT hot loop. -// Covers both directions (spectral->real, real->spectral) at four -// representative resolutions used in typical VMEC runs. +// Microbenchmark for the toroidal transform hot loop, across a spread of +// resolutions covering both the FFT and DFT dispatch paths. // -// The parallel benchmark (BM_FourierToReal_Parallel) matches the actual VMEC -// call pattern: N threads simultaneously call -// FourierToReal3DSymmFastPoloidalFft on their own radial slice, sharing only -// the read-only ToroidalFftPlans. +// This calls IdealMhdModel::dft_FourierToReal_3d_symm() / +// dft_ForcesToFourier_3d_symm() -- the same dispatcher the real solver calls +// every iteration -- rather than the underlying FFT/DFT kernels directly. +// That dispatcher internally picks the FFTX path when a precompiled codelet +// exists for the resolution's (nZeta, 12*mpol) shape, and falls back to the +// plain DFT otherwise (see kernels_available() in fft_toroidal.h). Measuring +// through the dispatcher means a single named series here transparently +// reflects whichever path is actually active for that size, instead of +// requiring separate Dft/Fft series that must be read together. -#include - -#include #include #include -#include #include "Eigen/Dense" #include "benchmark/benchmark.h" #include "vmecpp/common/flow_control/flow_control.h" #include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" #include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/common/util/util.h" #include "vmecpp/common/vmec_indata/vmec_indata.h" #include "vmecpp/vmec/fourier_forces/fourier_forces.h" #include "vmecpp/vmec/fourier_geometry/fourier_geometry.h" #include "vmecpp/vmec/handover_storage/handover_storage.h" -#include "vmecpp/vmec/ideal_mhd_model/dft_data.h" -#include "vmecpp/vmec/ideal_mhd_model/fft_toroidal.h" #include "vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h" #include "vmecpp/vmec/radial_partitioning/radial_partitioning.h" #include "vmecpp/vmec/radial_profiles/radial_profiles.h" +#include "vmecpp/vmec/thread_local_storage/thread_local_storage.h" +#include "vmecpp/vmec/vmec_constants/vmec_constants.h" namespace vmecpp { namespace { -// ns = 51 is representative of a medium-resolution VMEC run. constexpr int kNs = 51; +// label nfp mpol ntor nZeta batch FFTX codelet? +// 4x4 1 4 4 12 48 no (small DFT baseline) +// cma_5x6 5 5 6 16 60 no (real cma config, DFT) +// 6x8 5 8 6 16 96 yes (real cma_6x8 config, FFT) +// w7x_12x12 5 12 12 28 144 yes (flagship W7-X, FFT) +// 12x13 5 12 13 30 144 no (large DFT; same batch as +// w7x_12x12 but no codelet) +struct ResParams { + int nfp; + int mpol; + int ntor; + const char* label; +}; + +constexpr ResParams kResolutions[] = { + {1, 4, 4, "4x4"}, {5, 5, 6, "cma_5x6"}, {5, 8, 6, "6x8"}, + {5, 12, 12, "w7x_12x12"}, {5, 12, 13, "12x13"}, +}; + // ---------------------------------------------------------------------------- -// Shared fixture data, built once per (nfp, mpol, ntor) combination. -// -// RadialProfiles stores pointers/references to its constructor arguments, so -// all dependencies (indata, handover, fc) must outlive the RadialProfiles -// object. We heap-allocate everything here. +// Fixture: builds a fixed-boundary IdealMhdModel and the FourierGeometry +// input it operates on. FreeBoundaryBase* is null: dft_FourierToReal_3d_symm +// and dft_ForcesToFourier_3d_symm never touch it (only referenced by the +// free-boundary vacuum path in update()/computeBContra(), which this +// benchmark never calls), and the constructor only requires a non-null +// FreeBoundaryBase when FlowControl::lfreeb is true. // ---------------------------------------------------------------------------- struct BenchFixture { - // Dependencies that RadialProfiles points into -- must be declared first. Sizes s; RadialPartitioning rp; FourierBasisFastPoloidal fb; - ToroidalFftPlans plans; - Eigen::VectorXd xmpq; + VmecConstants constants; + ThreadLocalStorage ls; std::unique_ptr indata; std::unique_ptr handover; std::unique_ptr fc; std::unique_ptr rprof; + VacuumPressureState vacuum_pressure_state = VacuumPressureState::kOff; + std::unique_ptr model; - // Forward-transform inputs. std::unique_ptr phys_x; + std::unique_ptr phys_f; - // Forward-transform output storage. - std::vector r1_e, r1_o, ru_e, ru_o, rv_e, rv_o; - std::vector z1_e, z1_o, zu_e, zu_o, zv_e, zv_o; - std::vector lu_e, lu_o, lv_e, lv_o; - std::vector rCon, zCon; - RealSpaceGeometry geom; - - // Inverse-transform inputs. - std::vector armn_e, armn_o, azmn_e, azmn_o; - std::vector blmn_e, blmn_o, brmn_e, brmn_o, bzmn_e, bzmn_o; - std::vector clmn_e, clmn_o, crmn_e, crmn_o, czmn_e, czmn_o; - std::vector frcon_e, frcon_o, fzcon_e, fzcon_o; - RealSpaceForces forces; - - // Inverse-transform output. - std::unique_ptr ff; - - explicit BenchFixture(int nfp, int mpol, int ntor, int ntheta = 0, - int nzeta = 0) - : s(/*lasym=*/false, nfp, mpol, ntor, ntheta, nzeta), + explicit BenchFixture(int nfp, int mpol, int ntor) + : s(/*lasym=*/false, nfp, mpol, ntor, /*ntheta=*/0, /*nzeta=*/0), fb(&s), - plans(s.nZeta, s.nfp, s.mpol), + ls(&s), indata(std::make_unique()), handover(std::make_unique(&s)), fc(std::make_unique(/*lfreeb=*/false, /*delt=*/0.9, /*num_grids=*/1)) { rp.adjustRadialPartitioning(/*num_threads=*/1, /*thread_id=*/0, kNs, /*lfreeb=*/false, /*printout=*/false); - - xmpq.resize(s.mpol); - for (int m = 0; m < s.mpol; ++m) xmpq[m] = m * (m - 1); - fc->ns = kNs; rprof = std::make_unique(&rp, handover.get(), indata.get(), @@ -107,8 +106,12 @@ struct BenchFixture { std::sqrt(0.05 + 0.9 * j / (nsurf > 1 ? nsurf - 1 : 1)); } - phys_x = std::make_unique(&s, &rp, kNs); + model = std::make_unique( + fc.get(), &s, &fb, rprof.get(), &constants, &ls, handover.get(), &rp, + /*m_fb=*/nullptr, /*signOfJacobian=*/-1, /*nvacskip=*/0, + &vacuum_pressure_state); + phys_x = std::make_unique(&s, &rp, kNs); std::mt19937 rng(42); std::uniform_real_distribution dist(-1.0, 1.0); auto rfill = [&](std::span sp) { @@ -121,410 +124,48 @@ struct BenchFixture { rfill(phys_x->lmnsc); rfill(phys_x->lmncs); - // Allocate forward-transform output. - const int nrzt1 = s.nZnT * (rp.nsMaxF1 - rp.nsMinF1); - const int nrzt_con = s.nZnT * (rp.nsMaxFIncludingLcfs - rp.nsMinF); - auto alloc = [](int n) { return std::vector(n, 0.0); }; - r1_e = alloc(nrzt1); - r1_o = alloc(nrzt1); - ru_e = alloc(nrzt1); - ru_o = alloc(nrzt1); - rv_e = alloc(nrzt1); - rv_o = alloc(nrzt1); - z1_e = alloc(nrzt1); - z1_o = alloc(nrzt1); - zu_e = alloc(nrzt1); - zu_o = alloc(nrzt1); - zv_e = alloc(nrzt1); - zv_o = alloc(nrzt1); - lu_e = alloc(nrzt1); - lu_o = alloc(nrzt1); - lv_e = alloc(nrzt1); - lv_o = alloc(nrzt1); - rCon = alloc(nrzt_con); - zCon = alloc(nrzt_con); - geom = - RealSpaceGeometry{r1_e, r1_o, ru_e, ru_o, rv_e, rv_o, z1_e, z1_o, zu_e, - zu_o, zv_e, zv_o, lu_e, lu_o, lv_e, lv_o, rCon, zCon}; - - // Allocate inverse-transform input. - const int nrzt = s.nZnT * (rp.nsMaxF - rp.nsMinF); - const int nrzt_lcfs = s.nZnT * (rp.nsMaxFIncludingLcfs - rp.nsMinF); - auto rvec = [&](int n) { - std::vector v(n); - for (double& x : v) x = dist(rng); - return v; - }; - armn_e = rvec(nrzt); - armn_o = rvec(nrzt); - azmn_e = rvec(nrzt); - azmn_o = rvec(nrzt); - blmn_e = rvec(nrzt_lcfs); - blmn_o = rvec(nrzt_lcfs); - brmn_e = rvec(nrzt); - brmn_o = rvec(nrzt); - bzmn_e = rvec(nrzt); - bzmn_o = rvec(nrzt); - clmn_e = rvec(nrzt_lcfs); - clmn_o = rvec(nrzt_lcfs); - crmn_e = rvec(nrzt); - crmn_o = rvec(nrzt); - czmn_e = rvec(nrzt); - czmn_o = rvec(nrzt); - frcon_e = rvec(nrzt); - frcon_o = rvec(nrzt); - fzcon_e = rvec(nrzt); - fzcon_o = rvec(nrzt); - forces = RealSpaceForces{armn_e, armn_o, azmn_e, azmn_o, blmn_e, - blmn_o, brmn_e, brmn_o, bzmn_e, bzmn_o, - clmn_e, clmn_o, crmn_e, crmn_o, czmn_e, - czmn_o, frcon_e, frcon_o, fzcon_e, fzcon_o}; - - ff = std::make_unique(&s, &rp, kNs); + phys_f = std::make_unique(&s, &rp, kNs); } }; -// ---------------------------------------------------------------------------- -// Benchmark helpers -// ---------------------------------------------------------------------------- - -// (nfp, mpol, ntor) pairs for the four benchmark resolutions. -struct ResParams { - int nfp; - int mpol; - int ntor; - const char* label; -}; - -constexpr ResParams kResolutions[] = { - {1, 4, 4, "4x4"}, - {1, 7, 1, "7x1"}, - {5, 12, 12, "12x12"}, - {5, 16, 18, "16x18"}, -}; - -// Templated benchmarks parameterised by a ResParams index so GBench can name -// them clearly. The fixture is a function-local static so it is built exactly -// once per process (not once per benchmark iteration). - template -void BM_FourierToReal(benchmark::State& state) { +void BM_ToroidalTransform_FourierToReal(benchmark::State& state) { static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, kResolutions[kIdx].ntor); for (auto _ : state) { - FourierToReal3DSymmFastPoloidalFft(*fx.phys_x, fx.xmpq, fx.rp, fx.s, - *fx.rprof, fx.fb, fx.plans, fx.geom); + fx.model->dft_FourierToReal_3d_symm(*fx.phys_x); benchmark::ClobberMemory(); } state.SetLabel(kResolutions[kIdx].label); } template -void BM_ForcesToFourier(benchmark::State& state) { +void BM_ToroidalTransform_ForcesToFourier(benchmark::State& state) { static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, kResolutions[kIdx].ntor); + // dft_ForcesToFourier_3d_symm reads IdealMhdModel's private real-space + // force members (armn_e, blmn_e, ...), which this fixture never populates + // -- they stay zero-initialized. That's fine for a timing benchmark: the + // transform cost doesn't depend on the input values, only its size. for (auto _ : state) { - ForcesToFourier3DSymmFastPoloidalFft(fx.forces, fx.xmpq, fx.rp, *fx.fc, - fx.s, fx.fb, fx.plans, - VacuumPressureState::kOff, *fx.ff); + fx.model->dft_ForcesToFourier_3d_symm(*fx.phys_f); benchmark::ClobberMemory(); } state.SetLabel(kResolutions[kIdx].label); } -template -void BM_DftFourierToReal(benchmark::State& state) { - static BenchFixture fx(kResolutions[kIdx].nfp, kResolutions[kIdx].mpol, - kResolutions[kIdx].ntor); - for (auto _ : state) { - FourierToReal3DSymmFastPoloidal(*fx.phys_x, fx.xmpq, fx.rp, fx.s, *fx.rprof, - fx.fb, fx.geom); - benchmark::ClobberMemory(); - } - state.SetLabel(kResolutions[kIdx].label); -} - -BENCHMARK_TEMPLATE(BM_DftFourierToReal, 0)->Name("DftFourierToReal/4x4"); -BENCHMARK_TEMPLATE(BM_FourierToReal, 0)->Name("FftFourierToReal/4x4"); -BENCHMARK_TEMPLATE(BM_DftFourierToReal, 1)->Name("DftFourierToReal/7x1"); -BENCHMARK_TEMPLATE(BM_FourierToReal, 1)->Name("FftFourierToReal/7x1"); -BENCHMARK_TEMPLATE(BM_DftFourierToReal, 2)->Name("DftFourierToReal/12x12"); -BENCHMARK_TEMPLATE(BM_FourierToReal, 2)->Name("FftFourierToReal/12x12"); -BENCHMARK_TEMPLATE(BM_DftFourierToReal, 3)->Name("DftFourierToReal/16x18"); -BENCHMARK_TEMPLATE(BM_FourierToReal, 3)->Name("FftFourierToReal/16x18"); - -// ---------------------------------------------------------------------------- -// Real-space resolution sweep at fixed spectral resolution (mpol=12, ntor=12, -// nfp=5). Default real-space grid is (ntheta=2*mpol+6=30, nzeta=2*ntor+4=28 -// when nfp=1; for nfp=5 the toroidal grid extends accordingly). We vary -// ntheta and nzeta independently to isolate poloidal-AXPY cost (ntheta) from -// toroidal-FFT cost (nzeta). -// ---------------------------------------------------------------------------- - -struct RealSpaceParams { - int nfp; - int mpol; - int ntor; - int ntheta; // 0 = use Sizes default - int nzeta; // 0 = use Sizes default - const char* label; -}; - -constexpr RealSpaceParams kRealSpaceSweep[] = { - // Vary nzeta (toroidal real-space grid) at fixed ntheta default. - {5, 12, 12, 0, 28, "12x12_ntheta-default_nzeta-28"}, // baseline default - {5, 12, 12, 0, 56, "12x12_ntheta-default_nzeta-56"}, // 2x toroidal - {5, 12, 12, 0, 84, "12x12_ntheta-default_nzeta-84"}, // 3x toroidal - {5, 12, 12, 0, 112, "12x12_ntheta-default_nzeta-112"}, // 4x toroidal - // Vary ntheta (poloidal real-space grid) at fixed nzeta default. - {5, 12, 12, 30, 0, "12x12_ntheta-30_nzeta-default"}, // baseline default - {5, 12, 12, 60, 0, "12x12_ntheta-60_nzeta-default"}, // 2x poloidal - {5, 12, 12, 90, 0, "12x12_ntheta-90_nzeta-default"}, // 3x poloidal - {5, 12, 12, 120, 0, "12x12_ntheta-120_nzeta-default"}, // 4x poloidal -}; - -template -void BM_FftFourierToReal_RealSpace(benchmark::State& state) { - static BenchFixture fx(kRealSpaceSweep[kIdx].nfp, kRealSpaceSweep[kIdx].mpol, - kRealSpaceSweep[kIdx].ntor, - kRealSpaceSweep[kIdx].ntheta, - kRealSpaceSweep[kIdx].nzeta); - for (auto _ : state) { - FourierToReal3DSymmFastPoloidalFft(*fx.phys_x, fx.xmpq, fx.rp, fx.s, - *fx.rprof, fx.fb, fx.plans, fx.geom); - benchmark::ClobberMemory(); - } - state.SetLabel(kRealSpaceSweep[kIdx].label); -} - -template -void BM_DftFourierToReal_RealSpace(benchmark::State& state) { - static BenchFixture fx(kRealSpaceSweep[kIdx].nfp, kRealSpaceSweep[kIdx].mpol, - kRealSpaceSweep[kIdx].ntor, - kRealSpaceSweep[kIdx].ntheta, - kRealSpaceSweep[kIdx].nzeta); - for (auto _ : state) { - FourierToReal3DSymmFastPoloidal(*fx.phys_x, fx.xmpq, fx.rp, fx.s, *fx.rprof, - fx.fb, fx.geom); - benchmark::ClobberMemory(); - } - state.SetLabel(kRealSpaceSweep[kIdx].label); -} - -#define REGISTER_RS(I, NAME) \ - BENCHMARK_TEMPLATE(BM_DftFourierToReal_RealSpace, I)->Name("Dft/" NAME); \ - BENCHMARK_TEMPLATE(BM_FftFourierToReal_RealSpace, I)->Name("Fft/" NAME) - -REGISTER_RS(0, "12x12_nzeta-28"); -REGISTER_RS(1, "12x12_nzeta-56"); -REGISTER_RS(2, "12x12_nzeta-84"); -REGISTER_RS(3, "12x12_nzeta-112"); -REGISTER_RS(4, "12x12_ntheta-30"); -REGISTER_RS(5, "12x12_ntheta-60"); -REGISTER_RS(6, "12x12_ntheta-90"); -REGISTER_RS(7, "12x12_ntheta-120"); - -#undef REGISTER_RS - -// ---------------------------------------------------------------------------- -// Parallel fixture: one BenchFixture per thread, each covering its own radial -// slice, sharing the same ToroidalFftPlans (read-only during the hot loop). -// This matches the real VMEC calling pattern exactly: -// #pragma omp parallel -// { models[omp_get_thread_num()].geometryFromFourier(phys_x); } -// ---------------------------------------------------------------------------- - -struct ParallelBenchFixture { - // Shared across threads (read-only during hot loop). - Sizes s; - FourierBasisFastPoloidal fb; - ToroidalFftPlans plans; - Eigen::VectorXd xmpq; +#define REGISTER_RES(IDX, LABEL) \ + BENCHMARK_TEMPLATE(BM_ToroidalTransform_FourierToReal, IDX) \ + ->Name("ToroidalFourierToReal/" LABEL); \ + BENCHMARK_TEMPLATE(BM_ToroidalTransform_ForcesToFourier, IDX) \ + ->Name("ToroidalForcesToFourier/" LABEL) - // Per-thread state: each thread gets its own radial slice. - struct ThreadSlice { - RadialPartitioning rp; - std::unique_ptr indata; - std::unique_ptr handover; - std::unique_ptr fc; - std::unique_ptr rprof; - std::unique_ptr phys_x; - // Output buffers (each thread writes only to its own slice). - std::vector r1_e, r1_o, ru_e, ru_o, rv_e, rv_o; - std::vector z1_e, z1_o, zu_e, zu_o, zv_e, zv_o; - std::vector lu_e, lu_o, lv_e, lv_o; - std::vector rCon, zCon; - RealSpaceGeometry geom; - }; +REGISTER_RES(0, "4x4"); +REGISTER_RES(1, "6x8"); +REGISTER_RES(2, "12x12"); +REGISTER_RES(3, "12x13"); - std::vector threads; - - explicit ParallelBenchFixture(int nfp, int mpol, int ntor, int num_threads) - : s(/*lasym=*/false, nfp, mpol, ntor, /*ntheta=*/0, /*nzeta=*/0), - fb(&s), - plans(s.nZeta, s.nfp, s.mpol), - threads(num_threads) { - xmpq.resize(s.mpol); - for (int m = 0; m < s.mpol; ++m) xmpq[m] = m * (m - 1); - - std::mt19937 rng(42); - std::uniform_real_distribution dist(-1.0, 1.0); - - for (int t = 0; t < num_threads; ++t) { - ThreadSlice& sl = threads[t]; - sl.rp.adjustRadialPartitioning(num_threads, t, kNs, - /*lfreeb=*/false, /*printout=*/false); - sl.indata = std::make_unique(); - sl.handover = std::make_unique(&s); - sl.fc = std::make_unique(/*lfreeb=*/false, /*delt=*/0.9, - /*num_grids=*/1); - sl.fc->ns = kNs; - sl.rprof = std::make_unique( - &sl.rp, sl.handover.get(), sl.indata.get(), sl.fc.get(), - /*signOfJacobian=*/-1, /*pDamp=*/0.05); - const int nsurf = sl.rp.nsMaxF1 - sl.rp.nsMinF1; - sl.rprof->sqrtSF.resize(nsurf); - for (int j = 0; j < nsurf; ++j) { - sl.rprof->sqrtSF[j] = - std::sqrt(0.05 + 0.9 * j / (nsurf > 1 ? nsurf - 1 : 1)); - } - - sl.phys_x = std::make_unique(&s, &sl.rp, kNs); - auto rfill = [&](std::span sp) { - for (double& x : sp) x = dist(rng); - }; - rfill(sl.phys_x->rmncc); - rfill(sl.phys_x->rmnss); - rfill(sl.phys_x->zmnsc); - rfill(sl.phys_x->zmncs); - rfill(sl.phys_x->lmnsc); - rfill(sl.phys_x->lmncs); - - const int nrzt1 = s.nZnT * (sl.rp.nsMaxF1 - sl.rp.nsMinF1); - const int nrzt_con = s.nZnT * (sl.rp.nsMaxFIncludingLcfs - sl.rp.nsMinF); - auto alloc = [](int n) { return std::vector(n, 0.0); }; - sl.r1_e = alloc(nrzt1); - sl.r1_o = alloc(nrzt1); - sl.ru_e = alloc(nrzt1); - sl.ru_o = alloc(nrzt1); - sl.rv_e = alloc(nrzt1); - sl.rv_o = alloc(nrzt1); - sl.z1_e = alloc(nrzt1); - sl.z1_o = alloc(nrzt1); - sl.zu_e = alloc(nrzt1); - sl.zu_o = alloc(nrzt1); - sl.zv_e = alloc(nrzt1); - sl.zv_o = alloc(nrzt1); - sl.lu_e = alloc(nrzt1); - sl.lu_o = alloc(nrzt1); - sl.lv_e = alloc(nrzt1); - sl.lv_o = alloc(nrzt1); - sl.rCon = alloc(nrzt_con); - sl.zCon = alloc(nrzt_con); - sl.geom = RealSpaceGeometry{sl.r1_e, sl.r1_o, sl.ru_e, sl.ru_o, sl.rv_e, - sl.rv_o, sl.z1_e, sl.z1_o, sl.zu_e, sl.zu_o, - sl.zv_e, sl.zv_o, sl.lu_e, sl.lu_o, sl.lv_e, - sl.lv_o, sl.rCon, sl.zCon}; - } - } -}; - -// w7x at 4 threads: matches the real VMEC calling pattern exactly. -// -// VMEC keeps a single #pragma omp parallel team alive for the entire solver -// run. Each thread owns its own IdealMhdModel (with its own RadialPartitioning -// slice) and calls dft_FourierToReal_3d_symm directly from within that -// persistent team -- there is no nested fork/join per iteration, only -// #pragma omp barrier between phases. -// -// We replicate that by opening one persistent team and looping inside it. -// Thread 0 drives the Google Benchmark state machine; the others mirror it -// via a shared atomic flag. Each call is bracketed by barriers so all threads -// start and finish together, and the wall-clock time reflects the slowest. -void BM_FourierToReal_Parallel_W7x_4t(benchmark::State& state) { - constexpr int kNumThreads = 6; - static ParallelBenchFixture fx(/*nfp=*/5, /*mpol=*/12, /*ntor=*/12, - kNumThreads); - - std::atomic keep_going{true}; - -#pragma omp parallel num_threads(kNumThreads) - { - const int tid = omp_get_thread_num(); - ParallelBenchFixture::ThreadSlice& sl = fx.threads[tid]; - - // Warmup: each thread faults in its own plan's twiddle pages and sizes - // the thread_local scratch buffer before timing starts. - FourierToReal3DSymmFastPoloidalFft(*sl.phys_x, fx.xmpq, sl.rp, fx.s, - *sl.rprof, fx.fb, fx.plans, sl.geom); -#pragma omp barrier - - if (tid == 0) { - for (auto _ : state) { -#pragma omp barrier - FourierToReal3DSymmFastPoloidalFft(*sl.phys_x, fx.xmpq, sl.rp, fx.s, - *sl.rprof, fx.fb, fx.plans, sl.geom); -#pragma omp barrier - } - keep_going.store(false, std::memory_order_release); - // Final barrier so workers see the flag and exit cleanly. -#pragma omp barrier - } else { - while (true) { -#pragma omp barrier - if (!keep_going.load(std::memory_order_acquire)) break; - FourierToReal3DSymmFastPoloidalFft(*sl.phys_x, fx.xmpq, sl.rp, fx.s, - *sl.rprof, fx.fb, fx.plans, sl.geom); -#pragma omp barrier - } - } - } - - state.SetLabel("12x12 6-thread parallel fft"); -} -BENCHMARK(BM_FourierToReal_Parallel_W7x_4t); - -// DFT parallel: same structure, no FFT plans needed. -void BM_DftFourierToReal_Parallel_W7x_4t(benchmark::State& state) { - constexpr int kNumThreads = 6; - static ParallelBenchFixture fx(/*nfp=*/5, /*mpol=*/12, /*ntor=*/12, - kNumThreads); - - std::atomic keep_going{true}; - -#pragma omp parallel num_threads(kNumThreads) - { - const int tid = omp_get_thread_num(); - ParallelBenchFixture::ThreadSlice& sl = fx.threads[tid]; - - // Warmup: fault in thread_local memory / cache lines before timing. - FourierToReal3DSymmFastPoloidal(*sl.phys_x, fx.xmpq, sl.rp, fx.s, *sl.rprof, - fx.fb, sl.geom); -#pragma omp barrier - - if (tid == 0) { - for (auto _ : state) { -#pragma omp barrier - FourierToReal3DSymmFastPoloidal(*sl.phys_x, fx.xmpq, sl.rp, fx.s, - *sl.rprof, fx.fb, sl.geom); -#pragma omp barrier - } - keep_going.store(false, std::memory_order_release); -#pragma omp barrier - } else { - while (true) { -#pragma omp barrier - if (!keep_going.load(std::memory_order_acquire)) break; - FourierToReal3DSymmFastPoloidal(*sl.phys_x, fx.xmpq, sl.rp, fx.s, - *sl.rprof, fx.fb, sl.geom); -#pragma omp barrier - } - } - } - - state.SetLabel("12x12 6-thread parallel dft"); -} -BENCHMARK(BM_DftFourierToReal_Parallel_W7x_4t); +#undef REGISTER_RES } // namespace } // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.cc b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.cc index 0644fb482..66b746e1c 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.cc @@ -20,7 +20,14 @@ #include "vmecpp/common/util/util.h" #include "vmecpp/vmec/fourier_geometry/fourier_geometry.h" #include "vmecpp/vmec/handover_storage/handover_storage.h" +#include "vmecpp/vmec/ideal_mhd_model/bco_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/bcontra_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/constraint_force_kernel.h" #include "vmecpp/vmec/ideal_mhd_model/jacobian_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/lambda_force_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/metric_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/mhdforce_kernel.h" +#include "vmecpp/vmec/ideal_mhd_model/pressure_kernel.h" #include "vmecpp/vmec/radial_partitioning/radial_partitioning.h" #include "vmecpp/vmec/radial_profiles/radial_profiles.h" #include "vmecpp/vmec/vmec_constants/vmec_algorithm_constants.h" @@ -414,7 +421,14 @@ absl::StatusOr IdealMhdModel::update( bool& m_need_restart, int& m_last_preconditioner_update, int& m_last_full_update_nestor, FlowControl& m_fc, const int iter1, const int iter2, const VmecCheckpoint& checkpoint, - const int iterations_before_checkpointing, bool verbose) { + const int iterations_before_checkpointing, bool verbose, + bool always_fix_m1_gauge) { + // An axis re-guess after a bad Jacobian can repopulate high geometry modes + // directly, bypassing the force mask; clear them on the state each iteration. + if (s_.mpolGeometry < s_.mpol || s_.ntorGeometry < s_.ntor) { + m_decomposed_x.maskGeometryAbove(s_.mpolGeometry, s_.ntorGeometry); + } + // preprocess Fourier coefficients of geometry m_decomposed_x.decomposeInto(m_physical_x, m_p_.scalxc); if (checkpoint == VmecCheckpoint::FOURIER_GEOMETRY_TO_START_WITH && @@ -800,7 +814,9 @@ absl::StatusOr IdealMhdModel::update( m_decomposed_f.m1Constraint(1.0 / std::numbers::sqrt2); // v8.50: ADD iter2<2 so reset= works - if (m_fc.fsqz < 1.0e-6 || iter2 < 2) { + const bool fix_m1_gauge = + always_fix_m1_gauge || m_fc.fsqz < 1.0e-6 || iter2 < 2; + if (fix_m1_gauge) { // ensure that the m=1 constraint is satisfied exactly // --> the corresponding m=1 coeffs of R,Z are constrained to be zero // and thus must not be "forced" (by the time evol using gc) away from @@ -808,6 +824,13 @@ absl::StatusOr IdealMhdModel::update( m_decomposed_f.zeroZForceForM1(); } + // Freeze geometry above the reduced resolution before the invariant + // residuals (so frozen modes stay out of the convergence test) and before + // preconditioning (so they get no update). + if (s_.mpolGeometry < s_.mpol || s_.ntorGeometry < s_.ntor) { + m_decomposed_f.maskGeometryAbove(s_.mpolGeometry, s_.ntorGeometry); + } + if (checkpoint == VmecCheckpoint::PHYSICAL_FORCES && iter2 >= iterations_before_checkpointing) { return true; @@ -869,6 +892,13 @@ absl::StatusOr IdealMhdModel::update( return true; } + // Re-freeze after preconditioning. The radial preconditioner is per-mode so + // it cannot reintroduce frozen modes; this keeps the preconditioned residual + // and the state update clean. + if (s_.mpolGeometry < s_.mpol || s_.ntorGeometry < s_.ntor) { + m_decomposed_f.maskGeometryAbove(s_.mpolGeometry, s_.ntorGeometry); + } + Eigen::Vector3d localFResPrecd; localFResPrecd.setZero(); m_decomposed_f.residuals(localFResPrecd, true); @@ -1238,131 +1268,15 @@ void IdealMhdModel::computeJacobian() { } void IdealMhdModel::computeMetricElements() { - // gsqrt - // guu, guv, gvv - - // contributions from full-grid surface _i_nside j-th half-grid surface - int j0 = r_.nsMinF1; - for (int kl = 0; kl < s_.nZnT; ++kl) { - m_ls_.r1e_i[kl] = r1_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.r1o_i[kl] = r1_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.z1e_i[kl] = z1_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.z1o_i[kl] = z1_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.rue_i[kl] = ru_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.ruo_i[kl] = ru_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.zue_i[kl] = zu_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.zuo_i[kl] = zu_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - if (s_.lthreed) { - m_ls_.rve_i[kl] = rv_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.rvo_i[kl] = rv_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.zve_i[kl] = zv_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.zvo_i[kl] = zv_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - } - } - - // s on inner full-grid pos - double sF_i = - m_p_.sqrtSF[r_.nsMinH - r_.nsMinF1] * m_p_.sqrtSF[r_.nsMinH - r_.nsMinF1]; - - for (int jH = r_.nsMinH; jH < r_.nsMaxH; ++jH) { - // s on outside full-grid pos - double sF_o = - m_p_.sqrtSF[jH + 1 - r_.nsMinF1] * m_p_.sqrtSF[jH + 1 - r_.nsMinF1]; - - // sqrt(s) on j-th half-grid pos - double sqrtSH = m_p_.sqrtSH[jH - r_.nsMinH]; - - for (int kl = 0; kl < s_.nZnT; ++kl) { - int iHalf = (jH - r_.nsMinH) * s_.nZnT + kl; - - // Re-use this loop to compute Jacobian gsqrt=tau*R - // only tau needed to be checked for a sign change, - // so skip the last part where gsqrt is computed - // if a sign changed happened by computing it only here - // (which will only be reached when tau did not change sign). - gsqrt[iHalf] = tau[iHalf] * r12[iHalf]; - - // contributions from full-grid surface _o_utside j-th half-grid surface - double r1e_o = r1_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double r1o_o = r1_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double rue_o = ru_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double ruo_o = ru_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double zue_o = zu_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double zuo_o = zu_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - - // g_{\theta,\theta} is needed for both 2D and 3D cases - guu[iHalf] = 0.5 * ((m_ls_.rue_i[kl] * m_ls_.rue_i[kl] + - m_ls_.zue_i[kl] * m_ls_.zue_i[kl]) + - (rue_o * rue_o + zue_o * zue_o) + - sF_i * (m_ls_.ruo_i[kl] * m_ls_.ruo_i[kl] + - m_ls_.zuo_i[kl] * m_ls_.zuo_i[kl]) + - sF_o * (ruo_o * ruo_o + zuo_o * zuo_o)) + - sqrtSH * ((m_ls_.rue_i[kl] * m_ls_.ruo_i[kl] + - m_ls_.zue_i[kl] * m_ls_.zuo_i[kl]) + - (rue_o * ruo_o + zue_o * zuo_o)); - - // g_{\zeta,\zeta} reduces to R^2 in the 2D case, so compute this always - gvv[iHalf] = 0.5 * (m_ls_.r1e_i[kl] * m_ls_.r1e_i[kl] + r1e_o * r1e_o + - sF_i * m_ls_.r1o_i[kl] * m_ls_.r1o_i[kl] + - sF_o * r1o_o * r1o_o) + - sqrtSH * (m_ls_.r1e_i[kl] * m_ls_.r1o_i[kl] + r1e_o * r1o_o); - - if (s_.lthreed) { - double rve_o = rv_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double rvo_o = rv_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double zve_o = zv_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double zvo_o = zv_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - - // g_{\theta,\zeta} is only needed for the 3D case - guv[iHalf] = 0.5 * ((m_ls_.rue_i[kl] * m_ls_.rve_i[kl] + - m_ls_.zue_i[kl] * m_ls_.zve_i[kl]) + - (rue_o * rve_o + zue_o * zve_o) + - sF_i * (m_ls_.ruo_i[kl] * m_ls_.rvo_i[kl] + - m_ls_.zuo_i[kl] * m_ls_.zvo_i[kl]) + - sF_o * (ruo_o * rvo_o + zuo_o * zvo_o) + - sqrtSH * ((m_ls_.rue_i[kl] * m_ls_.rvo_i[kl] + - m_ls_.zue_i[kl] * m_ls_.zvo_i[kl]) + - (rue_o * rvo_o + zue_o * zvo_o) + - (m_ls_.rve_i[kl] * m_ls_.ruo_i[kl] + - m_ls_.zve_i[kl] * m_ls_.zuo_i[kl]) + - (rve_o * ruo_o + zve_o * zuo_o))); - - // compute remaining contribution for 3D to g_{\zeta,\zeta} - gvv[iHalf] += 0.5 * ((m_ls_.rve_i[kl] * m_ls_.rve_i[kl] + - m_ls_.zve_i[kl] * m_ls_.zve_i[kl]) + - (rve_o * rve_o + zve_o * zve_o) + - sF_i * (m_ls_.rvo_i[kl] * m_ls_.rvo_i[kl] + - m_ls_.zvo_i[kl] * m_ls_.zvo_i[kl]) + - sF_o * (rvo_o * rvo_o + zvo_o * zvo_o)) + - sqrtSH * ((m_ls_.rve_i[kl] * m_ls_.rvo_i[kl] + - m_ls_.zve_i[kl] * m_ls_.zvo_i[kl]) + - (rve_o * rvo_o + zve_o * zvo_o)); - - // hand over to next iteration of radial loop - // --> what was outside in this loop iteration will be inside for next - // half-grid location - m_ls_.rve_i[kl] = rve_o; - m_ls_.rvo_i[kl] = rvo_o; - m_ls_.zve_i[kl] = zve_o; - m_ls_.zvo_i[kl] = zvo_o; - } - - // hand over to next iteration of radial loop - // --> what was outside in this loop iteration will be inside for next - // half-grid location - m_ls_.r1e_i[kl] = r1e_o; - m_ls_.r1o_i[kl] = r1o_o; - m_ls_.rue_i[kl] = rue_o; - m_ls_.ruo_i[kl] = ruo_o; - m_ls_.zue_i[kl] = zue_o; - m_ls_.zuo_i[kl] = zuo_o; - } // kl - - // hand over to next iteration of radial loop - // --> what was outside in this loop iteration will be inside for next - // half-grid location - sF_i = sF_o; - } // jH + // gsqrt = tau * r12, and the metric elements guu, guv, gvv. Arithmetic in the + // shared, allocation-free kernel (metric_kernel.h), used by both the solver + // and the Enzyme autodiff path. + ComputeMetricElements(r1_e.data(), r1_o.data(), ru_e.data(), ru_o.data(), + zu_e.data(), zu_o.data(), rv_e.data(), rv_o.data(), + zv_e.data(), zv_o.data(), tau.data(), r12.data(), + m_p_.sqrtSF.data(), m_p_.sqrtSH.data(), s_.lthreed, + s_.nZnT, r_.nsMinF1, r_.nsMinH, r_.nsMaxH, gsqrt.data(), + guu.data(), guv.data(), gvv.data()); } /** @@ -1453,88 +1367,42 @@ void IdealMhdModel::updateVolume() { * and apply toroidal current constraint, if enabled. */ void IdealMhdModel::computeBContra() { - // bsupu, bsupv - // chipH (, iotaH) - // chipF, iotaF - - int j0 = r_.nsMinH; - for (int kl = 0; kl < s_.nZnT; ++kl) { - // undo lambda normalization for first radial location - lu_e[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - lu_o[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - if (s_.lthreed) { - lv_e[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - lv_o[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - } - - // add phi' to d(lambda)/d(theta) for preparing B^v - lu_e[(j0 - r_.nsMinF1) * s_.nZnT + kl] += m_p_.phipF[j0 - r_.nsMinF1]; - - // contributions from full-grid surface _i_nside j-th half-grid surface - // starting values: jRel=0 - m_ls_.lue_i[kl] = lu_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.luo_i[kl] = lu_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - if (s_.lthreed) { - m_ls_.lve_i[kl] = lv_e[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - m_ls_.lvo_i[kl] = lv_o[(j0 - r_.nsMinF1) * s_.nZnT + kl]; - } - } // kl - - for (int jH = r_.nsMinH; jH < r_.nsMaxH; ++jH) { - // sqrt(s) on j-th half-grid pos - double sqrtSH = m_p_.sqrtSH[jH - r_.nsMinH]; - + // bsupu, bsupv; chipH (, iotaH); chipF, iotaF. + // + // First undo the lambda normalization and add phi' to dLambda/dTheta, exactly + // as before. The lambda arrays are consumed downstream in this normalized + // form, so this mutation stays in the solver; only the bsupu/bsupv arithmetic + // is factored into the shared kernel (bcontra_kernel.h). + { + const int j0 = r_.nsMinH; for (int kl = 0; kl < s_.nZnT; ++kl) { - int iHalf = (jH - r_.nsMinH) * s_.nZnT + kl; - - // undo lambda normalization for next full-grid radial location - lu_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - lu_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - if (s_.lthreed) { - lv_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - lv_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; - } - - // add phi' to d(lambda)/d(theta) for preparing B^v - lu_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] += - m_p_.phipF[jH + 1 - r_.nsMinH]; - - // contributions from full-grid surface _o_utside j-th half-grid surface - double lue_o = lu_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double luo_o = lu_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - double lve_o = 0.0; - double lvo_o = 0.0; + lu_e[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; + lu_o[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; if (s_.lthreed) { - lve_o = lv_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - lvo_o = lv_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl]; - - // first part for B^\theta - bsupu[iHalf] = - 0.5 * - ((m_ls_.lve_i[kl] + lve_o) + sqrtSH * (m_ls_.lvo_i[kl] + lvo_o)) / - gsqrt[iHalf]; - } else { - // will get a contribution from chip'/sqrt(g) below - bsupu[iHalf] = 0.0; + lv_e[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; + lv_o[(j0 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; } + lu_e[(j0 - r_.nsMinF1) * s_.nZnT + kl] += m_p_.phipF[j0 - r_.nsMinF1]; + } + for (int jH = r_.nsMinH; jH < r_.nsMaxH; ++jH) { + for (int kl = 0; kl < s_.nZnT; ++kl) { + lu_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; + lu_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; + if (s_.lthreed) { + lv_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; + lv_o[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] *= constants_.lamscale; + } + lu_e[(jH + 1 - r_.nsMinF1) * s_.nZnT + kl] += + m_p_.phipF[jH + 1 - r_.nsMinH]; + } // kl + } // jH + } - // first part for B^\zeta - bsupv[iHalf] = - 0.5 * - ((m_ls_.lue_i[kl] + lue_o) + sqrtSH * (m_ls_.luo_i[kl] + luo_o)) / - gsqrt[iHalf]; - - // hand over to next iteration of radial loop - // --> what was outside in this loop iteration will be inside for next - // half-grid location - m_ls_.lue_i[kl] = lue_o; - m_ls_.luo_i[kl] = luo_o; - if (s_.lthreed) { - m_ls_.lve_i[kl] = lve_o; - m_ls_.lvo_i[kl] = lvo_o; - } - } // kl - } // jH + // bsupu (3D part) and bsupv from the normalized lambda and gsqrt. + ComputeBsupContra(lu_e.data(), lu_o.data(), lv_e.data(), lv_o.data(), + gsqrt.data(), m_p_.sqrtSH.data(), s_.lthreed, s_.nZnT, + r_.nsMinF1, r_.nsMinH, r_.nsMaxH, bsupu.data(), + bsupv.data()); if (ncurr == 1) { // constrained toroidal current profile @@ -1615,16 +1483,11 @@ void IdealMhdModel::computeBContra() { // Compute covariant magnetic field components. void IdealMhdModel::computeBCo() { - // bsubu = g * B^contra: index lowering via metric tensor - if (s_.lthreed) { - // 3D case: need all of guu, guv, gvv - bsubu = guu.cwiseProduct(bsupu) + guv.cwiseProduct(bsupv); - bsubv = guv.cwiseProduct(bsupu) + gvv.cwiseProduct(bsupv); - } else { - // 2D case: can ignore guv (not even allocated) - bsubu = guu.cwiseProduct(bsupu); - bsubv = gvv.cwiseProduct(bsupv); - } + // bsubu = g * B^contra (index lowering via the metric tensor). Shared, + // allocation-free kernel (bco_kernel.h) used by solver and autodiff. + ComputeBCo(guu.data(), guv.data(), gvv.data(), bsupu.data(), bsupv.data(), + s_.lthreed, static_cast(bsupu.size()), bsubu.data(), + bsubv.data()); } void IdealMhdModel::pressureAndEnergies() { @@ -1656,7 +1519,9 @@ void IdealMhdModel::pressureAndEnergies() { // Compute as a vectorized operation over all half-grid points // temporarily re-use `totalPressure` to store only magnetic pressure; kinetic // pressure presH will be added below - totalPressure = 0.5 * (bsupu.cwiseProduct(bsubu) + bsupv.cwiseProduct(bsubv)); + ComputeMagneticPressure(bsupu.data(), bsubu.data(), bsupv.data(), + bsubv.data(), static_cast(bsupu.size()), + totalPressure.data()); // Accumulate magnetic energy and add kinetic pressure per surface double localMagneticEnergy = 0.0; @@ -1768,121 +1633,16 @@ void IdealMhdModel::hybridLambdaForce() { #pragma omp barrier #endif // _OPENMP - // obtain first inside point - int j0 = r_.nsMinF; - double sqrtSHi = 0.0; - if (j0 > 0) { - sqrtSHi = m_p_.sqrtSH[j0 - 1 - r_.nsMinH]; - } - for (int kl = 0; kl < s_.nZnT; ++kl) { - if (j0 == 0) { - // defaults to 0: no contribution from half-grid point inside the axis - m_ls_.bsubu_i[kl] = 0.0; - m_ls_.bsubv_i[kl] = 0.0; - m_ls_.gvv_gsqrt_i[kl] = 0.0; // gvv / gsqrt - m_ls_.guv_bsupu_i[kl] = 0.0; // guv * bsupu - } else { - // for the j-th forces full-grid point, the (j-1)-th half-grid point is - // inside - int iHalf = (j0 - 1 - r_.nsMinH) * s_.nZnT + kl; - m_ls_.bsubu_i[kl] = bsubu[iHalf]; - m_ls_.bsubv_i[kl] = bsubv[iHalf]; - m_ls_.gvv_gsqrt_i[kl] = gvv[iHalf] / gsqrt[iHalf]; - if (s_.lthreed) { - m_ls_.guv_bsupu_i[kl] = guv[iHalf] * bsupu[iHalf]; - } - } - } // kl - - for (int jF = r_.nsMinF; jF < r_.nsMaxFIncludingLcfs; ++jF) { - double sqrtSHo = 0.0; - if (jF < r_.nsMaxH) { - sqrtSHo = m_p_.sqrtSH[jF - r_.nsMinH]; - } - - for (int kl = 0; kl < s_.nZnT; ++kl) { - // obtain next outside point - // defaults to 0: no contribution from half-grid point outside LCFS - double bsubv_o = 0.0; - // gvv / gsqrt - double gvv_gsqrt_o = 0.0; - // guv * bsupu - double guv_bsupu_o = 0.0; - if (jF < r_.nsMaxH) { - // for the j-th forces full-grid point, the j-th half-grid point is - // outside - int iHalf = (jF - r_.nsMinH) * s_.nZnT + kl; - bsubv_o = bsubv[iHalf]; - gvv_gsqrt_o = gvv[iHalf] / gsqrt[iHalf]; - if (s_.lthreed) { - guv_bsupu_o = guv[iHalf] * bsupu[iHalf]; - } - } - - // alternative way to interpolate bsubv onto the full-grid - double gvv_gsqrt_lu_e = 0.5 * (m_ls_.gvv_gsqrt_i[kl] + gvv_gsqrt_o) * - lu_e[(jF - r_.nsMinF1) * s_.nZnT + kl]; - double gvv_gsqrt_lu_o = - 0.5 * (m_ls_.gvv_gsqrt_i[kl] * sqrtSHi + gvv_gsqrt_o * sqrtSHo) * - lu_o[(jF - r_.nsMinF1) * s_.nZnT + kl]; - - double gvv_gsqrt_lu = gvv_gsqrt_lu_e + gvv_gsqrt_lu_o; - double bsubv_alternative = gvv_gsqrt_lu; - if (s_.lthreed) { - double guv_bsupu = 0.5 * (m_ls_.guv_bsupu_i[kl] + guv_bsupu_o); - bsubv_alternative += guv_bsupu; - } - - const double bsubv_average = 0.5 * (bsubv_o + m_ls_.bsubv_i[kl]); - - // blend together two ways of interpolating bsubv - double _blmn = - bsubv_average * (1.0 - m_p_.radialBlending[jF - r_.nsMinF1]) + - bsubv_alternative * m_p_.radialBlending[jF - r_.nsMinF1]; - - if (jF > 0) { - // TODO(jons): no lamscale and (-1) factor for axis lambda force? - // MINUS SIGN => HESSIAN DIAGONALS ARE POSITIVE - _blmn *= -constants_.lamscale; - } - - blmn_e[(jF - r_.nsMinF) * s_.nZnT + kl] = _blmn; - blmn_o[(jF - r_.nsMinF) * s_.nZnT + kl] = - _blmn * m_p_.sqrtSF[jF - r_.nsMinF1]; - - if (s_.lthreed) { - // obtain next outside point - // defaults to 0 for half-grid point outside LCFS - double bsubu_o = 0.0; - if (jF < r_.nsMaxH) { - bsubu_o = bsubu[(jF - r_.nsMinH) * s_.nZnT + kl]; - } - - double _clmn = 0.5 * (bsubu_o + m_ls_.bsubu_i[kl]); - - if (jF > 0) { - // TODO(jons): no lamscale and (-1) factor for axis lambda force? - // MINUS SIGN => HESSIAN DIAGONALS ARE POSITIVE - _clmn *= -constants_.lamscale; - } - - clmn_e[(jF - r_.nsMinF) * s_.nZnT + kl] = _clmn; - clmn_o[(jF - r_.nsMinF) * s_.nZnT + kl] = - _clmn * m_p_.sqrtSF[jF - r_.nsMinF1]; - - // shift to next point - m_ls_.bsubu_i[kl] = bsubu_o; - } // lthreed - - // shift to next point - m_ls_.bsubv_i[kl] = bsubv_o; - m_ls_.gvv_gsqrt_i[kl] = gvv_gsqrt_o; - if (s_.lthreed) { - m_ls_.guv_bsupu_i[kl] = guv_bsupu_o; - } - } // kl - sqrtSHi = sqrtSHo; - } // jF + // Lambda force on the full grid via the shared kernel + // (lambda_force_kernel.h), also used by the Enzyme autodiff path. + ComputeHybridLambdaForce( + bsubu.data(), bsubv.data(), gvv.data(), gsqrt.data(), guv.data(), + bsupu.data(), lu_e.data(), lu_o.data(), m_p_.sqrtSH.data(), + m_p_.sqrtSF.data(), m_p_.radialBlending.data(), constants_.lamscale, + s_.lthreed, s_.nZnT, r_.nsMinF, r_.nsMinF1, r_.nsMinH, r_.nsMaxH, + r_.nsMaxFIncludingLcfs, m_ls_.bsubu_i.data(), m_ls_.bsubv_i.data(), + m_ls_.gvv_gsqrt_i.data(), m_ls_.guv_bsupu_i.data(), blmn_e.data(), + blmn_o.data(), clmn_e.data(), clmn_o.data()); // } #ifdef _OPENMP @@ -1969,223 +1729,27 @@ void IdealMhdModel::computeMHDForces() { if (m_fc_.lfreeb) { jMaxRZ = std::min(r_.nsMaxF, m_fc_.ns); } - - // obtain first inside point - // stuff gets divided by sqrtSHi, so cannot be 0 - double sqrtSHi = 1.0; - if (r_.nsMinF > 0) { - // for the rel-0-th forces full-grid point, the rel-0-th half-grid point is - // inside - int j0 = r_.nsMinH; - for (int kl = 0; kl < s_.nZnT; ++kl) { - int iHalf = (j0 - r_.nsMinH) * s_.nZnT + kl; - m_ls_.P_i[kl] = r12[iHalf] * totalPressure[iHalf]; - m_ls_.rup_i[kl] = ru12[iHalf] * m_ls_.P_i[kl]; - m_ls_.zup_i[kl] = zu12[iHalf] * m_ls_.P_i[kl]; - m_ls_.rsp_i[kl] = rs[iHalf] * m_ls_.P_i[kl]; - m_ls_.zsp_i[kl] = zs[iHalf] * m_ls_.P_i[kl]; - m_ls_.taup_i[kl] = tau[iHalf] * totalPressure[iHalf]; - m_ls_.gbubu_i[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupu[iHalf]; - m_ls_.gbubv_i[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupv[iHalf]; - m_ls_.gbvbv_i[kl] = gsqrt[iHalf] * bsupv[iHalf] * bsupv[iHalf]; - } // kl - sqrtSHi = m_p_.sqrtSH[j0 - r_.nsMinH]; - } else { - // defaults to 0: no contribution from half-grid point inside the axis - m_ls_.P_i.setZero(); - m_ls_.rup_i.setZero(); - m_ls_.zup_i.setZero(); - m_ls_.rsp_i.setZero(); - m_ls_.zsp_i.setZero(); - m_ls_.taup_i.setZero(); - m_ls_.gbubu_i.setZero(); - m_ls_.gbubv_i.setZero(); - m_ls_.gbvbv_i.setZero(); - } - - // Persistent per-surface scratch (preallocated in ThreadLocalStorage): - // aliased here so every write below lands in existing storage. This keeps the - // force kernel allocation-free, which both avoids per-surface heap churn and - // lets Enzyme differentiate it (Enzyme cannot trace dynamic Eigen - // temporaries). - Eigen::VectorXd& P_o = m_ls_.P_o; // r12 * totalPressure = P - Eigen::VectorXd& rup_o = m_ls_.rup_o; // ru12 * P - Eigen::VectorXd& zup_o = m_ls_.zup_o; // zu12 * P - Eigen::VectorXd& rsp_o = m_ls_.rsp_o; // rs * P - Eigen::VectorXd& zsp_o = m_ls_.zsp_o; // zs * P - Eigen::VectorXd& taup_o = m_ls_.taup_o; // tau * P - Eigen::VectorXd& gbubu_o = m_ls_.gbubu_o; // gsqrt * bsupu * bsupu - Eigen::VectorXd& gbubv_o = m_ls_.gbubv_o; // gsqrt * bsupu * bsupv - Eigen::VectorXd& gbvbv_o = m_ls_.gbvbv_o; // gsqrt * bsupv * bsupv - P_o.setZero(); - rup_o.setZero(); - zup_o.setZero(); - rsp_o.setZero(); - zsp_o.setZero(); - taup_o.setZero(); - gbubu_o.setZero(); - gbubv_o.setZero(); - gbvbv_o.setZero(); - - // Surface-average scratch, likewise aliased to preallocated storage. - Eigen::VectorXd& P_avg = m_ls_.P_avg; - Eigen::VectorXd& P_wavg = m_ls_.P_wavg; - Eigen::VectorXd& gbubu_avg = m_ls_.gbubu_avg; - Eigen::VectorXd& gbubu_wavg = m_ls_.gbubu_wavg; - Eigen::VectorXd& gbvbv_avg = m_ls_.gbvbv_avg; - Eigen::VectorXd& gbvbv_wavg = m_ls_.gbvbv_wavg; - Eigen::VectorXd& gbubv_avg = m_ls_.gbubv_avg; - Eigen::VectorXd& gbubv_wavg = m_ls_.gbubv_wavg; - - for (int jF = r_.nsMinF; jF < jMaxRZ; ++jF) { - const double sFull = - m_p_.sqrtSF[jF - r_.nsMinF1] * m_p_.sqrtSF[jF - r_.nsMinF1]; - // stuff gets divided by sqrtSHo, so cannot be 0 - double sqrtSHo = 1.0; - if (jF < r_.nsMaxH) { - sqrtSHo = m_p_.sqrtSH[jF - r_.nsMinH]; - } - - if (jF < r_.nsMaxH) { - const int iHalf_base = (jF - r_.nsMinH) * s_.nZnT; - for (int kl = 0; kl < s_.nZnT; ++kl) { - // obtain next outside point - // defaults to 0: no contribution from half-grid point outside LCFS - int iHalf = iHalf_base + kl; - P_o[kl] = r12[iHalf] * totalPressure[iHalf]; - rup_o[kl] = ru12[iHalf] * P_o[kl]; - zup_o[kl] = zu12[iHalf] * P_o[kl]; - rsp_o[kl] = rs[iHalf] * P_o[kl]; - zsp_o[kl] = zs[iHalf] * P_o[kl]; - taup_o[kl] = tau[iHalf] * totalPressure[iHalf]; - } // kl - - for (int kl = 0; kl < s_.nZnT; ++kl) { - // obtain next outside point - // defaults to 0: no contribution from half-grid point outside LCFS - int iHalf = iHalf_base + kl; - gbubu_o[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupu[iHalf]; - gbubv_o[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupv[iHalf]; - gbvbv_o[kl] = gsqrt[iHalf] * bsupv[iHalf] * bsupv[iHalf]; - } // kl - } else { - P_o.setZero(); - rup_o.setZero(); - zup_o.setZero(); - rsp_o.setZero(); - zsp_o.setZero(); - taup_o.setZero(); - gbubu_o.setZero(); - gbubv_o.setZero(); - gbvbv_o.setZero(); - } - - // Segment views into geometry and force arrays for this surface - const int nZnT = s_.nZnT; - const int g_off = (jF - r_.nsMinF1) * nZnT; - const int f_off = (jF - r_.nsMinF) * nZnT; - const auto r1e = r1_e.segment(g_off, nZnT); - const auto r1o = r1_o.segment(g_off, nZnT); - const auto rue = ru_e.segment(g_off, nZnT); - const auto ruo = ru_o.segment(g_off, nZnT); - const auto zue = zu_e.segment(g_off, nZnT); - const auto zuo = zu_o.segment(g_off, nZnT); - const auto z1o = z1_o.segment(g_off, nZnT); - - // Pre-compute common sub-expressions (averages and weighted averages) - const double invDS = 1.0 / m_fc_.deltaS; - const double invSHo = 1.0 / sqrtSHo; - const double invSHi = 1.0 / sqrtSHi; - P_avg = 0.5 * (P_o + m_ls_.P_i); - P_wavg = 0.5 * (P_o * invSHo + m_ls_.P_i * invSHi); - - gbubu_avg = 0.5 * (gbubu_o + m_ls_.gbubu_i); - gbubu_wavg = 0.5 * (gbubu_o * sqrtSHo + m_ls_.gbubu_i * sqrtSHi); - gbvbv_avg = 0.5 * (gbvbv_o + m_ls_.gbvbv_i); - gbvbv_wavg = 0.5 * (gbvbv_o * sqrtSHo + m_ls_.gbvbv_i * sqrtSHi); - - // A_R force - armn_e.segment(f_off, nZnT) = - (zup_o - m_ls_.zup_i) * invDS + 0.5 * (taup_o + m_ls_.taup_i) - - gbvbv_avg.cwiseProduct(r1e) - gbvbv_wavg.cwiseProduct(r1o); - armn_o.segment(f_off, nZnT) = - (zup_o * sqrtSHo - m_ls_.zup_i * sqrtSHi) * invDS - - 0.5 * P_wavg.cwiseProduct(zue) - 0.5 * P_avg.cwiseProduct(zuo) + - 0.5 * (taup_o * sqrtSHo + m_ls_.taup_i * sqrtSHi) - - gbvbv_wavg.cwiseProduct(r1e) - gbvbv_avg.cwiseProduct(r1o) * sFull; - - // A_Z force - azmn_e.segment(f_off, nZnT) = -(rup_o - m_ls_.rup_i) * invDS; - azmn_o.segment(f_off, nZnT) = - -(rup_o * sqrtSHo - m_ls_.rup_i * sqrtSHi) * invDS + - 0.5 * P_wavg.cwiseProduct(rue) + 0.5 * P_avg.cwiseProduct(ruo); - - // B_R force - brmn_e.segment(f_off, nZnT) = - 0.5 * (zsp_o + m_ls_.zsp_i) + 0.5 * P_wavg.cwiseProduct(z1o) - - gbubu_avg.cwiseProduct(rue) - gbubu_wavg.cwiseProduct(ruo); - brmn_o.segment(f_off, nZnT) = - 0.5 * (zsp_o * sqrtSHo + m_ls_.zsp_i * sqrtSHi) + - 0.5 * P_avg.cwiseProduct(z1o) - gbubu_wavg.cwiseProduct(rue) - - gbubu_avg.cwiseProduct(ruo) * sFull; - - // B_Z force - bzmn_e.segment(f_off, nZnT) = - -0.5 * (rsp_o + m_ls_.rsp_i) - 0.5 * P_wavg.cwiseProduct(r1o) - - gbubu_avg.cwiseProduct(zue) - gbubu_wavg.cwiseProduct(zuo); - bzmn_o.segment(f_off, nZnT) = - -0.5 * (rsp_o * sqrtSHo + m_ls_.rsp_i * sqrtSHi) - - 0.5 * P_avg.cwiseProduct(r1o) - gbubu_wavg.cwiseProduct(zue) - - gbubu_avg.cwiseProduct(zuo) * sFull; - - if (s_.lthreed) { - gbubv_avg = 0.5 * (gbubv_o + m_ls_.gbubv_i); - gbubv_wavg = 0.5 * (gbubv_o * sqrtSHo + m_ls_.gbubv_i * sqrtSHi); - const auto rve = rv_e.segment(g_off, nZnT); - const auto rvo = rv_o.segment(g_off, nZnT); - const auto zve = zv_e.segment(g_off, nZnT); - const auto zvo = zv_o.segment(g_off, nZnT); - - // 3D contributions to B_R and B_Z - brmn_e.segment(f_off, nZnT) -= - gbubv_avg.cwiseProduct(rve) + gbubv_wavg.cwiseProduct(rvo); - brmn_o.segment(f_off, nZnT) -= - gbubv_wavg.cwiseProduct(rve) + gbubv_avg.cwiseProduct(rvo) * sFull; - bzmn_e.segment(f_off, nZnT) -= - gbubv_avg.cwiseProduct(zve) + gbubv_wavg.cwiseProduct(zvo); - bzmn_o.segment(f_off, nZnT) -= - gbubv_wavg.cwiseProduct(zve) + gbubv_avg.cwiseProduct(zvo) * sFull; - - // C_R force - crmn_e.segment(f_off, nZnT) = - gbubv_avg.cwiseProduct(rue) + gbubv_wavg.cwiseProduct(ruo) + - gbvbv_avg.cwiseProduct(rve) + gbvbv_wavg.cwiseProduct(rvo); - crmn_o.segment(f_off, nZnT) = - gbubv_wavg.cwiseProduct(rue) + gbubv_avg.cwiseProduct(ruo) * sFull + - gbvbv_wavg.cwiseProduct(rve) + gbvbv_avg.cwiseProduct(rvo) * sFull; - - // C_Z force - czmn_e.segment(f_off, nZnT) = - gbubv_avg.cwiseProduct(zue) + gbubv_wavg.cwiseProduct(zuo) + - gbvbv_avg.cwiseProduct(zve) + gbvbv_wavg.cwiseProduct(zvo); - czmn_o.segment(f_off, nZnT) = - gbubv_wavg.cwiseProduct(zue) + gbubv_avg.cwiseProduct(zuo) * sFull + - gbvbv_wavg.cwiseProduct(zve) + gbvbv_avg.cwiseProduct(zvo) * sFull; - } // lthreed - - // shift to next point - m_ls_.P_i = P_o; - m_ls_.rup_i = rup_o; - m_ls_.zup_i = zup_o; - m_ls_.rsp_i = rsp_o; - m_ls_.zsp_i = zsp_o; - m_ls_.taup_i = taup_o; - m_ls_.gbubu_i = gbubu_o; - m_ls_.gbubv_i = gbubv_o; - m_ls_.gbvbv_i = gbvbv_o; - - sqrtSHi = sqrtSHo; - } // jF + // Real-space MHD force-density assembly in the shared, allocation-free kernel + // (mhdforce_kernel.h), used by both the solver and the Enzyme autodiff path. + ComputeMHDForceDensity( + r1_e.data(), r1_o.data(), ru_e.data(), ru_o.data(), zu_e.data(), + zu_o.data(), z1_o.data(), rv_e.data(), rv_o.data(), zv_e.data(), + zv_o.data(), r12.data(), ru12.data(), zu12.data(), rs.data(), zs.data(), + tau.data(), totalPressure.data(), gsqrt.data(), bsupu.data(), + bsupv.data(), m_p_.sqrtSF.data(), m_p_.sqrtSH.data(), m_ls_.P_i.data(), + m_ls_.rup_i.data(), m_ls_.zup_i.data(), m_ls_.rsp_i.data(), + m_ls_.zsp_i.data(), m_ls_.taup_i.data(), m_ls_.gbubu_i.data(), + m_ls_.gbubv_i.data(), m_ls_.gbvbv_i.data(), m_ls_.P_o.data(), + m_ls_.rup_o.data(), m_ls_.zup_o.data(), m_ls_.rsp_o.data(), + m_ls_.zsp_o.data(), m_ls_.taup_o.data(), m_ls_.gbubu_o.data(), + m_ls_.gbubv_o.data(), m_ls_.gbvbv_o.data(), m_ls_.P_avg.data(), + m_ls_.P_wavg.data(), m_ls_.gbubu_avg.data(), m_ls_.gbubu_wavg.data(), + m_ls_.gbvbv_avg.data(), m_ls_.gbvbv_wavg.data(), m_ls_.gbubv_avg.data(), + m_ls_.gbubv_wavg.data(), m_fc_.deltaS, s_.nZnT, r_.nsMinF, r_.nsMinF1, + r_.nsMinH, r_.nsMaxH, jMaxRZ, s_.lthreed, armn_e.data(), armn_o.data(), + azmn_e.data(), azmn_o.data(), brmn_e.data(), brmn_o.data(), bzmn_e.data(), + bzmn_o.data(), crmn_e.data(), crmn_o.data(), czmn_e.data(), + czmn_o.data()); } bool IdealMhdModel::shouldUpdateRadialPreconditioner(int iter1, @@ -2505,21 +2069,12 @@ absl::Status IdealMhdModel::constraintForceMultiplier() { } void IdealMhdModel::effectiveConstraintForce() { - // gConEff - - // no constraint on axis --> has no poloidal angle - int jMin = 0; - if (r_.nsMinF == 0) { - jMin = 1; - } - - for (int jF = std::max(jMin, r_.nsMinF); jF < r_.nsMaxFIncludingLcfs; ++jF) { - for (int kl = 0; kl < s_.nZnT; ++kl) { - int idx_kl = (jF - r_.nsMinF) * s_.nZnT + kl; - gConEff[idx_kl] = (rCon[idx_kl] - rCon0[idx_kl]) * ruFull[idx_kl] + - (zCon[idx_kl] - zCon0[idx_kl]) * zuFull[idx_kl]; - } // kl - } // jF + // gConEff via the shared kernel (constraint_force_kernel.h), also used by the + // Enzyme autodiff path. + ComputeEffectiveConstraintForce(rCon.data(), rCon0.data(), zCon.data(), + zCon0.data(), ruFull.data(), zuFull.data(), + s_.nZnT, r_.nsMinF, r_.nsMaxFIncludingLcfs, + gConEff.data()); } // perform Fourier-space bandpass filtering of constraint force @@ -2550,24 +2105,15 @@ void IdealMhdModel::assembleTotalForces() { } } - for (int jF = r_.nsMinF; jF < r_.nsMaxF; ++jF) { - for (int kl = 0; kl < s_.nZnT; ++kl) { - int idx_kl = (jF - r_.nsMinF) * s_.nZnT + kl; - - double brcon = (rCon[idx_kl] - rCon0[idx_kl]) * gCon[idx_kl]; - double bzcon = (zCon[idx_kl] - zCon0[idx_kl]) * gCon[idx_kl]; - - brmn_e[idx_kl] += brcon; - bzmn_e[idx_kl] += bzcon; - brmn_o[idx_kl] += brcon * m_p_.sqrtSF[jF - r_.nsMinF1]; - bzmn_o[idx_kl] += bzcon * m_p_.sqrtSF[jF - r_.nsMinF1]; - - frcon_e[idx_kl] = ruFull[idx_kl] * gCon[idx_kl]; - fzcon_e[idx_kl] = zuFull[idx_kl] * gCon[idx_kl]; - frcon_o[idx_kl] = frcon_e[idx_kl] * m_p_.sqrtSF[jF - r_.nsMinF1]; - fzcon_o[idx_kl] = fzcon_e[idx_kl] * m_p_.sqrtSF[jF - r_.nsMinF1]; - } - } + // add the bandpass-filtered constraint force to the MHD R/Z forces and write + // the constraint outputs via the shared kernel (constraint_force_kernel.h), + // also used by the Enzyme autodiff path. + AddConstraintForces(rCon.data(), rCon0.data(), zCon.data(), zCon0.data(), + ruFull.data(), zuFull.data(), gCon.data(), + m_p_.sqrtSF.data(), s_.nZnT, r_.nsMinF, r_.nsMinF1, + r_.nsMaxF, brmn_e.data(), brmn_o.data(), bzmn_e.data(), + bzmn_o.data(), frcon_e.data(), frcon_o.data(), + fzcon_e.data(), fzcon_o.data()); } void IdealMhdModel::forcesToFourier(FourierForces& m_physical_f) { diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h index b753e53f5..da3cf19fc 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h @@ -70,7 +70,8 @@ class IdealMhdModel { bool& m_need_restart, int& m_last_preconditioner_update, int& m_last_full_update_nestor, FlowControl& m_fc, const int iter1, const int iter2, const VmecCheckpoint& checkpoint = VmecCheckpoint::NONE, - const int iterations_before_checkpointing = INT_MAX, bool verbose = true); + const int iterations_before_checkpointing = INT_MAX, bool verbose = true, + bool always_fix_m1_gauge = false); // Coordinates which inverse-DFT routine to call for computing // the flux surface geometry and lambda on it from the provided Fourier diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/lambda_force_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/lambda_force_kernel.h new file mode 100644 index 000000000..105df3730 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/lambda_force_kernel.h @@ -0,0 +1,132 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_LAMBDA_FORCE_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_LAMBDA_FORCE_KERNEL_H_ + +namespace vmecpp { + +// Hybrid lambda force on the full grid: blmn (and clmn in 3D). The covariant +// field bsubv is interpolated from the half grid two ways (a plain average and +// an alternative from gvv/gsqrt times lambda plus, in 3D, guv*bsupu) and +// blended with the radialBlending profile. The radial sweep carries the inside +// half-grid point in scratch (bsubu_i, bsubv_i, gvv_gsqrt_i, guv_bsupu_i, each +// nZnT) and shifts it outward each surface. Allocation-free over flat buffers, +// shared between IdealMhdModel::hybridLambdaForce and the Enzyme autodiff path. +// +// Half-grid inputs (index (jH-nsMinH)*nZnT): bsubu, bsubv, gvv, gsqrt, guv, +// bsupu. Full-grid lambda (index (jF-nsMinF1)*nZnT): lu_e, lu_o. Profiles: +// sqrtSH (half), sqrtSF and radialBlending (full, index jF-nsMinF1). Outputs +// (index (jF-nsMinF)*nZnT): blmn_e/o, clmn_e/o. +inline void ComputeHybridLambdaForce( + const double* bsubu, const double* bsubv, const double* gvv, + const double* gsqrt, const double* guv, const double* bsupu, + const double* lu_e, const double* lu_o, const double* sqrtSH, + const double* sqrtSF, const double* radialBlending, double lamscale, + bool lthreed, int nZnT, int nsMinF, int nsMinF1, int nsMinH, int nsMaxH, + int nsMaxFIncludingLcfs, double* bsubu_i, double* bsubv_i, + double* gvv_gsqrt_i, double* guv_bsupu_i, double* blmn_e, double* blmn_o, + double* clmn_e, double* clmn_o) { + // first inside point + int j0 = nsMinF; + double sqrtSHi = 0.0; + if (j0 > 0) { + sqrtSHi = sqrtSH[j0 - 1 - nsMinH]; + } + for (int kl = 0; kl < nZnT; ++kl) { + if (j0 == 0) { + // no contribution from the half-grid point inside the axis + bsubu_i[kl] = 0.0; + bsubv_i[kl] = 0.0; + gvv_gsqrt_i[kl] = 0.0; + guv_bsupu_i[kl] = 0.0; + } else { + int iHalf = (j0 - 1 - nsMinH) * nZnT + kl; + bsubu_i[kl] = bsubu[iHalf]; + bsubv_i[kl] = bsubv[iHalf]; + gvv_gsqrt_i[kl] = gvv[iHalf] / gsqrt[iHalf]; + if (lthreed) { + guv_bsupu_i[kl] = guv[iHalf] * bsupu[iHalf]; + } + } + } // kl + + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + double sqrtSHo = 0.0; + if (jF < nsMaxH) { + sqrtSHo = sqrtSH[jF - nsMinH]; + } + + for (int kl = 0; kl < nZnT; ++kl) { + // next outside point (defaults to 0 outside the LCFS) + double bsubv_o = 0.0; + double gvv_gsqrt_o = 0.0; + double guv_bsupu_o = 0.0; + if (jF < nsMaxH) { + int iHalf = (jF - nsMinH) * nZnT + kl; + bsubv_o = bsubv[iHalf]; + gvv_gsqrt_o = gvv[iHalf] / gsqrt[iHalf]; + if (lthreed) { + guv_bsupu_o = guv[iHalf] * bsupu[iHalf]; + } + } + + double gvv_gsqrt_lu_e = 0.5 * (gvv_gsqrt_i[kl] + gvv_gsqrt_o) * + lu_e[(jF - nsMinF1) * nZnT + kl]; + double gvv_gsqrt_lu_o = + 0.5 * (gvv_gsqrt_i[kl] * sqrtSHi + gvv_gsqrt_o * sqrtSHo) * + lu_o[(jF - nsMinF1) * nZnT + kl]; + + double gvv_gsqrt_lu = gvv_gsqrt_lu_e + gvv_gsqrt_lu_o; + double bsubv_alternative = gvv_gsqrt_lu; + if (lthreed) { + double guv_bsupu = 0.5 * (guv_bsupu_i[kl] + guv_bsupu_o); + bsubv_alternative += guv_bsupu; + } + + const double bsubv_average = 0.5 * (bsubv_o + bsubv_i[kl]); + + // blend the two interpolations of bsubv + double _blmn = bsubv_average * (1.0 - radialBlending[jF - nsMinF1]) + + bsubv_alternative * radialBlending[jF - nsMinF1]; + + if (jF > 0) { + // MINUS SIGN => HESSIAN DIAGONALS ARE POSITIVE + _blmn *= -lamscale; + } + + blmn_e[(jF - nsMinF) * nZnT + kl] = _blmn; + blmn_o[(jF - nsMinF) * nZnT + kl] = _blmn * sqrtSF[jF - nsMinF1]; + + if (lthreed) { + double bsubu_o = 0.0; + if (jF < nsMaxH) { + bsubu_o = bsubu[(jF - nsMinH) * nZnT + kl]; + } + + double _clmn = 0.5 * (bsubu_o + bsubu_i[kl]); + + if (jF > 0) { + _clmn *= -lamscale; + } + + clmn_e[(jF - nsMinF) * nZnT + kl] = _clmn; + clmn_o[(jF - nsMinF) * nZnT + kl] = _clmn * sqrtSF[jF - nsMinF1]; + + bsubu_i[kl] = bsubu_o; + } // lthreed + + bsubv_i[kl] = bsubv_o; + gvv_gsqrt_i[kl] = gvv_gsqrt_o; + if (lthreed) { + guv_bsupu_i[kl] = guv_bsupu_o; + } + } // kl + sqrtSHi = sqrtSHo; + } // jF +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_LAMBDA_FORCE_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/metric_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/metric_kernel.h new file mode 100644 index 000000000..d014ec606 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/metric_kernel.h @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_METRIC_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_METRIC_KERNEL_H_ + +namespace vmecpp { + +// Half-grid metric kernel: gsqrt = tau * r12 and the metric elements guu, guv, +// gvv from the full-grid geometry (and the Jacobian tau, r12 from +// ComputeHalfGridJacobian). guv and the 3D part of gvv are computed only when +// lthreed. Shared, allocation-free over flat buffers, between +// IdealMhdModel::computeMetricElements and the Enzyme autodiff path. Same +// indexing conventions as jacobian_kernel.h. sqrtSF is indexed jF - nsMinF1. +inline void ComputeMetricElements( + const double* __restrict r1e, const double* __restrict r1o, + const double* __restrict rue, const double* __restrict ruo, + const double* __restrict zue, const double* __restrict zuo, + const double* __restrict rve, const double* __restrict rvo, + const double* __restrict zve, const double* __restrict zvo, + const double* __restrict tau, const double* __restrict r12, + const double* __restrict sqrtSF, const double* __restrict sqrtSH, + bool lthreed, int nZnT, int nsMinF1, int nsMinH, int nsMaxH, + double* __restrict gsqrt, double* __restrict guu, double* __restrict guv, + double* __restrict gvv) { + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + const double sF_i = sqrtSF[jH - nsMinF1] * sqrtSF[jH - nsMinF1]; + const double sF_o = sqrtSF[jH + 1 - nsMinF1] * sqrtSF[jH + 1 - nsMinF1]; + const double sH = sqrtSH[jH - nsMinH]; + for (int kl = 0; kl < nZnT; ++kl) { + const int i_in = (jH - nsMinF1) * nZnT + kl; + const int i_out = (jH + 1 - nsMinF1) * nZnT + kl; + const int ih = (jH - nsMinH) * nZnT + kl; + + const double r1e_i = r1e[i_in], r1e_o = r1e[i_out]; + const double r1o_i = r1o[i_in], r1o_o = r1o[i_out]; + const double rue_i = rue[i_in], rue_o = rue[i_out]; + const double ruo_i = ruo[i_in], ruo_o = ruo[i_out]; + const double zue_i = zue[i_in], zue_o = zue[i_out]; + const double zuo_i = zuo[i_in], zuo_o = zuo[i_out]; + + gsqrt[ih] = tau[ih] * r12[ih]; + + guu[ih] = 0.5 * ((rue_i * rue_i + zue_i * zue_i) + + (rue_o * rue_o + zue_o * zue_o) + + sF_i * (ruo_i * ruo_i + zuo_i * zuo_i) + + sF_o * (ruo_o * ruo_o + zuo_o * zuo_o)) + + sH * ((rue_i * ruo_i + zue_i * zuo_i) + + (rue_o * ruo_o + zue_o * zuo_o)); + + gvv[ih] = 0.5 * (r1e_i * r1e_i + r1e_o * r1e_o + sF_i * r1o_i * r1o_i + + sF_o * r1o_o * r1o_o) + + sH * (r1e_i * r1o_i + r1e_o * r1o_o); + + if (lthreed) { + const double rve_i = rve[i_in], rve_o = rve[i_out]; + const double rvo_i = rvo[i_in], rvo_o = rvo[i_out]; + const double zve_i = zve[i_in], zve_o = zve[i_out]; + const double zvo_i = zvo[i_in], zvo_o = zvo[i_out]; + + guv[ih] = 0.5 * ((rue_i * rve_i + zue_i * zve_i) + + (rue_o * rve_o + zue_o * zve_o) + + sF_i * (ruo_i * rvo_i + zuo_i * zvo_i) + + sF_o * (ruo_o * rvo_o + zuo_o * zvo_o) + + sH * ((rue_i * rvo_i + zue_i * zvo_i) + + (rue_o * rvo_o + zue_o * zvo_o) + + (rve_i * ruo_i + zve_i * zuo_i) + + (rve_o * ruo_o + zve_o * zuo_o))); + + gvv[ih] += 0.5 * ((rve_i * rve_i + zve_i * zve_i) + + (rve_o * rve_o + zve_o * zve_o) + + sF_i * (rvo_i * rvo_i + zvo_i * zvo_i) + + sF_o * (rvo_o * rvo_o + zvo_o * zvo_o)) + + sH * ((rve_i * rvo_i + zve_i * zvo_i) + + (rve_o * rvo_o + zve_o * zvo_o)); + } + } + } +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_METRIC_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/mhdforce_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/mhdforce_kernel.h new file mode 100644 index 000000000..95b447a56 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/mhdforce_kernel.h @@ -0,0 +1,234 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_MHDFORCE_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_MHDFORCE_KERNEL_H_ + +#include + +namespace vmecpp { + +// Real-space MHD force-density assembly (armn/azmn/brmn/bzmn and, in 3D, +// crmn/czmn, even+odd parity) from the half-grid pressure, Jacobian, metric and +// contravariant field. This is the sixth and last force-chain kernel; together +// with the Jacobian/metric/B^contra/B_cov/pressure kernels it forms the local +// map geometry -> force density whose Jacobian (composed with the linear +// spectral transforms) is the exact MHD force Hessian. +// +// Shared between IdealMhdModel::computeMHDForces and the Enzyme autodiff path. +// The Eigen arithmetic is preserved verbatim from the solver; only storage is +// flat buffers (Eigen::Map), so it is allocation-free and the result is +// bit-for-bit identical. The half-grid "inside/outside" handover scratch +// (X_i/X_o) and the surface averages (X_avg/X_wavg) are caller-owned buffers of +// length nZnT, reused across surfaces. +inline void ComputeMHDForceDensity( + // full-grid geometry, indexed (jF - nsMinF1) * nZnT + kl + const double* r1_e, const double* r1_o, const double* ru_e, + const double* ru_o, const double* zu_e, const double* zu_o, + const double* z1_o, const double* rv_e, const double* rv_o, + const double* zv_e, const double* zv_o, + // half-grid quantities, indexed (jH - nsMinH) * nZnT + kl + const double* r12, const double* ru12, const double* zu12, const double* rs, + const double* zs, const double* tau, const double* totalPressure, + const double* gsqrt, const double* bsupu, const double* bsupv, + // profiles + const double* sqrtSF, const double* sqrtSH, + // inside-handover scratch (length nZnT) + double* P_i, double* rup_i, double* zup_i, double* rsp_i, double* zsp_i, + double* taup_i, double* gbubu_i, double* gbubv_i, double* gbvbv_i, + // outside + average scratch (length nZnT) + double* P_o, double* rup_o, double* zup_o, double* rsp_o, double* zsp_o, + double* taup_o, double* gbubu_o, double* gbubv_o, double* gbvbv_o, + double* P_avg, double* P_wavg, double* gbubu_avg, double* gbubu_wavg, + double* gbvbv_avg, double* gbvbv_wavg, double* gbubv_avg, + double* gbubv_wavg, + // sizes / flags + double deltaS, int nZnT, int nsMinF, int nsMinF1, int nsMinH, int nsMaxH, + int jMaxRZ, bool lthreed, + // outputs, indexed (jF - nsMinF) * nZnT + kl + double* armn_e, double* armn_o, double* azmn_e, double* azmn_o, + double* brmn_e, double* brmn_o, double* bzmn_e, double* bzmn_o, + double* crmn_e, double* crmn_o, double* czmn_e, double* czmn_o) { + using V = Eigen::VectorXd; + using Map = Eigen::Map; + using CMap = Eigen::Map; + + Map vP_i(P_i, nZnT), vrup_i(rup_i, nZnT), vzup_i(zup_i, nZnT); + Map vrsp_i(rsp_i, nZnT), vzsp_i(zsp_i, nZnT), vtaup_i(taup_i, nZnT); + Map vgbubu_i(gbubu_i, nZnT), vgbubv_i(gbubv_i, nZnT), vgbvbv_i(gbvbv_i, nZnT); + Map vP_o(P_o, nZnT), vrup_o(rup_o, nZnT), vzup_o(zup_o, nZnT); + Map vrsp_o(rsp_o, nZnT), vzsp_o(zsp_o, nZnT), vtaup_o(taup_o, nZnT); + Map vgbubu_o(gbubu_o, nZnT), vgbubv_o(gbubv_o, nZnT), vgbvbv_o(gbvbv_o, nZnT); + Map vP_avg(P_avg, nZnT), vP_wavg(P_wavg, nZnT); + Map vgbubu_avg(gbubu_avg, nZnT), vgbubu_wavg(gbubu_wavg, nZnT); + Map vgbvbv_avg(gbvbv_avg, nZnT), vgbvbv_wavg(gbvbv_wavg, nZnT); + Map vgbubv_avg(gbubv_avg, nZnT), vgbubv_wavg(gbubv_wavg, nZnT); + + double sqrtSHi = 1.0; + if (nsMinF > 0) { + const int j0 = nsMinH; + for (int kl = 0; kl < nZnT; ++kl) { + const int iHalf = (j0 - nsMinH) * nZnT + kl; + P_i[kl] = r12[iHalf] * totalPressure[iHalf]; + rup_i[kl] = ru12[iHalf] * P_i[kl]; + zup_i[kl] = zu12[iHalf] * P_i[kl]; + rsp_i[kl] = rs[iHalf] * P_i[kl]; + zsp_i[kl] = zs[iHalf] * P_i[kl]; + taup_i[kl] = tau[iHalf] * totalPressure[iHalf]; + gbubu_i[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupu[iHalf]; + gbubv_i[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupv[iHalf]; + gbvbv_i[kl] = gsqrt[iHalf] * bsupv[iHalf] * bsupv[iHalf]; + } + sqrtSHi = sqrtSH[j0 - nsMinH]; + } else { + vP_i.setZero(); + vrup_i.setZero(); + vzup_i.setZero(); + vrsp_i.setZero(); + vzsp_i.setZero(); + vtaup_i.setZero(); + vgbubu_i.setZero(); + vgbubv_i.setZero(); + vgbvbv_i.setZero(); + } + + vP_o.setZero(); + vrup_o.setZero(); + vzup_o.setZero(); + vrsp_o.setZero(); + vzsp_o.setZero(); + vtaup_o.setZero(); + vgbubu_o.setZero(); + vgbubv_o.setZero(); + vgbvbv_o.setZero(); + + for (int jF = nsMinF; jF < jMaxRZ; ++jF) { + const double sFull = sqrtSF[jF - nsMinF1] * sqrtSF[jF - nsMinF1]; + double sqrtSHo = 1.0; + if (jF < nsMaxH) { + sqrtSHo = sqrtSH[jF - nsMinH]; + } + + if (jF < nsMaxH) { + const int iHalf_base = (jF - nsMinH) * nZnT; + for (int kl = 0; kl < nZnT; ++kl) { + const int iHalf = iHalf_base + kl; + P_o[kl] = r12[iHalf] * totalPressure[iHalf]; + rup_o[kl] = ru12[iHalf] * P_o[kl]; + zup_o[kl] = zu12[iHalf] * P_o[kl]; + rsp_o[kl] = rs[iHalf] * P_o[kl]; + zsp_o[kl] = zs[iHalf] * P_o[kl]; + taup_o[kl] = tau[iHalf] * totalPressure[iHalf]; + } + for (int kl = 0; kl < nZnT; ++kl) { + const int iHalf = iHalf_base + kl; + gbubu_o[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupu[iHalf]; + gbubv_o[kl] = gsqrt[iHalf] * bsupu[iHalf] * bsupv[iHalf]; + gbvbv_o[kl] = gsqrt[iHalf] * bsupv[iHalf] * bsupv[iHalf]; + } + } else { + vP_o.setZero(); + vrup_o.setZero(); + vzup_o.setZero(); + vrsp_o.setZero(); + vzsp_o.setZero(); + vtaup_o.setZero(); + vgbubu_o.setZero(); + vgbubv_o.setZero(); + vgbvbv_o.setZero(); + } + + const int g_off = (jF - nsMinF1) * nZnT; + const int f_off = (jF - nsMinF) * nZnT; + const CMap r1e(r1_e + g_off, nZnT), r1o(r1_o + g_off, nZnT); + const CMap rue(ru_e + g_off, nZnT), ruo(ru_o + g_off, nZnT); + const CMap zue(zu_e + g_off, nZnT), zuo(zu_o + g_off, nZnT); + const CMap z1o(z1_o + g_off, nZnT); + + const double invDS = 1.0 / deltaS; + const double invSHo = 1.0 / sqrtSHo; + const double invSHi = 1.0 / sqrtSHi; + vP_avg = 0.5 * (vP_o + vP_i); + vP_wavg = 0.5 * (vP_o * invSHo + vP_i * invSHi); + vgbubu_avg = 0.5 * (vgbubu_o + vgbubu_i); + vgbubu_wavg = 0.5 * (vgbubu_o * sqrtSHo + vgbubu_i * sqrtSHi); + vgbvbv_avg = 0.5 * (vgbvbv_o + vgbvbv_i); + vgbvbv_wavg = 0.5 * (vgbvbv_o * sqrtSHo + vgbvbv_i * sqrtSHi); + + Map(armn_e + f_off, nZnT) = + (vzup_o - vzup_i) * invDS + 0.5 * (vtaup_o + vtaup_i) - + vgbvbv_avg.cwiseProduct(r1e) - vgbvbv_wavg.cwiseProduct(r1o); + Map(armn_o + f_off, nZnT) = + (vzup_o * sqrtSHo - vzup_i * sqrtSHi) * invDS - + 0.5 * vP_wavg.cwiseProduct(zue) - 0.5 * vP_avg.cwiseProduct(zuo) + + 0.5 * (vtaup_o * sqrtSHo + vtaup_i * sqrtSHi) - + vgbvbv_wavg.cwiseProduct(r1e) - vgbvbv_avg.cwiseProduct(r1o) * sFull; + + Map(azmn_e + f_off, nZnT) = -(vrup_o - vrup_i) * invDS; + Map(azmn_o + f_off, nZnT) = -(vrup_o * sqrtSHo - vrup_i * sqrtSHi) * invDS + + 0.5 * vP_wavg.cwiseProduct(rue) + + 0.5 * vP_avg.cwiseProduct(ruo); + + Map(brmn_e + f_off, nZnT) = + 0.5 * (vzsp_o + vzsp_i) + 0.5 * vP_wavg.cwiseProduct(z1o) - + vgbubu_avg.cwiseProduct(rue) - vgbubu_wavg.cwiseProduct(ruo); + Map(brmn_o + f_off, nZnT) = 0.5 * (vzsp_o * sqrtSHo + vzsp_i * sqrtSHi) + + 0.5 * vP_avg.cwiseProduct(z1o) - + vgbubu_wavg.cwiseProduct(rue) - + vgbubu_avg.cwiseProduct(ruo) * sFull; + + Map(bzmn_e + f_off, nZnT) = + -0.5 * (vrsp_o + vrsp_i) - 0.5 * vP_wavg.cwiseProduct(r1o) - + vgbubu_avg.cwiseProduct(zue) - vgbubu_wavg.cwiseProduct(zuo); + Map(bzmn_o + f_off, nZnT) = -0.5 * (vrsp_o * sqrtSHo + vrsp_i * sqrtSHi) - + 0.5 * vP_avg.cwiseProduct(r1o) - + vgbubu_wavg.cwiseProduct(zue) - + vgbubu_avg.cwiseProduct(zuo) * sFull; + + if (lthreed) { + vgbubv_avg = 0.5 * (vgbubv_o + vgbubv_i); + vgbubv_wavg = 0.5 * (vgbubv_o * sqrtSHo + vgbubv_i * sqrtSHi); + const CMap rve(rv_e + g_off, nZnT), rvo(rv_o + g_off, nZnT); + const CMap zve(zv_e + g_off, nZnT), zvo(zv_o + g_off, nZnT); + + Map(brmn_e + f_off, nZnT) -= + vgbubv_avg.cwiseProduct(rve) + vgbubv_wavg.cwiseProduct(rvo); + Map(brmn_o + f_off, nZnT) -= + vgbubv_wavg.cwiseProduct(rve) + vgbubv_avg.cwiseProduct(rvo) * sFull; + Map(bzmn_e + f_off, nZnT) -= + vgbubv_avg.cwiseProduct(zve) + vgbubv_wavg.cwiseProduct(zvo); + Map(bzmn_o + f_off, nZnT) -= + vgbubv_wavg.cwiseProduct(zve) + vgbubv_avg.cwiseProduct(zvo) * sFull; + + Map(crmn_e + f_off, nZnT) = + vgbubv_avg.cwiseProduct(rue) + vgbubv_wavg.cwiseProduct(ruo) + + vgbvbv_avg.cwiseProduct(rve) + vgbvbv_wavg.cwiseProduct(rvo); + Map(crmn_o + f_off, nZnT) = + vgbubv_wavg.cwiseProduct(rue) + vgbubv_avg.cwiseProduct(ruo) * sFull + + vgbvbv_wavg.cwiseProduct(rve) + vgbvbv_avg.cwiseProduct(rvo) * sFull; + + Map(czmn_e + f_off, nZnT) = + vgbubv_avg.cwiseProduct(zue) + vgbubv_wavg.cwiseProduct(zuo) + + vgbvbv_avg.cwiseProduct(zve) + vgbvbv_wavg.cwiseProduct(zvo); + Map(czmn_o + f_off, nZnT) = + vgbubv_wavg.cwiseProduct(zue) + vgbubv_avg.cwiseProduct(zuo) * sFull + + vgbvbv_wavg.cwiseProduct(zve) + vgbvbv_avg.cwiseProduct(zvo) * sFull; + } + + vP_i = vP_o; + vrup_i = vrup_o; + vzup_i = vzup_o; + vrsp_i = vrsp_o; + vzsp_i = vzsp_o; + vtaup_i = vtaup_o; + vgbubu_i = vgbubu_o; + vgbubv_i = vgbubv_o; + vgbvbv_i = vgbvbv_o; + sqrtSHi = sqrtSHo; + } +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_MHDFORCE_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/pressure_kernel.h b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/pressure_kernel.h new file mode 100644 index 000000000..45fdde850 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/ideal_mhd_model/pressure_kernel.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#ifndef VMECPP_VMEC_IDEAL_MHD_MODEL_PRESSURE_KERNEL_H_ +#define VMECPP_VMEC_IDEAL_MHD_MODEL_PRESSURE_KERNEL_H_ + +namespace vmecpp { + +// Magnetic pressure |B|^2/2 = 0.5 (B^u B_u + B^v B_v) at each half-grid point. +// This is the field-dependent (nonlinear) part of pressureAndEnergies; the +// kinetic pressure profile and the energy volume integrals stay in the solver. +// Shared, allocation-free over flat buffers (n = number of half-grid points), +// between IdealMhdModel::pressureAndEnergies and the Enzyme autodiff path. +inline void ComputeMagneticPressure(const double* bsupu, const double* bsubu, + const double* bsupv, const double* bsubv, + int n, double* total_pressure) { + for (int i = 0; i < n; ++i) { + total_pressure[i] = 0.5 * (bsupu[i] * bsubu[i] + bsupv[i] * bsubv[i]); + } +} + +} // namespace vmecpp + +#endif // VMECPP_VMEC_IDEAL_MHD_MODEL_PRESSURE_KERNEL_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/BUILD.bazel b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/BUILD.bazel index 951ca9324..6a6f895e1 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/BUILD.bazel +++ b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/BUILD.bazel @@ -20,6 +20,24 @@ cc_library( ], ) +cc_binary( + name = "output_quantities_bench", + srcs = ["output_quantities_bench.cc"], + data = [ + "//vmecpp/test_data:cma", + ], + deps = [ + ":output_quantities", + "@abseil-cpp//absl/status:statusor", + "@abseil-cpp//absl/strings:str_format", + "@google_benchmark//:benchmark_main", + "//util/file_io:file_io", + "//vmecpp/common/util:util", + "//vmecpp/common/vmec_indata:vmec_indata", + "//vmecpp/vmec/vmec:vmec", + ], +) + cc_test( name = "output_quantities_io_test", srcs = ["output_quantities_io_test.cc", "test_helpers.h"], diff --git a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.cc b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.cc index 23445edc4..c39f402e6 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.cc @@ -5168,7 +5168,12 @@ vmecpp::WOutFileContents vmecpp::ComputeWOutFileContents( void vmecpp::CompareWOut(const WOutFileContents& test_wout, const WOutFileContents& expected_wout, - double tolerance, bool check_equal_niter) { + double tolerance, bool check_equal_niter, + double current_density_tolerance) { + // jcuru, jcurv compare looser only if the caller opts in; otherwise + // tolerance. + const double current_tolerance = + current_density_tolerance > 0.0 ? current_density_tolerance : tolerance; CHECK_EQ(test_wout.signgs, expected_wout.signgs); CHECK_EQ(test_wout.gamma, expected_wout.gamma); CHECK_EQ(test_wout.pcurr_type, expected_wout.pcurr_type); @@ -5250,11 +5255,11 @@ void vmecpp::CompareWOut(const WOutFileContents& test_wout, IsCloseRelAbs(expected_wout.phipf[jF], test_wout.phipf[jF], tolerance)); CHECK( IsCloseRelAbs(expected_wout.chipf[jF], test_wout.chipf[jF], tolerance)); - CHECK( - IsCloseRelAbs(expected_wout.jcuru[jF], test_wout.jcuru[jF], tolerance)) + CHECK(IsCloseRelAbs(expected_wout.jcuru[jF], test_wout.jcuru[jF], + current_tolerance)) << "jF = " << jF; - CHECK( - IsCloseRelAbs(expected_wout.jcurv[jF], test_wout.jcurv[jF], tolerance)) + CHECK(IsCloseRelAbs(expected_wout.jcurv[jF], test_wout.jcurv[jF], + current_tolerance)) << "jF = " << jF; CHECK( IsCloseRelAbs(expected_wout.specw[jF], test_wout.specw[jF], tolerance)); diff --git a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.h b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.h index 456535bcc..bf3a0814b 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.h +++ b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities.h @@ -1521,10 +1521,15 @@ WOutFileContents ComputeWOutFileContents( // Compare the contents of a test wout object against a reference wout object, // exiting with an error in case of mismatches. // The comparison is performed using the specified tolerance in the "relabs" -// metric. +// metric. The current densities jcuru, jcurv are curl(B) quantities that +// amplify the rounding of the converged state; under vectorized/optimized +// builds they do not reproduce to the same tolerance as the profiles across +// machines. Pass current_density_tolerance > 0 to compare those two with a +// looser bound while keeping every other quantity at tolerance. void CompareWOut(const WOutFileContents& test_wout, const WOutFileContents& expected_wout, double tolerance, - bool check_equal_niter = true); + bool check_equal_niter = true, + double current_density_tolerance = 0.0); } // namespace vmecpp #endif // VMECPP_VMEC_OUTPUT_QUANTITIES_OUTPUT_QUANTITIES_H_ diff --git a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_bench.cc b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_bench.cc new file mode 100644 index 000000000..7b9ff8600 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_bench.cc @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT + +// Microbenchmark for ComputeOutputQuantities, the post-solve output +// computation. +// +// ComputeOutputQuantities() runs once after the equilibrium has converged and +// produces the entire wout contents, bsubs on both grids, jxbout, Mercier +// stability, and the other diagnostics. None of this feeds back into the +// force-balance loop, so it is pure post-processing overhead -- this benchmark +// answers "how much time do we spend after the actual solve has finished". +// +// Setup (untimed): load a small fixed-boundary case, run the solver to +// convergence via Vmec::run(). Timed loop: re-invoke ComputeOutputQuantities +// on the converged state. ComputeOutputQuantities takes all inputs by const +// reference and returns a fresh OutputQuantities by value, so repeated calls +// are idempotent. + +#include +#include +#include + +#include "absl/strings/str_format.h" +#include "benchmark/benchmark.h" +#include "util/file_io/file_io.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/output_quantities/output_quantities.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { +namespace { + +// Small fixed-boundary stellarator case; converges quickly during setup. +constexpr char kCase[] = "cma"; + +void BM_ComputeOutputQuantities(benchmark::State& state) { + // ---- Untimed setup: drive the solver to convergence. ---- + const std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", kCase); + absl::StatusOr indata_json = file_io::ReadFile(filename); + if (!indata_json.ok()) { + state.SkipWithError("failed to read input JSON"); + return; + } + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + if (!indata.ok()) { + state.SkipWithError("failed to parse INDATA"); + return; + } + + absl::StatusOr> maybe_vmec = Vmec::FromIndata(*indata); + if (!maybe_vmec.ok()) { + state.SkipWithError("Vmec::FromIndata failed"); + return; + } + Vmec& vmec = **maybe_vmec; + + absl::StatusOr ran = vmec.run(); + if (!ran.ok()) { + state.SkipWithError("vmec.run() failed"); + return; + } + + constexpr int kSignOfJacobian = -1; + + // ---- Timed loop: re-run only the post-solve output computation. ---- + for (auto _ : state) { + OutputQuantities output_quantities = ComputeOutputQuantities( + kSignOfJacobian, vmec.indata_, vmec.s_, vmec.fc_, vmec.constants_, + vmec.t_, vmec.h_, vmec.mgrid_.mgrid_mode, vmec.r_, vmec.decomposed_x_, + vmec.m_, vmec.p_, VmecCheckpoint::NONE, + static_cast(vmec.get_ivac()), vmec.get_status(), + vmec.get_iter2()); + benchmark::DoNotOptimize(output_quantities.wout.volume); + benchmark::ClobberMemory(); + } + state.SetLabel(kCase); +} + +BENCHMARK(BM_ComputeOutputQuantities)->Name("ComputeOutputQuantities/cma"); + +} // namespace +} // namespace vmecpp + +BENCHMARK_MAIN(); diff --git a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_test.cc b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_test.cc index e696b52e4..44ecb7f86 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_test.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/output_quantities/output_quantities_test.cc @@ -88,15 +88,15 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { int ncid; ASSERT_EQ(nc_open(filename.c_str(), NC_NOWRITE, &ncid), NC_NOERR); - EXPECT_EQ(wout.signgs, NetcdfReadInt(ncid, "signgs")); + EXPECT_EQ(wout.signgs, NetcdfReadInt(ncid, "signgs").value()); - EXPECT_EQ(wout.gamma, NetcdfReadDouble(ncid, "gamma")); + EXPECT_EQ(wout.gamma, NetcdfReadDouble(ncid, "gamma").value()); - EXPECT_EQ(wout.pcurr_type, NetcdfReadString(ncid, "pcurr_type")); - EXPECT_EQ(wout.pmass_type, NetcdfReadString(ncid, "pmass_type")); - EXPECT_EQ(wout.piota_type, NetcdfReadString(ncid, "piota_type")); + EXPECT_EQ(wout.pcurr_type, NetcdfReadString(ncid, "pcurr_type").value()); + EXPECT_EQ(wout.pmass_type, NetcdfReadString(ncid, "pmass_type").value()); + EXPECT_EQ(wout.piota_type, NetcdfReadString(ncid, "piota_type").value()); - std::vector reference_am = NetcdfReadArray1D(ncid, "am"); + std::vector reference_am = NetcdfReadArray1D(ncid, "am").value(); // remove zero-padding at end reference_am.resize(wout.am.size()); EXPECT_THAT(wout.am, ElementsAreArray(reference_am)); @@ -105,37 +105,37 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { if (vmec_indata->ncurr == 0) { // constrained-iota; ignore current profile coefficients // TODO(jons): check for spline profiles -> need to check ai_aux_* - std::vector reference_ai = NetcdfReadArray1D(ncid, "ai"); + std::vector reference_ai = NetcdfReadArray1D(ncid, "ai").value(); // remove zero-padding at end reference_ai.resize(wout.ai.size()); EXPECT_THAT(wout.ai, ElementsAreArray(reference_ai)); } else { // constrained-current // TODO(jons): check for spline profiles -> need to check ac_aux_* - std::vector reference_ac = NetcdfReadArray1D(ncid, "ac"); + std::vector reference_ac = NetcdfReadArray1D(ncid, "ac").value(); reference_ac.resize(wout.ac.size()); EXPECT_THAT(wout.ac, ElementsAreArray(reference_ac)); if (wout.ai.size() > 0) { // iota profile (if present) taken as initial guess for first iteration // TODO(jons): check for spline profiles -> need to check ai_aux_* - std::vector reference_ai = NetcdfReadArray1D(ncid, "ai"); + std::vector reference_ai = NetcdfReadArray1D(ncid, "ai").value(); // remove zero-padding at end reference_ai.resize(wout.ai.size()); EXPECT_THAT(wout.ai, ElementsAreArray(reference_ai)); } } - EXPECT_EQ(wout.nfp, NetcdfReadInt(ncid, "nfp")); - EXPECT_EQ(wout.mpol, NetcdfReadInt(ncid, "mpol")); - EXPECT_EQ(wout.ntor, NetcdfReadInt(ncid, "ntor")); - EXPECT_EQ(wout.lasym, NetcdfReadBool(ncid, "lasym")); + EXPECT_EQ(wout.nfp, NetcdfReadInt(ncid, "nfp").value()); + EXPECT_EQ(wout.mpol, NetcdfReadInt(ncid, "mpol").value()); + EXPECT_EQ(wout.ntor, NetcdfReadInt(ncid, "ntor").value()); + EXPECT_EQ(wout.lasym, NetcdfReadBool(ncid, "lasym").value()); - EXPECT_EQ(wout.ns, NetcdfReadInt(ncid, "ns")); - EXPECT_EQ(wout.ftolv, NetcdfReadDouble(ncid, "ftolv")); - EXPECT_EQ(wout.niter, NetcdfReadInt(ncid, "niter")); + EXPECT_EQ(wout.ns, NetcdfReadInt(ncid, "ns").value()); + EXPECT_EQ(wout.ftolv, NetcdfReadDouble(ncid, "ftolv").value()); + EXPECT_EQ(wout.niter, NetcdfReadInt(ncid, "niter").value()); - EXPECT_EQ(wout.lfreeb, NetcdfReadBool(ncid, "lfreeb")); + EXPECT_EQ(wout.lfreeb, NetcdfReadBool(ncid, "lfreeb").value()); if (wout.lfreeb) { // The reference data is generated using educational_VMEC, // which is run from within //vmecpp/test_data. @@ -147,88 +147,99 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { // //vmecpp/test_data/regenerate_test_data.sh. EXPECT_EQ(wout.mgrid_file, absl::StrCat("vmecpp/test_data/", - NetcdfReadString(ncid, "mgrid_file"))); - std::vector reference_extcur = NetcdfReadArray1D(ncid, "extcur"); + NetcdfReadString(ncid, "mgrid_file").value())); + std::vector reference_extcur = + NetcdfReadArray1D(ncid, "extcur").value(); EXPECT_THAT(wout.extcur, ElementsAreArray(reference_extcur)); EXPECT_EQ(wout.nextcur, static_cast(reference_extcur.size())); } - EXPECT_EQ(wout.mgrid_mode, NetcdfReadString(ncid, "mgrid_mode")); + EXPECT_EQ(wout.mgrid_mode, NetcdfReadString(ncid, "mgrid_mode").value()); // ------------------- // scalar quantities - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "wb"), wout.wb, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "wp"), wout.wp, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(NetcdfReadDouble(ncid, "wb").value(), wout.wb, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(NetcdfReadDouble(ncid, "wp").value(), wout.wp, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "rmax_surf"), wout.rmax_surf, - tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "rmin_surf"), wout.rmin_surf, - tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "zmax_surf"), wout.zmax_surf, - tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "rmax_surf").value(), + wout.rmax_surf, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "rmin_surf").value(), + wout.rmin_surf, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "zmax_surf").value(), + wout.zmax_surf, tolerance)); - EXPECT_EQ(wout.mnmax, NetcdfReadInt(ncid, "mnmax")); - EXPECT_EQ(wout.mnmax_nyq, NetcdfReadInt(ncid, "mnmax_nyq")); + EXPECT_EQ(wout.mnmax, NetcdfReadInt(ncid, "mnmax").value()); + EXPECT_EQ(wout.mnmax_nyq, NetcdfReadInt(ncid, "mnmax_nyq").value()); - EXPECT_EQ(wout.ier_flag, NetcdfReadInt(ncid, "ier_flag")); + EXPECT_EQ(wout.ier_flag, NetcdfReadInt(ncid, "ier_flag").value()); - EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "aspect"), wout.aspect, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "aspect").value(), + wout.aspect, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betatotal"), wout.betatotal, - tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betapol"), wout.betapol, - tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betator"), wout.betator, - tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betaxis"), wout.betaxis, - tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betatotal").value(), + wout.betatotal, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betapol").value(), + wout.betapol, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betator").value(), + wout.betator, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "betaxis").value(), + wout.betaxis, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "b0"), wout.b0, tolerance)); - - EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "rbtor0"), wout.rbtor0, tolerance)); EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "rbtor"), wout.rbtor, tolerance)); + IsCloseRelAbs(NetcdfReadDouble(ncid, "b0").value(), wout.b0, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "IonLarmor"), wout.IonLarmor, + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "rbtor0").value(), + wout.rbtor0, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "rbtor").value(), wout.rbtor, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "volavgB"), wout.volavgB, + + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "IonLarmor").value(), + wout.IonLarmor, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "volavgB").value(), + wout.volavgB, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "ctor").value(), wout.ctor, tolerance)); - EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "ctor"), wout.ctor, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "Aminor_p").value(), + wout.Aminor_p, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "Rmajor_p").value(), + wout.Rmajor_p, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "volume_p").value(), + wout.volume, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "Aminor_p"), wout.Aminor_p, + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "fsqr").value(), wout.fsqr, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "Rmajor_p"), wout.Rmajor_p, + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "fsqz").value(), wout.fsqz, tolerance)); - EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "volume_p"), wout.volume, + EXPECT_TRUE(IsCloseRelAbs(NetcdfReadDouble(ncid, "fsql").value(), wout.fsql, tolerance)); - EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "fsqr"), wout.fsqr, tolerance)); - EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "fsqz"), wout.fsqz, tolerance)); - EXPECT_TRUE( - IsCloseRelAbs(NetcdfReadDouble(ncid, "fsql"), wout.fsql, tolerance)); - // ------------------- // one-dimensional array quantities - std::vector reference_iota_full = NetcdfReadArray1D(ncid, "iotaf"); + std::vector reference_iota_full = + NetcdfReadArray1D(ncid, "iotaf").value(); std::vector reference_safety_factor = - NetcdfReadArray1D(ncid, "q_factor"); + NetcdfReadArray1D(ncid, "q_factor").value(); std::vector reference_pressure_full = - NetcdfReadArray1D(ncid, "presf"); - std::vector reference_toroidal_flux = NetcdfReadArray1D(ncid, "phi"); - std::vector reference_poloidal_flux = NetcdfReadArray1D(ncid, "chi"); - std::vector reference_phipf = NetcdfReadArray1D(ncid, "phipf"); - std::vector reference_chipf = NetcdfReadArray1D(ncid, "chipf"); - std::vector reference_jcuru = NetcdfReadArray1D(ncid, "jcuru"); - std::vector reference_jcurv = NetcdfReadArray1D(ncid, "jcurv"); + NetcdfReadArray1D(ncid, "presf").value(); + std::vector reference_toroidal_flux = + NetcdfReadArray1D(ncid, "phi").value(); + std::vector reference_poloidal_flux = + NetcdfReadArray1D(ncid, "chi").value(); + std::vector reference_phipf = + NetcdfReadArray1D(ncid, "phipf").value(); + std::vector reference_chipf = + NetcdfReadArray1D(ncid, "chipf").value(); + std::vector reference_jcuru = + NetcdfReadArray1D(ncid, "jcuru").value(); + std::vector reference_jcurv = + NetcdfReadArray1D(ncid, "jcurv").value(); std::vector reference_spectral_width = - NetcdfReadArray1D(ncid, "specw"); + NetcdfReadArray1D(ncid, "specw").value(); for (int jF = 0; jF < fc.ns; ++jF) { EXPECT_TRUE( IsCloseRelAbs(reference_iota_full[jF], wout.iotaf[jF], tolerance)); @@ -248,15 +259,21 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { IsCloseRelAbs(reference_spectral_width[jF], wout.specw[jF], tolerance)); } // jF - std::vector reference_iota_half = NetcdfReadArray1D(ncid, "iotas"); - std::vector reference_mass_half = NetcdfReadArray1D(ncid, "mass"); - std::vector reference_pressure_half = NetcdfReadArray1D(ncid, "pres"); - std::vector reference_beta = NetcdfReadArray1D(ncid, "beta_vol"); - std::vector reference_buco = NetcdfReadArray1D(ncid, "buco"); - std::vector reference_bvco = NetcdfReadArray1D(ncid, "bvco"); - std::vector reference_dVds = NetcdfReadArray1D(ncid, "vp"); - std::vector reference_phips = NetcdfReadArray1D(ncid, "phips"); - std::vector reference_overr = NetcdfReadArray1D(ncid, "over_r"); + std::vector reference_iota_half = + NetcdfReadArray1D(ncid, "iotas").value(); + std::vector reference_mass_half = + NetcdfReadArray1D(ncid, "mass").value(); + std::vector reference_pressure_half = + NetcdfReadArray1D(ncid, "pres").value(); + std::vector reference_beta = + NetcdfReadArray1D(ncid, "beta_vol").value(); + std::vector reference_buco = NetcdfReadArray1D(ncid, "buco").value(); + std::vector reference_bvco = NetcdfReadArray1D(ncid, "bvco").value(); + std::vector reference_dVds = NetcdfReadArray1D(ncid, "vp").value(); + std::vector reference_phips = + NetcdfReadArray1D(ncid, "phips").value(); + std::vector reference_overr = + NetcdfReadArray1D(ncid, "over_r").value(); for (int jF = 0; jF < fc.ns; ++jF) { EXPECT_TRUE( IsCloseRelAbs(reference_iota_half[jF], wout.iotas[jF], tolerance)); @@ -273,10 +290,12 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { EXPECT_TRUE(IsCloseRelAbs(reference_overr[jF], wout.over_r[jF], tolerance)); } // jF - std::vector reference_jdotb = NetcdfReadArray1D(ncid, "jdotb"); - std::vector reference_bdotb = NetcdfReadArray1D(ncid, "bdotb"); + std::vector reference_jdotb = + NetcdfReadArray1D(ncid, "jdotb").value(); + std::vector reference_bdotb = + NetcdfReadArray1D(ncid, "bdotb").value(); std::vector reference_bdotgradv = - NetcdfReadArray1D(ncid, "bdotgradv"); + NetcdfReadArray1D(ncid, "bdotgradv").value(); for (int jF = 0; jF < fc.ns; ++jF) { EXPECT_TRUE( IsCloseRelAbs(reference_jdotb[jF], wout.jdotb[jF], 10 * tolerance)); @@ -285,11 +304,16 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { IsCloseRelAbs(reference_bdotgradv[jF], wout.bdotgradv[jF], tolerance)); } // jF - std::vector reference_DMerc = NetcdfReadArray1D(ncid, "DMerc"); - std::vector reference_Dshear = NetcdfReadArray1D(ncid, "DShear"); - std::vector reference_Dwell = NetcdfReadArray1D(ncid, "DWell"); - std::vector reference_Dcurr = NetcdfReadArray1D(ncid, "DCurr"); - std::vector reference_Dgeod = NetcdfReadArray1D(ncid, "DGeod"); + std::vector reference_DMerc = + NetcdfReadArray1D(ncid, "DMerc").value(); + std::vector reference_Dshear = + NetcdfReadArray1D(ncid, "DShear").value(); + std::vector reference_Dwell = + NetcdfReadArray1D(ncid, "DWell").value(); + std::vector reference_Dcurr = + NetcdfReadArray1D(ncid, "DCurr").value(); + std::vector reference_Dgeod = + NetcdfReadArray1D(ncid, "DGeod").value(); for (int jF = 0; jF < fc.ns; ++jF) { EXPECT_TRUE(IsCloseRelAbs(reference_DMerc[jF], wout.DMerc[jF], tolerance)); EXPECT_TRUE( @@ -299,7 +323,8 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { EXPECT_TRUE(IsCloseRelAbs(reference_Dgeod[jF], wout.DGeod[jF], tolerance)); } // jF - std::vector reference_equif = NetcdfReadArray1D(ncid, "equif"); + std::vector reference_equif = + NetcdfReadArray1D(ncid, "equif").value(); for (int jF = 0; jF < fc.ns; ++jF) { EXPECT_TRUE(IsCloseRelAbs(reference_equif[jF], wout.equif[jF], tolerance)); } @@ -309,15 +334,17 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { // ------------------- // mode numbers for Fourier coefficient arrays below - std::vector reference_xm = NetcdfReadArray1D(ncid, "xm"); - std::vector reference_xn = NetcdfReadArray1D(ncid, "xn"); + std::vector reference_xm = NetcdfReadArray1D(ncid, "xm").value(); + std::vector reference_xn = NetcdfReadArray1D(ncid, "xn").value(); for (int mn = 0; mn < wout.mnmax; ++mn) { EXPECT_EQ(wout.xm[mn], reference_xm[mn]); EXPECT_EQ(wout.xn[mn], reference_xn[mn]); } // mn - std::vector reference_xm_nyq = NetcdfReadArray1D(ncid, "xm_nyq"); - std::vector reference_xn_nyq = NetcdfReadArray1D(ncid, "xn_nyq"); + std::vector reference_xm_nyq = + NetcdfReadArray1D(ncid, "xm_nyq").value(); + std::vector reference_xn_nyq = + NetcdfReadArray1D(ncid, "xn_nyq").value(); for (int mn_nyq = 0; mn_nyq < wout.mnmax_nyq; ++mn_nyq) { EXPECT_EQ(wout.xm_nyq[mn_nyq], reference_xm_nyq[mn_nyq]); EXPECT_EQ(wout.xn_nyq[mn_nyq], reference_xn_nyq[mn_nyq]); @@ -326,8 +353,10 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { // ------------------- // stellarator-symmetric Fourier coefficients - std::vector reference_raxis_cc = NetcdfReadArray1D(ncid, "raxis_cc"); - std::vector reference_zaxis_cs = NetcdfReadArray1D(ncid, "zaxis_cs"); + std::vector reference_raxis_cc = + NetcdfReadArray1D(ncid, "raxis_cc").value(); + std::vector reference_zaxis_cs = + NetcdfReadArray1D(ncid, "zaxis_cs").value(); for (int n = 0; n <= wout.ntor; ++n) { EXPECT_TRUE( IsCloseRelAbs(reference_raxis_cc[n], wout.raxis_cc[n], tolerance)); @@ -336,9 +365,9 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { } // n std::vector> reference_rmnc = - NetcdfReadArray2D(ncid, "rmnc"); + NetcdfReadArray2D(ncid, "rmnc").value(); std::vector> reference_zmns = - NetcdfReadArray2D(ncid, "zmns"); + NetcdfReadArray2D(ncid, "zmns").value(); for (int jF = 0; jF < fc.ns; ++jF) { for (int mn = 0; mn < s.mnmax; ++mn) { EXPECT_TRUE( @@ -349,7 +378,7 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { } // jF std::vector> reference_lmns = - NetcdfReadArray2D(ncid, "lmns"); + NetcdfReadArray2D(ncid, "lmns").value(); for (int jF = 0; jF < fc.ns; ++jF) { for (int mn = 0; mn < s.mnmax; ++mn) { EXPECT_TRUE( @@ -358,19 +387,19 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { } // jF std::vector> reference_gmnc = - NetcdfReadArray2D(ncid, "gmnc"); + NetcdfReadArray2D(ncid, "gmnc").value(); std::vector> reference_bmnc = - NetcdfReadArray2D(ncid, "bmnc"); + NetcdfReadArray2D(ncid, "bmnc").value(); std::vector> reference_bsubumnc = - NetcdfReadArray2D(ncid, "bsubumnc"); + NetcdfReadArray2D(ncid, "bsubumnc").value(); std::vector> reference_bsubvmnc = - NetcdfReadArray2D(ncid, "bsubvmnc"); + NetcdfReadArray2D(ncid, "bsubvmnc").value(); std::vector> reference_bsubsmns = - NetcdfReadArray2D(ncid, "bsubsmns"); + NetcdfReadArray2D(ncid, "bsubsmns").value(); std::vector> reference_bsupumnc = - NetcdfReadArray2D(ncid, "bsupumnc"); + NetcdfReadArray2D(ncid, "bsupumnc").value(); std::vector> reference_bsupvmnc = - NetcdfReadArray2D(ncid, "bsupvmnc"); + NetcdfReadArray2D(ncid, "bsupvmnc").value(); for (int jF = 0; jF < fc.ns; ++jF) { for (int mn_nyq = 0; mn_nyq < s.mnmax_nyq; ++mn_nyq) { EXPECT_TRUE(IsCloseRelAbs(reference_gmnc[jF][mn_nyq], @@ -395,9 +424,9 @@ TEST_P(WOutFileContentsTest, CheckWOutFileContents) { if (s.lasym) { std::vector reference_raxis_cs = - NetcdfReadArray1D(ncid, "raxis_cs"); + NetcdfReadArray1D(ncid, "raxis_cs").value(); std::vector reference_zaxis_cc = - NetcdfReadArray1D(ncid, "zaxis_cc"); + NetcdfReadArray1D(ncid, "zaxis_cc").value(); for (int n = 0; n <= wout.ntor; ++n) { EXPECT_TRUE( IsCloseRelAbs(reference_raxis_cs[n], wout.raxis_cs[n], tolerance)); @@ -556,16 +585,17 @@ TEST(SplineProfileEquilibrium, CthLikeCubicSplinePressureMatchesFortranGolden) { }; // scalar physics quantities - scalar("volume_p", NetcdfReadDouble(ncid, "volume_p"), wout.volume); - scalar("betatotal", NetcdfReadDouble(ncid, "betatotal"), wout.betatotal); - scalar("aspect", NetcdfReadDouble(ncid, "aspect"), wout.aspect); - scalar("b0", NetcdfReadDouble(ncid, "b0"), wout.b0); - scalar("wp", NetcdfReadDouble(ncid, "wp"), wout.wp); - scalar("wb", NetcdfReadDouble(ncid, "wb"), wout.wb); - scalar("rbtor", NetcdfReadDouble(ncid, "rbtor"), wout.rbtor); - scalar("ctor", NetcdfReadDouble(ncid, "ctor"), wout.ctor); - scalar("Aminor_p", NetcdfReadDouble(ncid, "Aminor_p"), wout.Aminor_p); - scalar("Rmajor_p", NetcdfReadDouble(ncid, "Rmajor_p"), wout.Rmajor_p); + scalar("volume_p", NetcdfReadDouble(ncid, "volume_p").value(), wout.volume); + scalar("betatotal", NetcdfReadDouble(ncid, "betatotal").value(), + wout.betatotal); + scalar("aspect", NetcdfReadDouble(ncid, "aspect").value(), wout.aspect); + scalar("b0", NetcdfReadDouble(ncid, "b0").value(), wout.b0); + scalar("wp", NetcdfReadDouble(ncid, "wp").value(), wout.wp); + scalar("wb", NetcdfReadDouble(ncid, "wb").value(), wout.wb); + scalar("rbtor", NetcdfReadDouble(ncid, "rbtor").value(), wout.rbtor); + scalar("ctor", NetcdfReadDouble(ncid, "ctor").value(), wout.ctor); + scalar("Aminor_p", NetcdfReadDouble(ncid, "Aminor_p").value(), wout.Aminor_p); + scalar("Rmajor_p", NetcdfReadDouble(ncid, "Rmajor_p").value(), wout.Rmajor_p); // 1D radial profiles, including the spline-driven pressure std::vector wpresf(fc.ns), wpres(fc.ns), wmass(fc.ns), wiotaf(fc.ns), @@ -578,38 +608,38 @@ TEST(SplineProfileEquilibrium, CthLikeCubicSplinePressureMatchesFortranGolden) { wiotas[jF] = wout.iotas[jF]; wjcurv[jF] = wout.jcurv[jF]; } - compare("presf", NetcdfReadArray1D(ncid, "presf"), wpresf); - compare("pres", NetcdfReadArray1D(ncid, "pres"), wpres); - compare("mass", NetcdfReadArray1D(ncid, "mass"), wmass); - compare("iotaf", NetcdfReadArray1D(ncid, "iotaf"), wiotaf); - compare("iotas", NetcdfReadArray1D(ncid, "iotas"), wiotas); - compare("jcurv", NetcdfReadArray1D(ncid, "jcurv"), wjcurv); + compare("presf", NetcdfReadArray1D(ncid, "presf").value(), wpresf); + compare("pres", NetcdfReadArray1D(ncid, "pres").value(), wpres); + compare("mass", NetcdfReadArray1D(ncid, "mass").value(), wmass); + compare("iotaf", NetcdfReadArray1D(ncid, "iotaf").value(), wiotaf); + compare("iotas", NetcdfReadArray1D(ncid, "iotas").value(), wiotas); + compare("jcurv", NetcdfReadArray1D(ncid, "jcurv").value(), wjcurv); // flux-surface geometry auto [r_ref, r_val] = - flatten(NetcdfReadArray2D(ncid, "rmnc"), fc.ns, s.mnmax, + flatten(NetcdfReadArray2D(ncid, "rmnc").value(), fc.ns, s.mnmax, [&](int mn, int jF) { return wout.rmnc(mn, jF); }); compare("rmnc", r_ref, r_val); auto [z_ref, z_val] = - flatten(NetcdfReadArray2D(ncid, "zmns"), fc.ns, s.mnmax, + flatten(NetcdfReadArray2D(ncid, "zmns").value(), fc.ns, s.mnmax, [&](int mn, int jF) { return wout.zmns(mn, jF); }); compare("zmns", z_ref, z_val); auto [l_ref, l_val] = - flatten(NetcdfReadArray2D(ncid, "lmns"), fc.ns, s.mnmax, + flatten(NetcdfReadArray2D(ncid, "lmns").value(), fc.ns, s.mnmax, [&](int mn, int jF) { return wout.lmns(mn, jF); }); compare("lmns", l_ref, l_val); // magnetic field on the Nyquist mode set auto [b_ref, b_val] = - flatten(NetcdfReadArray2D(ncid, "bmnc"), fc.ns, s.mnmax_nyq, + flatten(NetcdfReadArray2D(ncid, "bmnc").value(), fc.ns, s.mnmax_nyq, [&](int mn, int jF) { return wout.bmnc(mn, jF); }); compare("bmnc", b_ref, b_val); auto [bu_ref, bu_val] = - flatten(NetcdfReadArray2D(ncid, "bsubumnc"), fc.ns, s.mnmax_nyq, + flatten(NetcdfReadArray2D(ncid, "bsubumnc").value(), fc.ns, s.mnmax_nyq, [&](int mn, int jF) { return wout.bsubumnc(mn, jF); }); compare("bsubumnc", bu_ref, bu_val); auto [bv_ref, bv_val] = - flatten(NetcdfReadArray2D(ncid, "bsubvmnc"), fc.ns, s.mnmax_nyq, + flatten(NetcdfReadArray2D(ncid, "bsubvmnc").value(), fc.ns, s.mnmax_nyq, [&](int mn, int jF) { return wout.bsubvmnc(mn, jF); }); compare("bsubvmnc", bv_ref, bv_val); @@ -704,17 +734,18 @@ TEST(SolovevFreeBoundary, MatchesEducationalVmecGolden) { }; // scalar physics quantities - scalar("volume_p", NetcdfReadDouble(ncid, "volume_p"), wout.volume); - scalar("betatotal", NetcdfReadDouble(ncid, "betatotal"), wout.betatotal); - scalar("aspect", NetcdfReadDouble(ncid, "aspect"), wout.aspect); - scalar("b0", NetcdfReadDouble(ncid, "b0"), wout.b0); - scalar("wp", NetcdfReadDouble(ncid, "wp"), wout.wp); - scalar("wb", NetcdfReadDouble(ncid, "wb"), wout.wb); - scalar("rbtor", NetcdfReadDouble(ncid, "rbtor"), wout.rbtor); - scalar("ctor", NetcdfReadDouble(ncid, "ctor"), wout.ctor); - scalar("Aminor_p", NetcdfReadDouble(ncid, "Aminor_p"), wout.Aminor_p); - scalar("Rmajor_p", NetcdfReadDouble(ncid, "Rmajor_p"), wout.Rmajor_p); - scalar("volavgB", NetcdfReadDouble(ncid, "volavgB"), wout.volavgB); + scalar("volume_p", NetcdfReadDouble(ncid, "volume_p").value(), wout.volume); + scalar("betatotal", NetcdfReadDouble(ncid, "betatotal").value(), + wout.betatotal); + scalar("aspect", NetcdfReadDouble(ncid, "aspect").value(), wout.aspect); + scalar("b0", NetcdfReadDouble(ncid, "b0").value(), wout.b0); + scalar("wp", NetcdfReadDouble(ncid, "wp").value(), wout.wp); + scalar("wb", NetcdfReadDouble(ncid, "wb").value(), wout.wb); + scalar("rbtor", NetcdfReadDouble(ncid, "rbtor").value(), wout.rbtor); + scalar("ctor", NetcdfReadDouble(ncid, "ctor").value(), wout.ctor); + scalar("Aminor_p", NetcdfReadDouble(ncid, "Aminor_p").value(), wout.Aminor_p); + scalar("Rmajor_p", NetcdfReadDouble(ncid, "Rmajor_p").value(), wout.Rmajor_p); + scalar("volavgB", NetcdfReadDouble(ncid, "volavgB").value(), wout.volavgB); // 1D radial profiles (pressure and rotational transform) std::vector wpresf(fc.ns), wpres(fc.ns), wiotaf(fc.ns), wiotas(fc.ns); @@ -724,36 +755,36 @@ TEST(SolovevFreeBoundary, MatchesEducationalVmecGolden) { wiotaf[jF] = wout.iotaf[jF]; wiotas[jF] = wout.iotas[jF]; } - compare("presf", NetcdfReadArray1D(ncid, "presf"), wpresf); - compare("pres", NetcdfReadArray1D(ncid, "pres"), wpres); - compare("iotaf", NetcdfReadArray1D(ncid, "iotaf"), wiotaf); - compare("iotas", NetcdfReadArray1D(ncid, "iotas"), wiotas); + compare("presf", NetcdfReadArray1D(ncid, "presf").value(), wpresf); + compare("pres", NetcdfReadArray1D(ncid, "pres").value(), wpres); + compare("iotaf", NetcdfReadArray1D(ncid, "iotaf").value(), wiotaf); + compare("iotas", NetcdfReadArray1D(ncid, "iotas").value(), wiotas); // flux-surface geometry auto [r_ref, r_val] = - flatten(NetcdfReadArray2D(ncid, "rmnc"), fc.ns, s.mnmax, + flatten(NetcdfReadArray2D(ncid, "rmnc").value(), fc.ns, s.mnmax, [&](int mn, int jF) { return wout.rmnc(mn, jF); }); compare("rmnc", r_ref, r_val); auto [z_ref, z_val] = - flatten(NetcdfReadArray2D(ncid, "zmns"), fc.ns, s.mnmax, + flatten(NetcdfReadArray2D(ncid, "zmns").value(), fc.ns, s.mnmax, [&](int mn, int jF) { return wout.zmns(mn, jF); }); compare("zmns", z_ref, z_val); auto [l_ref, l_val] = - flatten(NetcdfReadArray2D(ncid, "lmns"), fc.ns, s.mnmax, + flatten(NetcdfReadArray2D(ncid, "lmns").value(), fc.ns, s.mnmax, [&](int mn, int jF) { return wout.lmns(mn, jF); }); compare("lmns", l_ref, l_val); // magnetic field on the Nyquist mode set auto [b_ref, b_val] = - flatten(NetcdfReadArray2D(ncid, "bmnc"), fc.ns, s.mnmax_nyq, + flatten(NetcdfReadArray2D(ncid, "bmnc").value(), fc.ns, s.mnmax_nyq, [&](int mn, int jF) { return wout.bmnc(mn, jF); }); compare("bmnc", b_ref, b_val); auto [bu_ref, bu_val] = - flatten(NetcdfReadArray2D(ncid, "bsubumnc"), fc.ns, s.mnmax_nyq, + flatten(NetcdfReadArray2D(ncid, "bsubumnc").value(), fc.ns, s.mnmax_nyq, [&](int mn, int jF) { return wout.bsubumnc(mn, jF); }); compare("bsubumnc", bu_ref, bu_val); auto [bv_ref, bv_val] = - flatten(NetcdfReadArray2D(ncid, "bsubvmnc"), fc.ns, s.mnmax_nyq, + flatten(NetcdfReadArray2D(ncid, "bsubvmnc").value(), fc.ns, s.mnmax_nyq, [&](int mn, int jF) { return wout.bsubvmnc(mn, jF); }); compare("bsubvmnc", bv_ref, bv_val); @@ -764,8 +795,8 @@ TEST(SolovevFreeBoundary, MatchesEducationalVmecGolden) { wjcuru[jF] = wout.jcuru[jF]; wjcurv[jF] = wout.jcurv[jF]; } - compare("jcuru", NetcdfReadArray1D(ncid, "jcuru"), wjcuru); - compare("jcurv", NetcdfReadArray1D(ncid, "jcurv"), wjcurv); + compare("jcuru", NetcdfReadArray1D(ncid, "jcuru").value(), wjcuru); + compare("jcurv", NetcdfReadArray1D(ncid, "jcurv").value(), wjcurv); ASSERT_EQ(nc_close(ncid), NC_NOERR); diff --git a/src/vmecpp/cpp/vmecpp/vmec/pybind11/pybind_vmec.cc b/src/vmecpp/cpp/vmecpp/vmec/pybind11/pybind_vmec.cc index 7b2d908fa..5e2510d7d 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/pybind11/pybind_vmec.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/pybind11/pybind_vmec.cc @@ -217,9 +217,27 @@ class VmecModel { // decision vector. This is the body of Vmec::UpdateForwardModel with // caller-supplied counters; for free-boundary runs the caller should react to // `need_restart` (a vacuum-activation restart). - void Evaluate(int iter1, int iter2) { + // When precondition is true (default) this runs the full forward model and + // leaves decomposed_f holding the preconditioned search direction, exactly as + // the native solver uses it. When false, the forward model returns at the + // INVARIANT_RESIDUALS checkpoint (vmec.cc line ~836), so decomposed_f holds + // the raw, unpreconditioned force: the gradient of VMEC's augmented + // Lagrangian with respect to the (decomposed) state, including the + // lambda-constraint components. That raw gradient is what gradient-based + // optimizers minimizing the MHD energy functional need; mhd_energy is already + // set earlier in update(), so it is valid at the checkpoint too. + // The native iteration leaves the m=1 gauge free until the previous Z + // residual crosses its threshold. External evaluations fix it immediately so + // F(x) does not depend on the previously evaluated state. + void Evaluate(int iter1, int iter2, bool precondition = true, + bool always_fix_m1_gauge = true) { + ++force_eval_count_; bool need_restart = false; std::string error_message; + const vmecpp::VmecCheckpoint checkpoint = + precondition ? vmecpp::VmecCheckpoint::NONE + : vmecpp::VmecCheckpoint::INVARIANT_RESIDUALS; + const int checkpoint_after = precondition ? INT_MAX : 0; // Clear the restart reason before evaluating the forward model, exactly as // Vmec::Evolve does at its start (vmec.cc): the forward model only *sets* a // reason (BAD_JACOBIAN when the Jacobian flips, HUGE_INITIAL_FORCES at @@ -240,8 +258,8 @@ class VmecModel { *vmec_->decomposed_x_[0], *vmec_->physical_x_[0], *vmec_->decomposed_f_[0], *vmec_->physical_f_[0], need_restart, last_preconditioner_update_, last_full_update_nestor_, vmec_->fc_, - iter1, iter2, vmecpp::VmecCheckpoint::NONE, INT_MAX, - /*verbose=*/false); + iter1, iter2, checkpoint, checkpoint_after, + /*verbose=*/false, always_fix_m1_gauge); if (!s.ok()) { error_message = std::string(s.status().message()); } @@ -253,6 +271,12 @@ class VmecModel { } bool need_restart() const { return last_need_restart_; } + // Total forward-model (force) evaluations since construction or the last + // reset. Counts every Evaluate, including those inside hessian_vector_product + // and preconditioner assembly, for a fair cross-optimizer cost comparison. + long force_eval_count() const { return force_eval_count_; } + void reset_force_eval_count() { force_eval_count_ = 0; } + // The Garabedian-style time step (PerformTimeStep): for each Fourier // coefficient, v = velocity_scale*(conjugation*v + dt*force); x += dt*v. void PerformTimeStep(double velocity_scale, double conjugation_parameter, @@ -381,6 +405,55 @@ class VmecModel { return FlattenActive(*vmec_->decomposed_f_[0], vmec_->s_); } + // Hessian-vector product of VMEC's augmented functional, computed inside + // VMEC++ by a central directional derivative of the analytic force (which is + // the gradient): H v = (F(x + eps v) - F(x - eps v)) / (2 eps), in the + // decomposed internal basis. This is the matrix-free Hessian information an + // internal or external Newton-Krylov solver needs; F itself is exact, so only + // the directional step is finite-differenced. The current state is restored. + Eigen::VectorXd HessianVectorProduct(const Eigen::VectorXd &v, + double eps_rel = 1e-7) { + const Eigen::VectorXd x = + FlattenActive(*vmec_->decomposed_x_[0], vmec_->s_); + const double vnorm = v.norm(); + if (vnorm == 0.0) { + return Eigen::VectorXd::Zero(x.size()); + } + const double eps = eps_rel * (1.0 + x.norm()) / vnorm; + UnflattenActive(*vmec_->decomposed_x_[0], vmec_->s_, x + eps * v); + Evaluate(2, 2, /*precondition=*/false); + const Eigen::VectorXd fp = + FlattenActive(*vmec_->decomposed_f_[0], vmec_->s_); + UnflattenActive(*vmec_->decomposed_x_[0], vmec_->s_, x - eps * v); + Evaluate(2, 2, /*precondition=*/false); + const Eigen::VectorXd fm = + FlattenActive(*vmec_->decomposed_f_[0], vmec_->s_); + UnflattenActive(*vmec_->decomposed_x_[0], vmec_->s_, x); + return (fp - fm) / (2.0 * eps); + } + + // Apply VMEC's preconditioner M^-1 to a vector in the decomposed internal + // basis, mirroring the native apply sequence (m=1, radial, lambda). This is + // VMEC's hand-built approximate inverse Hessian; gradient-based solvers use + // it as the metric (preconditioned Krylov / quasi-Newton, and as the + // preconditioner for the Hessian solve in adjoint sensitivities). + // + // Requires a prior evaluate(precondition=true) at the current state: the + // radial preconditioner is assembled inside that forward-model call. + Eigen::VectorXd ApplyPreconditioner(const Eigen::VectorXd &v) const { + vmecpp::FourierForces tmp(&vmec_->s_, vmec_->r_[0].get(), vmec_->fc_.ns); + tmp.setZero(); + UnflattenActive(tmp, vmec_->s_, v); + vmecpp::IdealMhdModel &model = *vmec_->m_[0]; + model.applyM1Preconditioner(tmp); + const absl::Status status = model.applyRZPreconditioner(tmp); + if (!status.ok()) { + throw std::runtime_error(std::string(status.message())); + } + model.applyLambdaPreconditioner(tmp); + return FlattenActive(tmp, vmec_->s_); + } + // Residuals (set by Evaluate()): invariant {fsqr,fsqz,fsql} and // preconditioned {fsqr1,fsqz1,fsql1}. double fsqr() const { return vmec_->fc_.fsqr; } @@ -453,6 +526,7 @@ class VmecModel { int last_preconditioner_update_ = 0; int last_full_update_nestor_ = 0; bool last_need_restart_ = false; + long force_eval_count_ = 0; }; } // anonymous namespace @@ -475,22 +549,25 @@ PYBIND11_MODULE(_vmecpp, m) { // play well with OpenMP: only use it with max_thread=1 or OMP_NUM_THREADS=1! py::add_ostream_redirect(m, "ostream_redirect"); - auto pyindata = py::class_(m, "VmecINDATA") - .def(py::init<>()) - .def("_set_mpol_ntor", &VmecINDATA::SetMpolNtor, - py::arg("new_mpol"), py::arg("new_ntor")) - .def("from_file", &VmecINDATA::FromFile) - .def("from_json", &VmecINDATA::FromJson) - .def("to_json", &VmecINDATA::ToJsonOrException) - .def("copy", &VmecINDATA::Copy) - - // numerical resolution, symmetry assumption - .def_readwrite("lasym", &VmecINDATA::lasym) - .def_readwrite("nfp", &VmecINDATA::nfp) - .def_readonly("mpol", &VmecINDATA::mpol) // readonly! - .def_readonly("ntor", &VmecINDATA::ntor) // readonly! - .def_readwrite("ntheta", &VmecINDATA::ntheta) - .def_readwrite("nzeta", &VmecINDATA::nzeta); + auto pyindata = + py::class_(m, "VmecINDATA") + .def(py::init<>()) + .def("_set_mpol_ntor", &VmecINDATA::SetMpolNtor, py::arg("new_mpol"), + py::arg("new_ntor")) + .def("from_file", &VmecINDATA::FromFile) + .def("from_json", &VmecINDATA::FromJson) + .def("to_json", &VmecINDATA::ToJsonOrException) + .def("copy", &VmecINDATA::Copy) + + // numerical resolution, symmetry assumption + .def_readwrite("lasym", &VmecINDATA::lasym) + .def_readwrite("nfp", &VmecINDATA::nfp) + .def_readonly("mpol", &VmecINDATA::mpol) // readonly! + .def_readonly("ntor", &VmecINDATA::ntor) // readonly! + .def_readwrite("ntheta", &VmecINDATA::ntheta) + .def_readwrite("nzeta", &VmecINDATA::nzeta) + .def_readwrite("mpol_geometry", &VmecINDATA::mpol_geometry) + .def_readwrite("ntor_geometry", &VmecINDATA::ntor_geometry); // multi-grid steps DefEigenProperty(pyindata, "ns_array", &VmecINDATA::ns_array); @@ -1186,7 +1263,9 @@ PYBIND11_MODULE(_vmecpp, m) { py::class_(m, "VmecModel") .def_static("create", &VmecModel::Create, py::arg("indata"), py::arg("ns"), py::arg("initial_state") = std::nullopt) - .def("evaluate", &VmecModel::Evaluate, py::arg("iter1"), py::arg("iter2")) + .def("evaluate", &VmecModel::Evaluate, py::arg("iter1"), py::arg("iter2"), + py::arg("precondition") = true, + py::arg("always_fix_m1_gauge") = true) .def_property_readonly("need_restart", &VmecModel::need_restart) .def("perform_time_step", &VmecModel::PerformTimeStep, py::arg("velocity_scale"), py::arg("conjugation_parameter"), @@ -1202,6 +1281,12 @@ PYBIND11_MODULE(_vmecpp, m) { .def("get_state", &VmecModel::GetState) .def("set_state", &VmecModel::SetState, py::arg("state")) .def("get_forces", &VmecModel::GetForces) + .def("apply_preconditioner", &VmecModel::ApplyPreconditioner, + py::arg("v")) + .def("hessian_vector_product", &VmecModel::HessianVectorProduct, + py::arg("v"), py::arg("eps_rel") = 1e-7) + .def_property_readonly("force_eval_count", &VmecModel::force_eval_count) + .def("reset_force_eval_count", &VmecModel::reset_force_eval_count) .def_property_readonly("fsqr", &VmecModel::fsqr) .def_property_readonly("fsqz", &VmecModel::fsqz) .def_property_readonly("fsql", &VmecModel::fsql) diff --git a/src/vmecpp/cpp/vmecpp/vmec/vmec/AGENTS.md b/src/vmecpp/cpp/vmecpp/vmec/vmec/AGENTS.md index 51e0c67dd..647526c2c 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/vmec/AGENTS.md +++ b/src/vmecpp/cpp/vmecpp/vmec/vmec/AGENTS.md @@ -54,8 +54,9 @@ misbehaves, the velocity `decomposed_v_` is zeroed and the state is rolled back - `NO_RESTART` (good path): back up the current state into `physical_x_backup_`. Separately, **hot restart** seeds `run()` from a previously converged `HotRestartState` -(`wout` + `indata`) via `FourierGeometry::InitFromState()`, used for parameter scans -(single multigrid step only). +(`wout` + `indata`) via `FourierGeometry::InitFromState()`, used for parameter scans. +The first element of `ns_array` must match the last `ns` of the restart state; subsequent +multigrid steps proceed normally via `InterpolateToNextMultigridStep()`. ## State variables (`Vmec`) diff --git a/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec.cc b/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec.cc index cdbc3e022..4915f753f 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec.cc @@ -79,24 +79,6 @@ absl::Status CheckInitialState(const vmecpp::HotRestartState& initial_state, return absl::InvalidArgumentError(absl::StrCat(msg_start, "ntor", msg_end)); } - // check for having only a single element in `ns_array`, `ftol_array`, and - // `niter_array`, since we don't support hot-restarting with multiple - // multi-grid steps - if (indata.ns_array.size() != 1ull) { - return absl::InvalidArgumentError( - "Only ns array with a single element is supported when hot-restarting"); - } - if (indata.ftol_array.size() != 1ull) { - return absl::InvalidArgumentError( - "Only ftol array with a single element is supported when " - "hot-restarting"); - } - if (indata.niter_array.size() != 1ull) { - return absl::InvalidArgumentError( - "Only niter array with a single element is supported when " - "hot-restarting"); - } - // check for matching `ns` if (initial_state.indata.ns_array[initial_state.indata.ns_array.size() - 1] != indata.ns_array[0]) { @@ -447,6 +429,7 @@ bool Vmec::InitializeRadial( fc_.ijacob = 0; fc_.restart_reason = RestartReason::NO_RESTART; fc_.res0 = -1; + fc_.res1 = -1; m_delt0 = indata_.delt; // INITIALIZE MESH-DEPENDENT SCALARS @@ -641,7 +624,8 @@ bool Vmec::InitializeRadial( // TODO(jons): lreset .and. .not.linter? // If xc is overwritten by interp() anyway, why bother to initialize it in // profil3d()? - if (initial_state.has_value()) { + if (initial_state.has_value() && ns_old == 0) { + // ns_old == 0 means we hot restart only on the very first multigrid step for (int thread_id = 0; thread_id < num_threads_; ++thread_id) { if (indata_.lfreeb) { // free-boundary hot restart: use all flux surfaces from initial state @@ -980,9 +964,34 @@ absl::StatusOr Vmec::SolveEquilibriumLoop( // res0 is the best force residual we got so far fc_.res0 = std::min(fc_.res0, fc_.fsq); + + // PARVMEC additionally tracks the invariant residual minimum res1. Keep + // it (and its inputs) off the vmec_8_52 path so the default control stays + // byte-for-byte unchanged. + if (indata_.iteration_style == IterationStyle::PARVMEC) { + const double fsq_invariant = fc_.fsqr + fc_.fsqz + fc_.fsql; + if (iter2 == iter1_ || fc_.res1 == -1) { + fc_.res1 = fsq_invariant; + } + fc_.res1 = std::min(fc_.res1, fsq_invariant); + } } - if (fc_.fsq <= fc_.res0 && (iter2 - iter1_) > 10) { + if (indata_.iteration_style == IterationStyle::PARVMEC) { + // PARVMEC control: store when both residual minima improve; revert via + // BAD_PROGRESS (delt0r /= 1.03, no ijacob) when either exceeds 1e4 * its + // minimum after 10 steps. + const double fsq_invariant = fc_.fsqr + fc_.fsqz + fc_.fsql; + if (fc_.fsq <= fc_.res0 && fsq_invariant <= fc_.res1) { + RestartIteration(fc_.delt0r, thread_id); + } else if ((iter2 - iter1_) > 10 && (fc_.fsq > 1.0e4 * fc_.res0 || + fsq_invariant > 1.0e4 * fc_.res1)) { +#ifdef _OPENMP +#pragma omp single +#endif // _OPENMP + fc_.restart_reason = RestartReason::BAD_PROGRESS; + } + } else if (fc_.fsq <= fc_.res0 && (iter2 - iter1_) > 10) { // Store current state (restart_reason=NO_RESTART) // --> was able to reduce force consistenly over at least 10 iterations RestartIteration(fc_.delt0r, thread_id); diff --git a/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec_in_memory_mgrid_test.cc b/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec_in_memory_mgrid_test.cc index 7bcd608de..4c3b5937c 100644 --- a/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec_in_memory_mgrid_test.cc +++ b/src/vmecpp/cpp/vmecpp/vmec/vmec/vmec_in_memory_mgrid_test.cc @@ -76,9 +76,12 @@ TEST(TestVmec, CheckInMemoryMgrid) { vmecpp::run(indata, magnetic_response_table); ASSERT_TRUE(output_with_inmemory_mgrid.ok()); - // compare wout contents + // compare wout contents. jcuru/jcurv are curl(B) currents whose two solve + // paths diverge by ~1.03e-7 across optimized/vectorized builds; keep every + // other quantity at 1e-7 and compare those two at 2e-7. vmecpp::CompareWOut(output_with_inmemory_mgrid->wout, original_output->wout, - /*tolerance=*/1e-7); + /*tolerance=*/1e-7, /*check_equal_niter=*/true, + /*current_density_tolerance=*/2e-7); } // Axisymmetric (ntor = 0, nzeta = 1) free-boundary tokamak (solovev_free_bdy). @@ -121,6 +124,10 @@ TEST(TestVmec, SolovevFreeBoundaryAxisymmetric) { ASSERT_TRUE(inmemory_output.ok()); // The in-memory makegrid path must reproduce the committed-mgrid run. + // jcuru/jcurv are curl(B) currents whose two solve paths diverge by ~1.03e-7 + // across optimized/vectorized builds; keep every other quantity at 1e-7 and + // compare those two at 2e-7. vmecpp::CompareWOut(inmemory_output->wout, disk_output->wout, - /*tolerance=*/1e-7); + /*tolerance=*/1e-7, /*check_equal_niter=*/true, + /*current_density_tolerance=*/2e-7); } diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/.gitattributes b/src/vmecpp/cpp/vmecpp_large_cpp_tests/.gitattributes new file mode 100644 index 000000000..61ed31e4c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/.gitattributes @@ -0,0 +1,2 @@ +*.nc filter=lfs diff=lfs merge=lfs -text +*.json filter=lfs diff=lfs merge=lfs -text diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/README.md b/src/vmecpp/cpp/vmecpp_large_cpp_tests/README.md new file mode 100644 index 000000000..5190f8e51 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/README.md @@ -0,0 +1,13 @@ +# VMEC++ large tests + +Suite of VMEC++ C++ tests that use large test files stored in Git LFS. + +These tests live directly in the [vmecpp](https://github.com/proximafusion/vmecpp) repository +under `src/vmecpp/cpp/vmecpp_large_cpp_tests/`. + +To build and run all tests: + +``` +cd src/vmecpp/cpp +bazel test --config=opt //vmecpp/... //vmecpp_large_cpp_tests/... +``` diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_poloidal/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_poloidal/BUILD.bazel new file mode 100644 index 000000000..cbe8ee2d9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_poloidal/BUILD.bazel @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "fourier_basis_fast_poloidal_test", + srcs = ["fourier_basis_fast_poloidal_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_analytical", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "@googletest//:gtest_main", + "@nlohmann_json//:json", + "@abseil-cpp//absl/algorithm:container", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/fourier_basis_fast_poloidal", + "//vmecpp/common/util:util", + "//vmecpp/common/sizes:sizes", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal_test.cc new file mode 100644 index 000000000..a6aa9a4e0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal_test.cc @@ -0,0 +1,148 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" + +#include +#include +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/sizes/sizes.h" + +namespace vmecpp { + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +struct DataSource { + std::string identifier; + double tolerance = 0.0; +}; + +class FourierBasisFastPoloidalTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourierBasisFastPoloidalTest, CheckFourierBasisFastPoloidal) { + const double kTolerance = data_source_.tolerance; + + std::string filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/fixaray/" + "fixaray_00000_000001_01.%s.json", + data_source_.identifier, data_source_.identifier); + std::ifstream ifs(filename); + ASSERT_TRUE(ifs.is_open()); + json fixaray = json::parse(ifs); + + filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(fixaray["ntheta3"], sizes.nThetaEff); + EXPECT_EQ(fixaray["mnyq"], sizes.mnyq); + EXPECT_EQ(fixaray["nzeta"], sizes.nZeta); + EXPECT_EQ(fixaray["nnyq"], sizes.nnyq); + EXPECT_EQ(fixaray["nznt"], sizes.nZnT); + EXPECT_EQ(fixaray["mnmax"], sizes.mnmax); + EXPECT_EQ(fixaray["mnsize"], sizes.mnsize); + EXPECT_EQ(fixaray["mnmax_nyq"], sizes.mnmax_nyq); + + FourierBasisFastPoloidal fourier_basis(&sizes); + + for (int m = 0; m < sizes.mnyq2 + 1; ++m) { + EXPECT_TRUE(IsCloseRelAbs(fixaray["mscale"][m], fourier_basis.mscale[m], + kTolerance)); + + for (int l = 0; l < sizes.nThetaReduced; ++l) { + int idx_ml = m * sizes.nThetaReduced + l; + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmu"][l][m], + fourier_basis.cosmu[idx_ml], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmu"][l][m], + fourier_basis.sinmu[idx_ml], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmui"][l][m], + fourier_basis.cosmui[idx_ml], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmui"][l][m], + fourier_basis.sinmui[idx_ml], kTolerance)); + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmum"][l][m], + fourier_basis.cosmum[idx_ml], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmum"][l][m], + fourier_basis.sinmum[idx_ml], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmumi"][l][m], + fourier_basis.cosmumi[idx_ml], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmumi"][l][m], + fourier_basis.sinmumi[idx_ml], kTolerance)); + } // l + } // m + + for (int n = 0; n < sizes.nnyq2 + 1; ++n) { + EXPECT_TRUE(IsCloseRelAbs(fixaray["nscale"][n], fourier_basis.nscale[n], + kTolerance)); + } + + for (int k = 0; k < sizes.nZeta; ++k) { + for (int n = 0; n < sizes.nnyq2 + 1; ++n) { + int idx_kn = k * (sizes.nnyq2 + 1) + n; + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosnv"][k][n], + fourier_basis.cosnv[idx_kn], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinnv"][k][n], + fourier_basis.sinnv[idx_kn], kTolerance)); + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosnvn"][k][n], + fourier_basis.cosnvn[idx_kn], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinnvn"][k][n], + fourier_basis.sinnvn[idx_kn], kTolerance)); + } // k + } // n + + for (int mn = 0; mn < sizes.mnmax; ++mn) { + EXPECT_EQ(fixaray["xm"][mn], fourier_basis.xm[mn]); + EXPECT_EQ(fixaray["xn"][mn], fourier_basis.xn[mn]); + } + + for (int mn_nyq = 0; mn_nyq < sizes.mnmax_nyq; ++mn_nyq) { + EXPECT_EQ(fixaray["xm_nyq"][mn_nyq], fourier_basis.xm_nyq[mn_nyq]); + EXPECT_EQ(fixaray["xn_nyq"][mn_nyq], fourier_basis.xn_nyq[mn_nyq]); + } +} // CheckFourierBasisFastPoloidal + +INSTANTIATE_TEST_SUITE_P( + TestFourierBasisFastPoloidal, FourierBasisFastPoloidalTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_analytical", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-30}, + DataSource{.identifier = "cma", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-30})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_toroidal/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_toroidal/BUILD.bazel new file mode 100644 index 000000000..393712c0c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_toroidal/BUILD.bazel @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "fourier_basis_fast_toroidal_test", + srcs = ["fourier_basis_fast_toroidal_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_analytical", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/common/fourier_basis_fast_toroidal", + "@googletest//:gtest_main", + "@nlohmann_json//:json", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/util:util", + "//vmecpp/common/sizes:sizes", + "@abseil-cpp//absl/algorithm:container", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal_test.cc new file mode 100644 index 000000000..36809d156 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal_test.cc @@ -0,0 +1,146 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h" + +#include +#include +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/sizes/sizes.h" + +namespace vmecpp { + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +struct DataSource { + std::string identifier; + double tolerance = 0.0; +}; + +class FourierBasisFastToroidalTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourierBasisFastToroidalTest, CheckFourierBasisFastToroidal) { + const double kTolerance = data_source_.tolerance; + + std::string filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/fixaray/" + "fixaray_00000_000001_01.%s.json", + data_source_.identifier, data_source_.identifier); + std::ifstream ifs(filename); + ASSERT_TRUE(ifs.is_open()); + json fixaray = json::parse(ifs); + + filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(fixaray["ntheta3"], sizes.nThetaEff); + EXPECT_EQ(fixaray["mnyq"], sizes.mnyq); + EXPECT_EQ(fixaray["nzeta"], sizes.nZeta); + EXPECT_EQ(fixaray["nnyq"], sizes.nnyq); + EXPECT_EQ(fixaray["nznt"], sizes.nZnT); + EXPECT_EQ(fixaray["mnmax"], sizes.mnmax); + EXPECT_EQ(fixaray["mnsize"], sizes.mnsize); + EXPECT_EQ(fixaray["mnmax_nyq"], sizes.mnmax_nyq); + + FourierBasisFastToroidal fourier_basis(&sizes); + + for (int m = 0; m < sizes.mnyq2 + 1; ++m) { + EXPECT_TRUE(IsCloseRelAbs(fixaray["mscale"][m], fourier_basis.mscale[m], + kTolerance)); + + for (int l = 0; l < sizes.nThetaReduced; ++l) { + int idx_lm = l * (sizes.mnyq2 + 1) + m; + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmu"][l][m], + fourier_basis.cosmu[idx_lm], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmu"][l][m], + fourier_basis.sinmu[idx_lm], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmui"][l][m], + fourier_basis.cosmui[idx_lm], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmui"][l][m], + fourier_basis.sinmui[idx_lm], kTolerance)); + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmum"][l][m], + fourier_basis.cosmum[idx_lm], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmum"][l][m], + fourier_basis.sinmum[idx_lm], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosmumi"][l][m], + fourier_basis.cosmumi[idx_lm], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinmumi"][l][m], + fourier_basis.sinmumi[idx_lm], kTolerance)); + } // l + } // m + + for (int n = 0; n < sizes.nnyq2 + 1; ++n) { + EXPECT_TRUE(IsCloseRelAbs(fixaray["nscale"][n], fourier_basis.nscale[n], + kTolerance)); + + for (int k = 0; k < sizes.nZeta; ++k) { + int idx_nk = n * sizes.nZeta + k; + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosnv"][k][n], + fourier_basis.cosnv[idx_nk], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinnv"][k][n], + fourier_basis.sinnv[idx_nk], kTolerance)); + + EXPECT_TRUE(IsCloseRelAbs(fixaray["cosnvn"][k][n], + fourier_basis.cosnvn[idx_nk], kTolerance)); + EXPECT_TRUE(IsCloseRelAbs(fixaray["sinnvn"][k][n], + fourier_basis.sinnvn[idx_nk], kTolerance)); + } // k + } // n + + for (int mn = 0; mn < sizes.mnmax; ++mn) { + EXPECT_EQ(fixaray["xm"][mn], fourier_basis.xm[mn]); + EXPECT_EQ(fixaray["xn"][mn], fourier_basis.xn[mn]); + } + + for (int mn_nyq = 0; mn_nyq < sizes.mnmax_nyq; ++mn_nyq) { + EXPECT_EQ(fixaray["xm_nyq"][mn_nyq], fourier_basis.xm_nyq[mn_nyq]); + EXPECT_EQ(fixaray["xn_nyq"][mn_nyq], fourier_basis.xn_nyq[mn_nyq]); + } +} // CheckFourierBasisFastToroidal + +INSTANTIATE_TEST_SUITE_P( + TestFourierBasisFastToroidal, FourierBasisFastToroidalTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_analytical", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-30}, + DataSource{.identifier = "cma", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-30})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/sizes/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/sizes/BUILD.bazel new file mode 100644 index 000000000..db16e3a5d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/sizes/BUILD.bazel @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "sizes_test", + srcs = ["sizes_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + ], + deps = [ + "@googletest//:gtest_main", + "@bazel_tools//tools/cpp/runfiles", + "//vmecpp/common/sizes", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/sizes/sizes_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/sizes/sizes_test.cc new file mode 100644 index 000000000..fa3a8c203 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/sizes/sizes_test.cc @@ -0,0 +1,288 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/common/sizes/sizes.h" + +#include + +#include "gtest/gtest.h" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" + +namespace vmecpp { + +namespace { +using file_io::ReadFile; +using testing::IsCloseRelAbs; +} // namespace + +// The tests below check that the Sizes setup from the JSON input file is +// consistent with the corresponding parameters in the Reference Fortran VMEC. +// For now, these are written manually here, since at the time of implementing +// these tests, the corresponding outputs were not written yet to debugging +// output files. +// TODO(jons): write a debugging output from educational_VMEC, which contains +// all these reference values, and test against those with a parameterized test +// for all cases + +TEST(TestSizes, CheckSolovev) { + double tolerance = 1.0e-30; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(sizes.lasym, false); + EXPECT_EQ(sizes.nfp, 1); + EXPECT_EQ(sizes.mpol, 6); + EXPECT_EQ(sizes.ntor, 0); + + // ntheta was 0 in the input file, so compute it here + EXPECT_EQ(sizes.ntheta, 2 * sizes.mpol + 6); + EXPECT_EQ(sizes.nZeta, 1); + + EXPECT_EQ(sizes.lthreed, false); + EXPECT_EQ(sizes.num_basis, 1); + + EXPECT_EQ(sizes.nThetaEven, 18); + EXPECT_EQ(sizes.nThetaReduced, 10); + EXPECT_EQ(sizes.nThetaEff, 10); + + EXPECT_EQ(sizes.nZnT, 10); + + for (int l = 0; l < sizes.nThetaEff; ++l) { + if (l == 0 || l == sizes.nThetaEff - 1) { + EXPECT_TRUE(IsCloseRelAbs(1.0 / 18, sizes.wInt[l], tolerance)); + } else { + EXPECT_TRUE(IsCloseRelAbs(2.0 / 18, sizes.wInt[l], tolerance)); + } + } + + EXPECT_EQ(sizes.mnsize, 6); + + EXPECT_EQ(sizes.mnmax, 6); +} // CheckSolovev + +TEST(TestSizes, CheckSolovevAnalytical) { + double tolerance = 1.0e-30; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev_analytical.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(sizes.lasym, false); + EXPECT_EQ(sizes.nfp, 1); + EXPECT_EQ(sizes.mpol, 13); + EXPECT_EQ(sizes.ntor, 0); + + // ntheta was 0 in the input file, so compute it here + EXPECT_EQ(sizes.ntheta, 2 * sizes.mpol + 6); + EXPECT_EQ(sizes.nZeta, 1); + + EXPECT_EQ(sizes.lthreed, false); + EXPECT_EQ(sizes.num_basis, 1); + + EXPECT_EQ(sizes.nThetaEven, 32); + EXPECT_EQ(sizes.nThetaReduced, 17); + EXPECT_EQ(sizes.nThetaEff, 17); + + EXPECT_EQ(sizes.nZnT, 17); + + for (int l = 0; l < sizes.nThetaEff; ++l) { + if (l == 0 || l == sizes.nThetaEff - 1) { + EXPECT_TRUE(IsCloseRelAbs(1.0 / 32, sizes.wInt[l], tolerance)); + } else { + EXPECT_TRUE(IsCloseRelAbs(2.0 / 32, sizes.wInt[l], tolerance)); + } + } + + EXPECT_EQ(sizes.mnsize, 13); + + EXPECT_EQ(sizes.mnmax, 13); +} // CheckSolovevAnalytical + +TEST(TestSizes, CheckSolovevNoAxis) { + double tolerance = 1.0e-30; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev_no_axis.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(sizes.lasym, false); + EXPECT_EQ(sizes.nfp, 1); + EXPECT_EQ(sizes.mpol, 6); + EXPECT_EQ(sizes.ntor, 0); + + // ntheta was 0 in the input file, so compute it here + EXPECT_EQ(sizes.ntheta, 2 * sizes.mpol + 6); + EXPECT_EQ(sizes.nZeta, 1); + + EXPECT_EQ(sizes.lthreed, false); + EXPECT_EQ(sizes.num_basis, 1); + + EXPECT_EQ(sizes.nThetaEven, 18); + EXPECT_EQ(sizes.nThetaReduced, 10); + EXPECT_EQ(sizes.nThetaEff, 10); + + EXPECT_EQ(sizes.nZnT, 10); + + for (int l = 0; l < sizes.nThetaEff; ++l) { + if (l == 0 || l == sizes.nThetaEff - 1) { + EXPECT_TRUE(IsCloseRelAbs(1.0 / 18, sizes.wInt[l], tolerance)); + } else { + EXPECT_TRUE(IsCloseRelAbs(2.0 / 18, sizes.wInt[l], tolerance)); + } + } + + EXPECT_EQ(sizes.mnsize, 6); + + EXPECT_EQ(sizes.mnmax, 6); +} // CheckSolovevNoAxis + +TEST(TestSizes, CheckCthLikeFixedBoundary) { + double tolerance = 1.0e-30; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cth_like_fixed_bdy.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(sizes.lasym, false); + EXPECT_EQ(sizes.nfp, 5); + EXPECT_EQ(sizes.mpol, 5); + EXPECT_EQ(sizes.ntor, 4); + + // ntheta was 0 in the input file, so compute it here + EXPECT_EQ(sizes.ntheta, 2 * sizes.mpol + 6); + EXPECT_EQ(sizes.nZeta, 36); + + EXPECT_EQ(sizes.lthreed, true); + EXPECT_EQ(sizes.num_basis, 2); + + EXPECT_EQ(sizes.nThetaEven, 16); + EXPECT_EQ(sizes.nThetaReduced, 9); + EXPECT_EQ(sizes.nThetaEff, 9); + + EXPECT_EQ(sizes.nZnT, 324); + + for (int l = 0; l < sizes.nThetaEff; ++l) { + if (l == 0 || l == sizes.nThetaEff - 1) { + EXPECT_TRUE(IsCloseRelAbs(1.0 / (36 * 16), sizes.wInt[l], tolerance)); + } else { + EXPECT_TRUE(IsCloseRelAbs(2.0 / (36 * 16), sizes.wInt[l], tolerance)); + } + } + + EXPECT_EQ(sizes.mnsize, 25); + + EXPECT_EQ(sizes.mnmax, 41); +} // CheckCthLikeFixedBoundary + +TEST(TestSizes, CheckCma) { + double tolerance = 1.0e-30; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cma.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(sizes.lasym, false); + EXPECT_EQ(sizes.nfp, 2); + EXPECT_EQ(sizes.mpol, 5); + EXPECT_EQ(sizes.ntor, 6); + + // ntheta and nzeta were not specified (=default to 0) in the input file, so + // compute it here + EXPECT_EQ(sizes.ntheta, 2 * sizes.mpol + 6); + EXPECT_EQ(sizes.nZeta, 2 * sizes.ntor + 4); + + EXPECT_EQ(sizes.lthreed, true); + EXPECT_EQ(sizes.num_basis, 2); + + EXPECT_EQ(sizes.nThetaEven, 16); + EXPECT_EQ(sizes.nThetaReduced, 9); + EXPECT_EQ(sizes.nThetaEff, 9); + + EXPECT_EQ(sizes.nZnT, 144); + + for (int l = 0; l < sizes.nThetaEff; ++l) { + if (l == 0 || l == sizes.nThetaEff - 1) { + EXPECT_TRUE(IsCloseRelAbs(1.0 / (16 * 16), sizes.wInt[l], tolerance)); + } else { + EXPECT_TRUE(IsCloseRelAbs(2.0 / (16 * 16), sizes.wInt[l], tolerance)); + } + } + + EXPECT_EQ(sizes.mnsize, 35); + + EXPECT_EQ(sizes.mnmax, 59); +} // CheckCma + +TEST(TestSizes, CheckCthLikeFreeBoundary) { + double tolerance = 1.0e-30; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cth_like_free_bdy.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + + EXPECT_EQ(sizes.lasym, false); + EXPECT_EQ(sizes.nfp, 5); + EXPECT_EQ(sizes.mpol, 5); + EXPECT_EQ(sizes.ntor, 4); + + // ntheta was 0 in the input file, so compute it here + EXPECT_EQ(sizes.ntheta, 2 * sizes.mpol + 6); + EXPECT_EQ(sizes.nZeta, 36); + + EXPECT_EQ(sizes.lthreed, true); + EXPECT_EQ(sizes.num_basis, 2); + + EXPECT_EQ(sizes.nThetaEven, 16); + EXPECT_EQ(sizes.nThetaReduced, 9); + EXPECT_EQ(sizes.nThetaEff, 9); + + EXPECT_EQ(sizes.nZnT, 324); + + for (int l = 0; l < sizes.nThetaEff; ++l) { + if (l == 0 || l == sizes.nThetaEff - 1) { + EXPECT_TRUE(IsCloseRelAbs(1.0 / (36 * 16), sizes.wInt[l], tolerance)); + } else { + EXPECT_TRUE(IsCloseRelAbs(2.0 / (36 * 16), sizes.wInt[l], tolerance)); + } + } + + EXPECT_EQ(sizes.mnsize, 25); + + EXPECT_EQ(sizes.mnmax, 41); +} // CheckCthLikeFreeBoundary + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/vmec_indata/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/vmec_indata/BUILD.bazel new file mode 100644 index 000000000..56a428896 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/vmec_indata/BUILD.bazel @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "vmec_indata_test", + srcs = ["vmec_indata_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_analytical", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/common/vmec_indata", + "//vmecpp/common/vmec_indata:boundary_from_json", + "@googletest//:gtest_main", + "@bazel_tools//tools/cpp/runfiles", + "//util/file_io:file_io", + "//vmecpp/common/composed_types_lib:composed_types_lib", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/vmec_indata/vmec_indata_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/vmec_indata/vmec_indata_test.cc new file mode 100644 index 000000000..0392d295b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/common/vmec_indata/vmec_indata_test.cc @@ -0,0 +1,805 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/common/vmec_indata/vmec_indata.h" + +#include + +#include +#include + +#include "absl/log/check.h" +#include "absl/status/statusor.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "vmecpp/common/composed_types_lib/composed_types_lib.h" + +namespace fs = std::filesystem; + +namespace vmecpp { + +using ::file_io::ReadFile; + +using composed_types::CoefficientsRCos; +using composed_types::CoefficientsRSin; +using composed_types::CoefficientsZCos; +using composed_types::CoefficientsZSin; +using composed_types::CurveRZFourier; +using composed_types::CurveRZFourierFromCsv; +using composed_types::SurfaceRZFourier; +using composed_types::SurfaceRZFourierFromCsv; + +using nlohmann::json; + +using testing::ElementsAre; +using testing::ElementsAreArray; + +// The tests below are setup to check that the input file contents were +// correctly parsed. The reference values come from manual parsing, i.e., +// looking at the Fortran input file and copying over the values by hand. +// The purpose of these tests is to make sure that for all input files, +// the whole chain of (Fortran input file) -> (indata2json) -> (VMEC++ JSON +// input file) +// -> (JSON parsing) -> (VmecINDATA setup from JSON) works. +// As long as these tests work, we can be sure that inputs that the Reference +// Fortran VMEC saw and thus the corresponding Fortran reference data is +// actually what VMEC++ is to be compared against if given the JSON input file +// under test here. + +TEST(TestVmecINDATA, CheckParsingSolovev) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 1); + EXPECT_EQ(vmec_indata->mpol, 6); + EXPECT_EQ(vmec_indata->ntor, 0); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 0); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(5, 11, 55)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-12, 1.0e-12, 1.0e-12)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(1000, 2000, 2000)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, 1.0); + EXPECT_EQ(vmec_indata->ncurr, 0); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "power_series"); + EXPECT_THAT(vmec_indata->am, ElementsAre(0.125, -0.125)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 1.0); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_THAT(vmec_indata->ai, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "power_series"); + EXPECT_EQ(vmec_indata->ac.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 0.0); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, false); + EXPECT_EQ(vmec_indata->mgrid_file, "NONE"); + EXPECT_EQ(vmec_indata->extcur.size(), 0); + EXPECT_EQ(vmec_indata->nvacskip, 1); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 250); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 0.9); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()); + + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingSolovev + +TEST(TestVmecINDATA, CheckParsingSolovevAnalytical) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev_analytical.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 1); + EXPECT_EQ(vmec_indata->mpol, 13); + EXPECT_EQ(vmec_indata->ntor, 0); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 0); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(31)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-16)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(2000)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, 3.141592653590); + EXPECT_EQ(vmec_indata->ncurr, 1); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "power_series"); + EXPECT_THAT(vmec_indata->am, ElementsAre(1.0, -1.0)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 9.947183943243e+04); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_EQ(vmec_indata->ai.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "power_series"); + EXPECT_THAT( + vmec_indata->ac, + ElementsAre(9.798989768026e-01, 3.499639202867e-02, 6.561823505375e-03, + 1.367046563620e-03, 2.990414357918e-04, 6.728432305316e-05, + 1.541932403302e-05, 3.579485936236e-06, 8.389420163053e-07, + 1.980835316276e-07, 4.704483876156e-08, 1.122660924992e-08, + 2.689708466126e-09, 6.465645351265e-10)); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 2.823753282890e+06); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, false); + EXPECT_EQ(vmec_indata->mgrid_file, "NONE"); + EXPECT_EQ(vmec_indata->extcur.size(), 0); + EXPECT_EQ(vmec_indata->nvacskip, 1); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 100); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 1.0); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "axis_coefficients_solovev_analytical.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()) + << axis_coefficients_csv.status().message(); + + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "boundary_coefficients_solovev_analytical.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingSolovevAnalytical + +TEST(TestVmecINDATA, CheckParsingSolovevNoAxis) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev_no_axis.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 1); + EXPECT_EQ(vmec_indata->mpol, 6); + EXPECT_EQ(vmec_indata->ntor, 0); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 0); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(5, 11)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-12, 1.0e-12)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(1000, 2000)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, 1.0); + EXPECT_EQ(vmec_indata->ncurr, 0); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "power_series"); + EXPECT_THAT(vmec_indata->am, ElementsAre(0.125, -0.125)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 1.0); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_THAT(vmec_indata->ai, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "power_series"); + EXPECT_EQ(vmec_indata->ac.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 0.0); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, false); + EXPECT_EQ(vmec_indata->mgrid_file, "NONE"); + EXPECT_EQ(vmec_indata->extcur.size(), 0); + EXPECT_EQ(vmec_indata->nvacskip, 1); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 250); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 0.9); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_no_axis.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()); + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "boundary_coefficients_solovev_no_axis.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingSolovevNoAxis + +TEST(TestVmecINDATA, CheckParsingCthLikeFixedBoundary) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cth_like_fixed_bdy.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 5); + EXPECT_EQ(vmec_indata->mpol, 5); + EXPECT_EQ(vmec_indata->ntor, 4); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 36); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(25)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-6)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(25000)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, -0.035); + EXPECT_EQ(vmec_indata->ncurr, 1); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "two_power"); + EXPECT_THAT(vmec_indata->am, ElementsAre(1.0, 5.0, 10.0)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 432.29080924603676); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_EQ(vmec_indata->ai.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "two_power"); + EXPECT_THAT(vmec_indata->ac, ElementsAre(1.0, 5.0, 10.0)); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 43229.08092460368); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, false); + EXPECT_EQ(vmec_indata->mgrid_file, "NONE"); + EXPECT_EQ(vmec_indata->extcur.size(), 0); + EXPECT_EQ(vmec_indata->nvacskip, 1); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 200); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 0.7); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "axis_coefficients_cth_like_fixed_bdy.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()); + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "boundary_coefficients_cth_like_fixed_bdy.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingCthLikeFixedBoundary + +TEST(TestVmecINDATA, CheckParsingCthLikeFixedBoundaryNZeta37) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cth_like_fixed_bdy_nzeta_37.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 5); + EXPECT_EQ(vmec_indata->mpol, 5); + EXPECT_EQ(vmec_indata->ntor, 4); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 37); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(25)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-6)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(25000)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, -0.035); + EXPECT_EQ(vmec_indata->ncurr, 1); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "two_power"); + EXPECT_THAT(vmec_indata->am, ElementsAre(1.0, 5.0, 10.0)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 432.29080924603676); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_EQ(vmec_indata->ai.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "two_power"); + EXPECT_THAT(vmec_indata->ac, ElementsAre(1.0, 5.0, 10.0)); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 43229.08092460368); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, false); + EXPECT_EQ(vmec_indata->mgrid_file, "NONE"); + EXPECT_EQ(vmec_indata->extcur.size(), 0); + EXPECT_EQ(vmec_indata->nvacskip, 1); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 200); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 0.7); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "axis_coefficients_cth_like_fixed_bdy_nzeta_37.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()); + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "boundary_coefficients_cth_like_fixed_bdy_nzeta_37.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingCthLikeFixedBoundaryNZeta37 + +TEST(TestVmecINDATA, CheckParsingCma) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cma.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 2); + EXPECT_EQ(vmec_indata->mpol, 5); + EXPECT_EQ(vmec_indata->ntor, 6); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 0); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(25, 51)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-6, 1.0e-6)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(1000, 60000)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, 0.03); + EXPECT_EQ(vmec_indata->ncurr, 1); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "power_series"); + EXPECT_THAT(vmec_indata->am, ElementsAre(0.0)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 1.0); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_EQ(vmec_indata->ai.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "power_series"); + EXPECT_THAT(vmec_indata->ac, ElementsAre(0.0)); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 0.0); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, false); + EXPECT_EQ(vmec_indata->mgrid_file, "NONE"); + EXPECT_EQ(vmec_indata->extcur.size(), 0); + EXPECT_EQ(vmec_indata->nvacskip, 1); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 200); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 0.5); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = + ReadFile("vmecpp_large_cpp_tests/test_data/axis_coefficients_cma.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()); + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/boundary_coefficients_cma.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingCma + +TEST(TestVmecINDATA, CheckParsingCthLikeFreeBoundary) { + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/cth_like_free_bdy.json"); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // numerical resolution, symmetry assumption + EXPECT_EQ(vmec_indata->lasym, false); + EXPECT_EQ(vmec_indata->nfp, 5); + EXPECT_EQ(vmec_indata->mpol, 5); + EXPECT_EQ(vmec_indata->ntor, 4); + EXPECT_EQ(vmec_indata->ntheta, 0); + EXPECT_EQ(vmec_indata->nzeta, 36); + + // multi-grid steps + EXPECT_THAT(vmec_indata->ns_array, ElementsAre(15)); + EXPECT_THAT(vmec_indata->ftol_array, ElementsAre(1.0e-10)); + EXPECT_THAT(vmec_indata->niter_array, ElementsAre(2500)); + + // global physics parameters + EXPECT_EQ(vmec_indata->phiedge, -0.035); + EXPECT_EQ(vmec_indata->ncurr, 1); + + // mass / pressure profile + EXPECT_EQ(vmec_indata->pmass_type, "two_power"); + EXPECT_THAT(vmec_indata->am, ElementsAre(1.0, 5.0, 10.0)); + EXPECT_EQ(vmec_indata->am_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->am_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->pres_scale, 432.29080924603676); + EXPECT_EQ(vmec_indata->gamma, 0.0); + EXPECT_EQ(vmec_indata->spres_ped, 1.0); + + // (initial guess for) iota profile + EXPECT_EQ(vmec_indata->piota_type, "power_series"); + EXPECT_EQ(vmec_indata->ai.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ai_aux_f.size(), 0); + + // enclosed toroidal current profile + EXPECT_EQ(vmec_indata->pcurr_type, "two_power"); + EXPECT_THAT(vmec_indata->ac, ElementsAre(1.0, 5.0, 10.0)); + EXPECT_EQ(vmec_indata->ac_aux_s.size(), 0); + EXPECT_EQ(vmec_indata->ac_aux_f.size(), 0); + EXPECT_EQ(vmec_indata->curtor, 43229.08092460368); + EXPECT_EQ(vmec_indata->bloat, 1.0); + + // free-boundary parameters + EXPECT_EQ(vmec_indata->lfreeb, true); + EXPECT_EQ(vmec_indata->mgrid_file, "vmecpp/test_data/mgrid_cth_like.nc"); + EXPECT_THAT(vmec_indata->extcur, ElementsAre(4700.0, 1000.0)); + EXPECT_EQ(vmec_indata->nvacskip, 9); + + // tweaking parameters + EXPECT_EQ(vmec_indata->nstep, 100); + EXPECT_THAT(vmec_indata->aphi, ElementsAre(1.0)); + EXPECT_EQ(vmec_indata->delt, 0.7); + EXPECT_EQ(vmec_indata->tcon0, 1.0); + EXPECT_EQ(vmec_indata->lforbal, false); + + // initial guess for magnetic axis + absl::StatusOr axis_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "axis_coefficients_cth_like_free_bdy.csv"); + ASSERT_TRUE(axis_coefficients_csv.ok()); + absl::StatusOr axis_coefficients = + CurveRZFourierFromCsv(*axis_coefficients_csv); + ASSERT_TRUE(axis_coefficients.ok()); + EXPECT_THAT(vmec_indata->raxis_c, + ElementsAreArray(*CoefficientsRCos(*axis_coefficients))); + EXPECT_THAT(vmec_indata->zaxis_s, + ElementsAreArray(*CoefficientsZSin(*axis_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(*vmec_indata->raxis_s, + ElementsAreArray(*CoefficientsRSin(*axis_coefficients))); + EXPECT_THAT(*vmec_indata->zaxis_c, + ElementsAreArray(*CoefficientsZCos(*axis_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->raxis_s.has_value()); + EXPECT_FALSE(vmec_indata->zaxis_c.has_value()); + } + + // (initial guess for) boundary shape + absl::StatusOr boundary_coefficients_csv = ReadFile( + "vmecpp_large_cpp_tests/test_data/" + "boundary_coefficients_cth_like_free_bdy.csv"); + ASSERT_TRUE(boundary_coefficients_csv.ok()); + absl::StatusOr boundary_coefficients = + SurfaceRZFourierFromCsv(*boundary_coefficients_csv); + ASSERT_TRUE(boundary_coefficients.ok()); + EXPECT_THAT(vmec_indata->rbc.transpose().reshaped(), + ElementsAreArray(*CoefficientsRCos(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbs.transpose().reshaped(), + ElementsAreArray(*CoefficientsZSin(*boundary_coefficients))); + if (vmec_indata->lasym) { + EXPECT_THAT(vmec_indata->rbs->transpose().reshaped(), + ElementsAreArray(*CoefficientsRSin(*boundary_coefficients))); + EXPECT_THAT(vmec_indata->zbc->transpose().reshaped(), + ElementsAreArray(*CoefficientsZCos(*boundary_coefficients))); + } else { + EXPECT_FALSE(vmec_indata->rbs.has_value()); + EXPECT_FALSE(vmec_indata->zbc.has_value()); + } +} // CheckParsingCthLikeFreeBoundary + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/external_magnetic_field/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/external_magnetic_field/BUILD.bazel new file mode 100644 index 000000000..47741c38d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/external_magnetic_field/BUILD.bazel @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "external_magnetic_field_test", + srcs = ["external_magnetic_field_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/external_magnetic_field", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/external_magnetic_field/external_magnetic_field_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/external_magnetic_field/external_magnetic_field_test.cc new file mode 100644 index 000000000..de9ca1097 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/external_magnetic_field/external_magnetic_field_test.cc @@ -0,0 +1,159 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/external_magnetic_field/external_magnetic_field.h" + +#include +#include +#include + +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class ExternalMagneticFieldTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ExternalMagneticFieldTest, CheckExternalMagneticField) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_BEXTERN, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_bextern/" + "vac1n_bextern_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_bextern(filename); + ASSERT_TRUE(ifs_vac1n_bextern.is_open()); + json vac1n_bextern = json::parse(ifs_vac1n_bextern); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const FreeBoundaryBase& n = *vmec.fb_[thread_id]; + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + const ExternalMagneticField& ef = n.GetExternalMagneticField(); + + // current along magnetic axis in Amperes + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["axis_current"], ef.axis_current, + tolerance)); + + // axis geometry + for (int k = 0; k < s.nZeta * s.nfp + 1; ++k) { + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["xpts_axis"][0][k], + ef.axisXYZ[k * 3 + 0], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["xpts_axis"][1][k], + ef.axisXYZ[k * 3 + 1], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["xpts_axis"][2][k], + ef.axisXYZ[k * 3 + 2], tolerance)); + } // k + + // local tangential partition + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + // test mgrid contribution on its own + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["mgrid_brad"][k][l], + ef.interpBr[klRel], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["mgrid_bphi"][k][l], + ef.interpBp[klRel], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["mgrid_bz"][k][l], + ef.interpBz[klRel], tolerance)); + + // test axis current contribution on its own + EXPECT_TRUE( + IsCloseRelAbs(static_cast(vac1n_bextern["brad"][k][l]) - + ef.interpBr[klRel], + ef.curtorBr[klRel], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(static_cast(vac1n_bextern["bphi"][k][l]) - + ef.interpBp[klRel], + ef.curtorBp[klRel], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + static_cast(vac1n_bextern["bz"][k][l]) - ef.interpBz[klRel], + ef.curtorBz[klRel], tolerance)); + + // add contributions together for testing sum (that is what is output + // from bextern in educational_VMEC) + double fullBr = ef.interpBr[klRel] + ef.curtorBr[klRel]; + double fullBp = ef.interpBp[klRel] + ef.curtorBp[klRel]; + double fullBz = ef.interpBz[klRel] + ef.curtorBz[klRel]; + + // test full field + EXPECT_TRUE( + IsCloseRelAbs(vac1n_bextern["brad"][k][l], fullBr, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(vac1n_bextern["bphi"][k][l], fullBp, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(vac1n_bextern["bz"][k][l], fullBz, tolerance)); + + // test quantities derived from full field + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["bexu"][k][l], ef.bSubU[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["bexv"][k][l], ef.bSubV[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bextern["bexn"][k][l], ef.bDotN[klRel], + tolerance)); + + // bexni is not tested here, since it is computed on-the-fly where + // needed. + } // kl + } // thread_id + } +} // CheckExternalMagneticField + +// NOTE: tolerance is a little more loose here, since Fortran VMEC still uses +// the bsc_t old Biot-Savart module, whereas VMEC++ uses ABSCAB. (The mgrid file +// can be computed using ABSCAB already via //makegrid/makegrid_standalone.) +INSTANTIATE_TEST_SUITE_P(TestExternalMagneticField, ExternalMagneticFieldTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-10, + .iter2_to_test = {53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/laplace_solver/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/laplace_solver/BUILD.bazel new file mode 100644 index 000000000..433ea4c97 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/laplace_solver/BUILD.bazel @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "laplace_solver_test", + srcs = ["laplace_solver_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/laplace_solver", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/laplace_solver/laplace_solver_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/laplace_solver/laplace_solver_test.cc new file mode 100644 index 000000000..76108ae1a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/laplace_solver/laplace_solver_test.cc @@ -0,0 +1,748 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/laplace_solver/laplace_solver.h" + +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class FourPTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourPTest, CheckFourP) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_FOURP, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_fourp/" + "vac1n_fourp_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_fourp(filename); + ASSERT_TRUE(ifs_vac1n_fourp.is_open()); + json vac1n_fourp = json::parse(ifs_vac1n_fourp); + + const int nf = s.ntor; + const int mf = s.mpol + 1; + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + const int numLocal = tp.ztMax - tp.ztMin; + + const SingularIntegrals& si = n.GetSingularIntegrals(); + const LaplaceSolver& ls = n.GetLaplaceSolver(); + + if (vmec.m_[0]->get_ivacskip() == 0) { + // grpmn can be tested here already, as there is no reduction over + // threads involved + for (int n = 0; n < nf + 1; ++n) { + for (int m = 0; m < mf + 1; ++m) { + const int idx_m_posn = (nf + n) * (mf + 1) + m; + const int idx_m_negn = (nf - n) * (mf + 1) + m; + + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + // cmns in Fortran has alp (= 2 pi / nfp) in it; VMEC++ does not + const double scale_to_match_fortran_singular = 2.0 * M_PI / s.nfp; + + // These are tested already in singular_integrals_test:AnalytTest + const double grpmn_sin_singular_posn = + scale_to_match_fortran_singular * + si.grpmn_sin[idx_m_posn * numLocal + klRel]; + const double grpmn_sin_singular_negn = + scale_to_match_fortran_singular * + si.grpmn_sin[idx_m_negn * numLocal + klRel]; + + // cosn, sinn have 1/nfp in them; VMEC++ does not have that + // --> [(2 pi)/nfp] / [1/nfp] == 2 pi + const double scale_to_match_fortran_regular = 2.0 * M_PI; + + // These are the ones actually under test here; computed in + // LaplaceSolver::transformGreensDerivative + const double grpmn_sin_regular_posn = + scale_to_match_fortran_regular * + ls.grpmn_sin[idx_m_posn * numLocal + klRel]; + const double grpmn_sin_regular_negn = + scale_to_match_fortran_regular * + ls.grpmn_sin[idx_m_negn * numLocal + klRel]; + + // compute stand-alone reference values for + // transformGreensDerivative output + const double grpmn_sin_reference_posn = + static_cast(vac1n_fourp["grpmn"][m][nf + n][k][l]) - + grpmn_sin_singular_posn; + const double grpmn_sin_reference_negn = + static_cast(vac1n_fourp["grpmn"][m][nf - n][k][l]) - + grpmn_sin_singular_negn; + + // TODO(jons): for lasym, need cos-part of grpmn from + // educational_VMEC + EXPECT_TRUE(IsCloseRelAbs(grpmn_sin_reference_posn, + grpmn_sin_regular_posn, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(grpmn_sin_reference_negn, + grpmn_sin_regular_negn, tolerance)); + } // kl + } // m + } // n + } // fullUpdate + } // thread_id + } +} // CheckFourP + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, FourPTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +class FourISymmTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourISymmTest, CheckFourISymm) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_FOURI_SYMM, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_fouri/" + "vac1n_fouri_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_fouri(filename); + ASSERT_TRUE(ifs_vac1n_fouri.is_open()); + json vac1n_fouri = json::parse(ifs_vac1n_fouri); + + // accumulate contributions from all threads + // in order to compare against Fortran single-threaded data + std::vector gstore_symm(s.nThetaReduced * s.nZeta); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const LaplaceSolver& ls = n.GetLaplaceSolver(); + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int kl = 0; kl < s.nThetaReduced * s.nZeta; ++kl) { + gstore_symm[kl] += ls.gstore_symm[kl]; + } // kl + } // fullUpdate + } // thread_id + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int l = 0; l < s.nThetaReduced; ++l) { + for (int k = 0; k < s.nZeta; ++k) { + const int kl = l * s.nZeta + k; + + // gstore gets (2 pi) / nfp in RegularizedIntegrals in VMEC++; not in + // Fortran VMEC/Nestor. source gets 1/nfp in fouri; not in VMEC++ + // --> [(2 pi)/nfp] / [1/nfp] == 2 pi + const double factor_to_match_fortran = 2.0 * M_PI; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_fouri["source"][k][l], + factor_to_match_fortran * gstore_symm[kl], + tolerance)); + } // k + } // l + } // fullUpdate + } +} // CheckFourISymm + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, FourISymmTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +class FourIAccumulateGrpmnTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourIAccumulateGrpmnTest, CheckFourIAccumulateGrpmn) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_FOURI_KV_DFT, number_of_iterations) + .value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_fourp/" + "vac1n_fourp_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_fourp(filename); + ASSERT_TRUE(ifs_vac1n_fourp.is_open()); + json vac1n_fourp = json::parse(ifs_vac1n_fourp); + + const int nf = s.ntor; + const int mf = s.mpol + 1; + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + const int numLocal = tp.ztMax - tp.ztMin; + + const LaplaceSolver& ls = n.GetLaplaceSolver(); + + if (vmec.m_[0]->get_ivacskip() == 0) { + // grpmn can be tested here already, as there is no reduction over + // threads involved + for (int n = 0; n < nf + 1; ++n) { + for (int m = 0; m < mf + 1; ++m) { + const int idx_m_posn = (nf + n) * (mf + 1) + m; + const int idx_m_negn = (nf - n) * (mf + 1) + m; + + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + // cosn, sinn have 1/nfp in them; VMEC++ does not have that + // --> [(2 pi)/nfp] / [1/nfp] == 2 pi + const double scale_to_match_fortran_regular = 2.0 * M_PI; + + // These are the ones actually under test here; computed in + // LaplaceSolver::transformGreensDerivative + const double grpmn_sin_regular_posn = + scale_to_match_fortran_regular * + ls.grpmn_sin[idx_m_posn * numLocal + klRel]; + const double grpmn_sin_regular_negn = + scale_to_match_fortran_regular * + ls.grpmn_sin[idx_m_negn * numLocal + klRel]; + + // TODO(jons): for lasym, need cos-part of grpmn from + // educational_VMEC + EXPECT_TRUE(IsCloseRelAbs(vac1n_fourp["grpmn"][m][nf + n][k][l], + grpmn_sin_regular_posn, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_fourp["grpmn"][m][nf - n][k][l], + grpmn_sin_regular_negn, tolerance)); + } // kl + } // m + } // n + } // fullUpdate + } // thread_id + } +} // CheckFourIAccumulateGrpmn + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, FourIAccumulateGrpmnTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +class FourIKvDftTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourIKvDftTest, CheckFourIKvDft) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_FOURI_KV_DFT, number_of_iterations) + .value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_fouri/" + "vac1n_fouri_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_fouri(filename); + ASSERT_TRUE(ifs_vac1n_fouri.is_open()); + json vac1n_fouri = json::parse(ifs_vac1n_fouri); + + const int mf = s.mpol + 1; + const int nf = s.ntor; + const int mnpd = (mf + 1) * (2 * nf + 1); + + // Accumulate contributions from all threads + // to complete the toroidal Fourier integrals. + std::vector bcos_full((2 * nf + 1) * s.nThetaReduced); + std::vector bsin_full((2 * nf + 1) * s.nThetaReduced); + const int size_a_temp = mnpd * (2 * nf + 1) * s.nThetaEff; + std::vector actemp_full(size_a_temp, 0.0); + std::vector astemp_full(size_a_temp); + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const LaplaceSolver& ls = n.GetLaplaceSolver(); + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int all_n = 0; all_n < 2 * nf + 1; ++all_n) { + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_nl = all_n * s.nThetaReduced + l; + bcos_full[idx_nl] += ls.bcos[idx_nl]; + bsin_full[idx_nl] += ls.bsin[idx_nl]; + } // l + } // n + + for (int mn = 0; mn < mnpd; ++mn) { + for (int n = 0; n < nf + 1; ++n) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_a_posn = + (mn * (2 * nf + 1) + (nf + n)) * s.nThetaEff + l; + actemp_full[idx_a_posn] += ls.actemp[idx_a_posn]; + astemp_full[idx_a_posn] += ls.astemp[idx_a_posn]; + if (n > 0) { + const int idx_a_negn = + (mn * (2 * nf + 1) + (nf - n)) * s.nThetaEff + l; + actemp_full[idx_a_negn] += ls.actemp[idx_a_negn]; + astemp_full[idx_a_negn] += ls.astemp[idx_a_negn]; + } + } // kl' + } // n + } // mn + } // fullUpdate + } // thread_id + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int n = 0; n < nf + 1; ++n) { + for (int l = 0; l < s.nThetaReduced; ++l) { + const int idx_l_posn = (nf + n) * s.nThetaReduced + l; + const int idx_l_negn = (nf - n) * s.nThetaReduced + l; + + // gstore gets (2 pi) / nfp in RegularizedIntegrals in VMEC++; not in + // Fortran VMEC/Nestor. source gets 1/nfp in fouri; not in VMEC++ + // --> [(2 pi)/nfp] / [1/nfp] == 2 pi + const double factor_to_match_fortran = 2.0 * M_PI; + + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["bcos"][l][nf + n], + factor_to_match_fortran * bcos_full[idx_l_posn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["bcos"][l][nf - n], + factor_to_match_fortran * bcos_full[idx_l_negn], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["bsin"][l][nf + n], + factor_to_match_fortran * bsin_full[idx_l_posn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["bsin"][l][nf - n], + factor_to_match_fortran * bsin_full[idx_l_negn], tolerance)); + } // l + } // n + + for (int mn = 0; mn < mnpd; ++mn) { + // linear index representing -nf:nf + const int np = mn / (mf + 1); + const int mp = mn % (mf + 1); + for (int n = 0; n < nf + 1; ++n) { + for (int l = 0; l < s.nThetaEff; ++l) { + // same as for grpmn_sin after AccumulateFullGrpmn + const double scale_to_match_fortran = 2.0 * M_PI; + + const int idx_a_posn = + (mn * (2 * nf + 1) + (nf + n)) * s.nThetaEff + l; + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["actemp"][mp][np][nf + n][l], + scale_to_match_fortran * actemp_full[idx_a_posn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["astemp"][mp][np][nf + n][l], + scale_to_match_fortran * astemp_full[idx_a_posn], tolerance)); + if (n > 0) { + const int idx_a_negn = + (mn * (2 * nf + 1) + (nf - n)) * s.nThetaEff + l; + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["actemp"][mp][np][nf - n][l], + scale_to_match_fortran * actemp_full[idx_a_negn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["astemp"][mp][np][nf - n][l], + scale_to_match_fortran * astemp_full[idx_a_negn], tolerance)); + } + } // kl' + } // n + } // mn + } // fullUpdate + } +} // CheckFourIKvDft + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, FourIKvDftTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +class FourIKuDftTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourIKuDftTest, CheckFourIKuDft) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_FOURI_KU_DFT, number_of_iterations) + .value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_fouri/" + "vac1n_fouri_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_fouri(filename); + ASSERT_TRUE(ifs_vac1n_fouri.is_open()); + json vac1n_fouri = json::parse(ifs_vac1n_fouri); + + const int mf = s.mpol + 1; + const int nf = s.ntor; + const int mnpd = (mf + 1) * (2 * nf + 1); + + // bvec is only accumulated in SolveForPotential, + // there must construct it here as well for testing + std::vector bvec_sin(mnpd); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const LaplaceSolver& ls = n.GetLaplaceSolver(); + const SingularIntegrals& si = n.GetSingularIntegrals(); + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int mn = 0; mn < mnpd; ++mn) { + bvec_sin[mn] += ls.bvec_sin[mn] + si.bvec_sin[mn] / s.nfp; + } // mn + } // fullUpdate + } // thread_id + + // also need to set some elements to 0, as done in SolveForPotential: + // set n = [-nf, ..., -1], m=0 elements to zero + // --> only have unique non-zero Fourier coefficients in linear system! + for (int all_n = 0; all_n < nf; ++all_n) { + const int m = 0; + bvec_sin[all_n * (mf + 1) + m] = 0.0; + } + + // gstore gets (2 pi) / nfp in RegularizedIntegrals in VMEC++; not in + // Fortran VMEC/Nestor. source gets 1/nfp in fouri; not in VMEC++ + // --> [(2 pi)/nfp] / [1/nfp] == 2 pi + // (2 pi)^2 comes in Fortran VMEC into the game in fouri when using cosui, + // sinui, which have alu, alv in them + const double scale_to_match_fortran = 2.0 * M_PI * 4.0 * M_PI * M_PI; + + // perform the actual test in a single thread, + // where the data from all threads has been accumulated already + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int mn = 0; mn < mnpd; ++mn) { + // linear index representing -nf:nf + const int np = mn / (mf + 1); + const int mp = mn % (mf + 1); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_fouri["bvec"][mp][np], + scale_to_match_fortran * bvec_sin[mn], + tolerance)); + } // mn + + for (int mn = 0; mn < mnpd; ++mn) { + // linear index representing -nf:nf + const int n = mn / (mf + 1); + const int m = mn % (mf + 1); + + for (int mnp = 0; mnp < mnpd; ++mnp) { + // linear index representing -nf:nf + const int np = mnp / (mf + 1); + const int mp = mnp % (mf + 1); + + EXPECT_TRUE(IsCloseRelAbs( + vac1n_fouri["amatrix"][m][n][mp][np], + scale_to_match_fortran * vmec.matrixShare[mnp * mnpd + mn], + tolerance)); + } // mn' + } // mn + } // fullUpdate + } +} // CheckFourIKuDft + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, FourIKuDftTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +class SolverInputsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(SolverInputsTest, CheckSolverInputs) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_FOURI_KU_DFT, number_of_iterations) + .value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_solver/" + "vac1n_solver_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_solver(filename); + ASSERT_TRUE(ifs_vac1n_solver.is_open()); + json vac1n_solver = json::parse(ifs_vac1n_solver); + + const int mf = s.mpol + 1; + const int nf = s.ntor; + const int mnpd = (mf + 1) * (2 * nf + 1); + + // bvec is only accumulated in SolveForPotential, + // there must construct it here as well for testing + std::vector bvec_sin(mnpd); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const LaplaceSolver& ls = n.GetLaplaceSolver(); + const SingularIntegrals& si = n.GetSingularIntegrals(); + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int mn = 0; mn < mnpd; ++mn) { + bvec_sin[mn] += ls.bvec_sin[mn] + si.bvec_sin[mn] / s.nfp; + } // mn + } // fullUpdate + } // thread_id + + // also need to set some elements to 0, as done in SolveForPotential: + // set n = [-nf, ..., -1], m=0 elements to zero + // --> only have unique non-zero Fourier coefficients in linear system! + for (int all_n = 0; all_n < nf; ++all_n) { + const int m = 0; + bvec_sin[all_n * (mf + 1) + m] = 0.0; + } + + // gstore gets (2 pi) / nfp in RegularizedIntegrals in VMEC++; not in + // Fortran VMEC/Nestor. source gets 1/nfp in fouri; not in VMEC++ + // --> [(2 pi)/nfp] / [1/nfp] == 2 pi + // (2 pi)^2 comes in Fortran VMEC into the game in fouri when using cosui, + // sinui, which have alu, alv in them + const double scale_to_match_fortran = 2.0 * M_PI * 4.0 * M_PI * M_PI; + + // perform the actual test in a single thread, + // where the data from all threads has been accumulated already + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int mn = 0; mn < mnpd; ++mn) { + EXPECT_TRUE(IsCloseRelAbs(vac1n_solver["potvac_in"][mn], + scale_to_match_fortran * bvec_sin[mn], + tolerance)); + } // mn + + for (int mn = 0; mn < mnpd; ++mn) { + for (int mnp = 0; mnp < mnpd; ++mnp) { + EXPECT_TRUE(IsCloseRelAbs( + vac1n_solver["amatrix"][mn][mnp], + scale_to_match_fortran * vmec.matrixShare[mnp * mnpd + mn], + tolerance)); + } // mn' + } // mn + } // fullUpdate + } +} // CheckSolverInputs + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, SolverInputsTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +class LinearSolverTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(LinearSolverTest, CheckLinearSolver) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_SOLVER, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_solver/" + "vac1n_solver_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_solver(filename); + ASSERT_TRUE(ifs_vac1n_solver.is_open()); + json vac1n_solver = json::parse(ifs_vac1n_solver); + + const int mf = s.mpol + 1; + const int nf = s.ntor; + const int mnpd = (mf + 1) * (2 * nf + 1); + + // perform the actual test in a single thread, + // where the data from all threads has been accumulated already + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int mn = 0; mn < mnpd; ++mn) { + EXPECT_TRUE(IsCloseRelAbs(vac1n_solver["potvac_out"][mn], + vmec.bvecShare[mn], tolerance)); + } // mn + } // fullUpdate + } +} // CheckLinearSolver + +INSTANTIATE_TEST_SUITE_P(TestLaplaceSolver, LinearSolverTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/mgrid_provider/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/mgrid_provider/BUILD.bazel new file mode 100644 index 000000000..ba98ad00c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/mgrid_provider/BUILD.bazel @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "mgrid_provider_test", + srcs = ["mgrid_provider_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/mgrid_provider", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/magnetic_configuration_lib:magnetic_configuration_lib", + "//vmecpp/common/magnetic_field_provider:magnetic_field_provider_lib", + ], +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/mgrid_provider/mgrid_provider_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/mgrid_provider/mgrid_provider_test.cc new file mode 100644 index 000000000..5cc996a2c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/mgrid_provider/mgrid_provider_test.cc @@ -0,0 +1,219 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/mgrid_provider/mgrid_provider.h" + +#include +#include +#include + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include + +#include "absl/strings/str_format.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/netcdf_io/netcdf_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/magnetic_configuration_lib/magnetic_configuration_lib.h" +#include "vmecpp/common/magnetic_field_provider/magnetic_field_provider_lib.h" +#include "vmecpp/common/util/util.h" + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using netcdf_io::NetcdfReadArray3D; +using netcdf_io::NetcdfReadBool; +using netcdf_io::NetcdfReadDouble; +using netcdf_io::NetcdfReadInt; +using testing::IsCloseRelAbs; + +using magnetics::ImportMagneticConfigurationFromMakegrid; +using magnetics::MagneticConfiguration; +using magnetics::MagneticField; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +namespace vmecpp { + +// used to specify case-specific tolerances +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::string coils_file = ""; +}; + +class LoadMGridTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(LoadMGridTest, CheckLoadMGrid) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // This test is only meaningful in case of a free-boundary run + ASSERT_TRUE(vmec_indata->lfreeb); + + // make sure the mgrid file is available + std::ifstream mgrid_file(vmec_indata->mgrid_file); + ASSERT_TRUE(mgrid_file.is_open()); + mgrid_file.close(); + + MGridProvider mgrid; + absl::Status load_status = + mgrid.LoadFile(vmec_indata->mgrid_file, vmec_indata->extcur); + ASSERT_TRUE(load_status.ok()) << load_status; + + // The reference calculation for comparison is done using + // //magnetics/magnetic_field_provider (which internally uses ABSCAB). + std::filesystem::path makegrid_coils_file = + "vmecpp/test_data/" + data_source_.coils_file; + + // load MagneticConfiguration from coils file + absl::StatusOr magnetic_configuration = + magnetics::ImportMagneticConfigurationFromCoilsFile(makegrid_coils_file); + ASSERT_TRUE(magnetic_configuration.ok()); + + // get coil currents in A from INDATA and put them into the + // MagneticConfiguration + absl::Status status_set_currents = magnetics::SetCircuitCurrents( + vmec_indata->extcur, *magnetic_configuration); + ASSERT_TRUE(status_set_currents.ok()); + + // get dimensions of mgrid file + int ncid = 0; + ASSERT_EQ(nc_open(vmec_indata->mgrid_file.c_str(), NC_NOWRITE, &ncid), + NC_NOERR); + + const int number_of_field_periods = NetcdfReadInt(ncid, "nfp").value(); + + const int number_of_r_grid_points = NetcdfReadInt(ncid, "ir").value(); + const double r_grid_minimum = NetcdfReadDouble(ncid, "rmin").value(); + const double r_grid_maximum = NetcdfReadDouble(ncid, "rmax").value(); + const double r_grid_increment = + (r_grid_maximum - r_grid_minimum) / (number_of_r_grid_points - 1.0); + + const int number_of_z_grid_points = NetcdfReadInt(ncid, "jz").value(); + const double z_grid_minimum = NetcdfReadDouble(ncid, "zmin").value(); + const double z_grid_maximum = NetcdfReadDouble(ncid, "zmax").value(); + const double z_grid_increment = + (z_grid_maximum - z_grid_minimum) / (number_of_z_grid_points - 1.0); + + const int number_of_phi_grid_points = NetcdfReadInt(ncid, "kp").value(); + const double phi_grid_increment = + 2.0 * M_PI / (number_of_phi_grid_points * number_of_field_periods); + + ASSERT_EQ(nc_close(ncid), NC_NOERR); + + // TODO(jons): A flag if stellarator symmetry was used in computing a given + // mgrid file is not stored in the mgrid file. For now, hard-code this to + // `true`, since all our test cases assume stellarator symmetry. To be revised + // when a) we use non-stellarator-symmetric coil sets _and_ b) we have + // transitioned to only using our own `makegrid`, in which we can define new + // output variables and have the MakegridParameters at hand anyways. + bool assume_stellarator_symmetry = true; + + // NOTE: The coil geometry in `coils.cth_like` was found to not be perfectly + // stellarator-symmetric. Therefore, the resulting magnetic field is also not + // perfectly stellarator symmetric. We ignore this issue for now and assume + // both in `makegrid` and here the field to be perfectly + // stellarator-symmetric. Therefore, we also only check the first + // half-field-period for a stellarator-symmetric case as `cth_like`. + int num_phi_effective = number_of_phi_grid_points; + if (assume_stellarator_symmetry) { + num_phi_effective = number_of_phi_grid_points / 2 + 1; + } + + // Build the cylindrical grid based on mgrid dimensions. + // The loop setup is re-used to also allocate the magnetic_field vectors. + const int number_of_grid_points = + number_of_r_grid_points * number_of_z_grid_points * num_phi_effective; + std::vector > evaluation_locations(number_of_grid_points); + std::vector > magnetic_field(number_of_grid_points); + for (int index_phi = 0; index_phi < num_phi_effective; ++index_phi) { + const double phi = index_phi * phi_grid_increment; + const double cos_phi = std::cos(phi); + const double sin_phi = std::sin(phi); + for (int index_z = 0; index_z < number_of_z_grid_points; ++index_z) { + const double z = z_grid_minimum + index_z * z_grid_increment; + for (int index_r = 0; index_r < number_of_r_grid_points; ++index_r) { + const double r = r_grid_minimum + index_r * r_grid_increment; + + const double x = r * cos_phi; + const double y = r * sin_phi; + + const int linear_index = + (index_phi * number_of_z_grid_points + index_z) * + number_of_r_grid_points + + index_r; + evaluation_locations[linear_index].resize(3); + magnetic_field[linear_index].resize(3); + + evaluation_locations[linear_index][0] = x; + evaluation_locations[linear_index][1] = y; + evaluation_locations[linear_index][2] = z; + } // index_r + } // index_z + } // index_phi + + // evaluate magnetic field on grid + absl::Status status = MagneticField(*magnetic_configuration, + evaluation_locations, magnetic_field); + ASSERT_TRUE(status.ok()); + + // compare magnetic field point-wise + for (int index_phi = 0; index_phi < num_phi_effective; ++index_phi) { + const double phi = index_phi * phi_grid_increment; + const double cos_phi = std::cos(phi); + const double sin_phi = std::sin(phi); + for (int index_z = 0; index_z < number_of_z_grid_points; ++index_z) { + for (int index_r = 0; index_r < number_of_r_grid_points; ++index_r) { + const int linear_index = + (index_phi * number_of_z_grid_points + index_z) * + number_of_r_grid_points + + index_r; + + // ABSCAB computes the Cartesian components of the magnetic field, + // so we need to convert the x and y componets into r and phi + // (cylindrical) components for comparison against the cylindrical + // components in the mgrid file. + const double b_x = magnetic_field[linear_index][0]; + const double b_y = magnetic_field[linear_index][1]; + const double b_z = magnetic_field[linear_index][2]; + + const double b_r = b_x * cos_phi + b_y * sin_phi; + const double b_p = b_y * cos_phi - b_x * sin_phi; + + EXPECT_TRUE(IsCloseRelAbs(b_r, mgrid.bR[linear_index], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(b_p, mgrid.bP[linear_index], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(b_z, mgrid.bZ[linear_index], tolerance)); + } // index_r + } // index_z + } // index_phi +} // CheckLoadMGrid + +INSTANTIATE_TEST_SUITE_P(TestVmec, LoadMGridTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .coils_file = "coils.cth_like"})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/nestor/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/nestor/BUILD.bazel new file mode 100644 index 000000000..55ae6db95 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/nestor/BUILD.bazel @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "nestor_test", + srcs = ["nestor_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/nestor", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/nestor/nestor_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/nestor/nestor_test.cc new file mode 100644 index 000000000..0eefb9d61 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/nestor/nestor_test.cc @@ -0,0 +1,225 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/nestor/nestor.h" + +#include +#include +#include + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::Combine; +using ::testing::TestWithParam; +using ::testing::Values; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class InputsToNestorCallTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InputsToNestorCallTest, CheckInputsToNestorCall) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FourierBasisFastToroidal fourier_basis(&s); + const FlowControl& fc = vmec.fc_; + const HandoverStorage& h = vmec.h_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_VACUUM, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_vacuum/" + "vac1n_vacuum_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_vacuum(filename); + ASSERT_TRUE(ifs_vac1n_vacuum.is_open()); + json vac1n_vacuum = json::parse(ifs_vac1n_vacuum); + + // The following relies on the parameters passed in the call to + // Nestor::update in IdealMHDModel. + + // Convert rmnc, ... from Fortran VMEC/Nestor into the rCC, ...-style arrays + // convert into 2D Fourier coefficient arrays + std::vector rCC(s.mnsize); + std::vector rSS(s.mnsize); + std::vector rSC; + std::vector rCS; + std::vector rmnc = vac1n_vacuum["rmnc"]; + fourier_basis.cos_to_cc_ss(rmnc, rCC, rSS, s.ntor, s.mpol); + if (s.lasym) { + rSC.resize(s.mnsize); + rCS.resize(s.mnsize); + std::vector rmns = vac1n_vacuum["rmns"]; + fourier_basis.sin_to_sc_cs(rmns, rSC, rCS, s.ntor, s.mpol); + } + + std::vector zSC(s.mnsize); + std::vector zCS(s.mnsize); + std::vector zCC; + std::vector zSS; + std::vector zmns = vac1n_vacuum["zmns"]; + fourier_basis.sin_to_sc_cs(zmns, zSC, zCS, s.ntor, s.mpol); + if (s.lasym) { + zCC.resize(s.mnsize); + zSS.resize(s.mnsize); + std::vector zmnc = vac1n_vacuum["zmnc"]; + fourier_basis.cos_to_cc_ss(zmnc, zCC, zSS, s.ntor, s.mpol); + } + + for (int mn = 0; mn < s.mnsize; ++mn) { + EXPECT_TRUE(IsCloseRelAbs(rCC[mn], h.rCC_LCFS[mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(rSS[mn], h.rSS_LCFS[mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(zSC[mn], h.zSC_LCFS[mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(zCS[mn], h.zCS_LCFS[mn], tolerance)); + } // mn + if (s.lasym) { + for (int mn = 0; mn < s.mnsize; ++mn) { + EXPECT_TRUE(IsCloseRelAbs(rSC[mn], h.rSC_LCFS[mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(rCS[mn], h.rCS_LCFS[mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(zCC[mn], h.zCC_LCFS[mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(zSS[mn], h.zSS_LCFS[mn], tolerance)); + } // mn + } + + EXPECT_TRUE(IsCloseRelAbs(vac1n_vacuum["plascur"], h.cTor, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_vacuum["rbtor"], h.rBtor, tolerance)); + + for (int k = 0; k < s.nZeta; ++k) { + EXPECT_TRUE(IsCloseRelAbs(vac1n_vacuum["raxis_nestor"][k], h.rAxis[k], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_vacuum["zaxis_nestor"][k], h.zAxis[k], + tolerance)); + } // k + } +} // CheckInputsToNestorCall + +INSTANTIATE_TEST_SUITE_P(TestNestor, InputsToNestorCallTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {53, 54}})); + +class BsqVacTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(BsqVacTest, CheckBsqVac) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + const HandoverStorage& h = vmec.h_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_BSQVAC, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_bsqvac/" + "vac1n_bsqvac_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_bsqvac(filename); + ASSERT_TRUE(ifs_vac1n_bsqvac.is_open()); + json vac1n_bsqvac = json::parse(ifs_vac1n_bsqvac); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["potu"][k][l], + n.potU[kl - tp.ztMin], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["potv"][k][l], + n.potV[kl - tp.ztMin], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["bsubu"][k][l], + n.bSubU[kl - tp.ztMin], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["bsubv"][k][l], + n.bSubV[kl - tp.ztMin], tolerance)); + } // kl + } // thread_id + + // test bsqvac already in full-surface target array + for (int kl = 0; kl < s.nZnT; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["bsqvac"][k][l], + h.vacuum_magnetic_pressure[kl], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["brv"][k][l], h.vacuum_b_r[kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["bphiv"][k][l], h.vacuum_b_phi[kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_bsqvac["bzv"][k][l], h.vacuum_b_z[kl], + tolerance)); + } // kl + } +} // CheckBsqVac + +INSTANTIATE_TEST_SUITE_P(TestNestor, BsqVacTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-10, + .iter2_to_test = {53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/regularized_integrals/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/regularized_integrals/BUILD.bazel new file mode 100644 index 000000000..7e66a7dc3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/regularized_integrals/BUILD.bazel @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "regularized_integrals_test", + srcs = ["regularized_integrals_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/regularized_integrals", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/regularized_integrals/regularized_integrals_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/regularized_integrals/regularized_integrals_test.cc new file mode 100644 index 000000000..3ebb6b491 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/regularized_integrals/regularized_integrals_test.cc @@ -0,0 +1,196 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/regularized_integrals/regularized_integrals.h" + +#include +#include +#include + +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class TanuTanvTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(TanuTanvTest, CheckTanuTanv) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_VACUUM, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_precal/" + "vac1n_precal_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_precal(filename); + ASSERT_TRUE(ifs_vac1n_precal.is_open()) + << "failed to open reference file: " << filename; + json vac1n_precal = json::parse(ifs_vac1n_precal); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + const RegularizedIntegrals& ri = n.GetRegularizedIntegrals(); + + for (int l = 0; l < s.nThetaEven; ++l) { + EXPECT_TRUE( + IsCloseRelAbs(vac1n_precal["tanu_1d"][l], ri.tanu[l], tolerance)); + } // l + + for (int k = 0; k < s.nZeta; ++k) { + EXPECT_TRUE( + IsCloseRelAbs(vac1n_precal["tanv_1d"][k], ri.tanv[k], tolerance)); + } // k + } // thread_id + } +} // CheckTanuTanv + +INSTANTIATE_TEST_SUITE_P(TestRegularizedIntegrals, TanuTanvTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-14, + .iter2_to_test = {53}})); + +class GreenFTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(GreenFTest, CheckGreenF) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_GREENF, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_greenf/" + "vac1n_greenf_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_full_update_nestor(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_greenf(filename); + ASSERT_TRUE(ifs_vac1n_greenf.is_open()) + << "failed to open reference file: " << filename; + json vac1n_greenf = json::parse(ifs_vac1n_greenf); + + // accumulate contributions from all threads + // in order to compare against Fortran single-threaded data + std::vector gstore(s.nZeta * s.nThetaEven); + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + const RegularizedIntegrals& ri = n.GetRegularizedIntegrals(); + for (int kl = 0; kl < s.nZeta * s.nThetaEven; ++kl) { + gstore[kl] += ri.gstore[kl]; + } // kl + } // thread_id + + for (int kl = 0; kl < s.nZeta * s.nThetaEven; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + // bexni contains a factor of (2 pi)^2, which is not present in VMEC++ + // gstore get a factor of 2 pi / nfp in VMEC++, which is not present in + // Fortran VMEC/Nestor. + const double factor_to_match_fortran = + 4.0 * M_PI * M_PI / (2.0 * M_PI / s.nfp); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_greenf["gstore"][k][l], + factor_to_match_fortran * gstore[kl], + tolerance)); + } + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + const RegularizedIntegrals& ri = n.GetRegularizedIntegrals(); + + for (int klp = tp.ztMin; klp < tp.ztMax; ++klp) { + const int lp = klp / s.nZeta; + const int kp = klp % s.nZeta; + + const int klpRel = klp - tp.ztMin; + + for (int kl = 0; kl < s.nZeta * s.nThetaEven; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + int ip = klpRel * s.nThetaEven * s.nZeta + kl; + + // greenp get a factor of 2 pi / nfp in VMEC++, which is not present + // in Fortran VMEC/Nestor. + const double factor_to_match_fortran = 1.0 / (2.0 * M_PI / s.nfp); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_greenf["greenp"][k][l][kp][lp], + factor_to_match_fortran * ri.greenp[ip], + tolerance)); + } // kl + } // klp + } // thread_id + } +} // CheckGreenF + +INSTANTIATE_TEST_SUITE_P(TestRegularizedIntegrals, GreenFTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-10, + .iter2_to_test = {53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/singular_integrals/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/singular_integrals/BUILD.bazel new file mode 100644 index 000000000..5bd5ec559 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/singular_integrals/BUILD.bazel @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "singular_integrals_test", + srcs = ["singular_integrals_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/singular_integrals", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/singular_integrals/singular_integrals_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/singular_integrals/singular_integrals_test.cc new file mode 100644 index 000000000..d65457b67 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/singular_integrals/singular_integrals_test.cc @@ -0,0 +1,256 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/singular_integrals/singular_integrals.h" + +#include +#include +#include + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class CmnsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(CmnsTest, CheckCmns) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_VACUUM, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_precal/" + "vac1n_precal_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_precal(filename); + ASSERT_TRUE(ifs_vac1n_precal.is_open()); + json vac1n_precal = json::parse(ifs_vac1n_precal); + + // In Fortran VMEC/Nestor, a factor of 2 pi / nfp (called `alp` there) is + // included in cmns that must be accounted for in this test. + const double alp = 2.0 * M_PI / s.nfp; + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + const SingularIntegrals& si = n.GetSingularIntegrals(); + + const int nf = s.ntor; + const int mf = s.mpol + 1; + for (int n = 0; n < nf + 1; ++n) { + for (int m = 0; m < mf + 1; ++m) { + for (int l = std::abs(m - n); l <= m + n; l += 2) { + int lnm = (l * (nf + 1) + n) * (mf + 1) + m; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_precal["cmns"][l][m][n], + alp * si.cmns[lnm], tolerance)); + } // l + } // m + } // n + } // thread_id + } +} // CheckCmns + +INSTANTIATE_TEST_SUITE_P(TestSingularIntegrals, CmnsTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-14, + .iter2_to_test = {53}})); + +class AnalytTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(AnalytTest, CheckAnalyt) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_ANALYT, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_analyt/" + "vac1n_analyt_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_analyt(filename); + ASSERT_TRUE(ifs_vac1n_analyt.is_open()); + json vac1n_analyt = json::parse(ifs_vac1n_analyt); + + const int nf = s.ntor; + const int mf = s.mpol + 1; + const int mnfull = (2 * nf + 1) * (mf + 1); + std::vector bvec_sin(mnfull, 0.0); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + const int numLocal = tp.ztMax - tp.ztMin; + + const SingularIntegrals& si = n.GetSingularIntegrals(); + + for (int fl = 0; fl < mf + nf + 1; ++fl) { + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_analyt["all_tlp"][fl][k][l], + si.Tlp[fl][klRel], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_analyt["all_tlm"][fl][k][l], + si.Tlm[fl][klRel], tolerance)); + } // kl + } // fl + + // bvec needs to be accumulated over all threads to be compared + // --> accumulate contributions to Fourier transform from all threads + for (int mn = 0; mn < mnfull; ++mn) { + bvec_sin[mn] += si.bvec_sin[mn]; + } + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int fl = 0; fl < mf + nf + 1; ++fl) { + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_analyt["all_slp"][fl][k][l], + si.Slp[fl][klRel], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_analyt["all_slm"][fl][k][l], + si.Slm[fl][klRel], tolerance)); + } // kl + } // fl + + // grpmn can be tested here already, as there is no reduction over + // threads involved + for (int n = 0; n < nf + 1; ++n) { + for (int m = 0; m < mf + 1; ++m) { + const int idx_m_posn = (nf + n) * (mf + 1) + m; + const int idx_m_negn = (nf - n) * (mf + 1) + m; + + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + // cmns in Fortran has alp (= 2 pi / nfp) in it; VMEC++ does not + const double scale_to_match_fortran = 2.0 * M_PI / s.nfp; + + // TODO(jons): for lasym, need cos-part of grpmn from + // educational_VMEC + EXPECT_TRUE( + IsCloseRelAbs(vac1n_analyt["grpmn"][m][nf + n][k][l], + scale_to_match_fortran * + si.grpmn_sin[idx_m_posn * numLocal + klRel], + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(vac1n_analyt["grpmn"][m][nf - n][k][l], + scale_to_match_fortran * + si.grpmn_sin[idx_m_negn * numLocal + klRel], + tolerance)); + } // kl + } // m + } // n + } // fullUpdate + } // thread_id + + for (int n = 0; n < nf + 1; ++n) { + for (int m = 0; m < mf + 1; ++m) { + const int idx_m_posn = (nf + n) * (mf + 1) + m; + const int idx_m_negn = (nf - n) * (mf + 1) + m; + + // 1. cmns in Fortran has alp (= 2 pi / nfp) in it; VMEC++ does not + // 2. bexni in Fortran has (2 pi)^2 in it; VMEC++ does not + const double scale_to_match_fortran = + 2.0 * M_PI / s.nfp * 4.0 * M_PI * M_PI; + + // TODO(jons): for lasym, need cos-part of bvec from educational_VMEC + + // Fortran order along n in bvec: -nf, -nf+1, ..., -1, 0, 1, ..., nf-1, + // nf + EXPECT_TRUE(IsCloseRelAbs(vac1n_analyt["bvec"][m][nf + n], + scale_to_match_fortran * bvec_sin[idx_m_posn], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_analyt["bvec"][m][nf - n], + scale_to_match_fortran * bvec_sin[idx_m_negn], + tolerance)); + } // m + } // n + } +} // CheckAnalyt + +INSTANTIATE_TEST_SUITE_P(TestSingularIntegrals, AnalytTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-9, + .iter2_to_test = {53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/surface_geometry/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/surface_geometry/BUILD.bazel new file mode 100644 index 000000000..979691744 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/surface_geometry/BUILD.bazel @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "surface_geometry_test", + srcs = ["surface_geometry_test.cc"], + data = [ + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/free_boundary/surface_geometry", + "@googletest//:gtest_main", + "@abseil-cpp//absl/log:log", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + "//vmecpp/free_boundary/surface_geometry_mockup:surface_geometry_mockup", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/surface_geometry/surface_geometry_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/surface_geometry/surface_geometry_test.cc new file mode 100644 index 000000000..72547ebf1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/free_boundary/surface_geometry/surface_geometry_test.cc @@ -0,0 +1,194 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/free_boundary/surface_geometry/surface_geometry.h" + +#include +#include +#include +#include +#include + +#include "absl/log/log.h" +#include "absl/strings/str_format.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/fourier_basis_fast_toroidal/fourier_basis_fast_toroidal.h" +#include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/free_boundary/surface_geometry_mockup/surface_geometry_mockup.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class SurfaceGeometryTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(SurfaceGeometryTest, CheckSurfaceGeometry) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VAC1_SURFACE, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/vac1n_surface/" + "vac1n_surface_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_vac1n_surface(filename); + ASSERT_TRUE(ifs_vac1n_surface.is_open()); + json vac1n_surface = json::parse(ifs_vac1n_surface); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const Nestor& n = static_cast(*vmec.fb_[thread_id]); + const TangentialPartitioning& tp = *vmec.tp_[thread_id]; + const SurfaceGeometry& sg = n.GetSurfaceGeometry(); + + // full-surface quantities + for (int kl = 0; kl < s.nZnT; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + EXPECT_TRUE( + IsCloseRelAbs(vac1n_surface["r1b"][k][l], sg.r1b[kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(vac1n_surface["z1b"][k][l], sg.z1b[kl], tolerance)); + } // kl + + // local tangential partition + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["rub"][k][l], sg.rub[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["rvb"][k][l], sg.rvb[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["zub"][k][l], sg.zub[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["zvb"][k][l], sg.zvb[klRel], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["snr"][k][l], sg.snr[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["snv"][k][l], sg.snv[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["snz"][k][l], sg.snz[klRel], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["guu_b"][k][l], sg.guu[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["guv_b"][k][l], sg.guv[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["gvv_b"][k][l], sg.gvv[klRel], + tolerance)); + } // kl + + if (vmec.m_[0]->get_ivacskip() == 0) { + for (int kl = tp.ztMin; kl < tp.ztMax; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + const int klRel = kl - tp.ztMin; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["ruu"][k][l], sg.ruu[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["ruv"][k][l], sg.ruv[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["rvv"][k][l], sg.rvv[klRel], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["zuu"][k][l], sg.zuu[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["zuv"][k][l], sg.zuv[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["zvv"][k][l], sg.zvv[klRel], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["auu"][k][l], sg.auu[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["auv"][k][l], sg.auv[klRel], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["avv"][k][l], sg.avv[klRel], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["drv"][k][l], sg.drv[klRel], + tolerance)); + } // kl + + // full-surface quantities + for (int kl = 0; kl < s.nZnT; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["rzb2"][k][l], sg.rzb2[kl], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["rcosuv"][k][l], + sg.rcosuv[kl], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(vac1n_surface["rsinuv"][k][l], + sg.rsinuv[kl], tolerance)); + } // kl + + // non-zymmetry-reduced R and Z are also only available if a full update + // is being done + for (int kl = s.nZnT; kl < s.nThetaEven * s.nZeta; ++kl) { + const int l = kl / s.nZeta; + const int k = kl % s.nZeta; + + EXPECT_TRUE( + IsCloseRelAbs(vac1n_surface["r1b"][k][l], sg.r1b[kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(vac1n_surface["z1b"][k][l], sg.z1b[kl], tolerance)); + } // kl + } // fullUpdate + } // thread_id + } +} // CheckSurfaceGeometry + +INSTANTIATE_TEST_SUITE_P(TestSurfaceGeometry, SurfaceGeometryTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/linking_current_test/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/linking_current_test/BUILD.bazel new file mode 100644 index 000000000..588a036fc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/linking_current_test/BUILD.bazel @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "linking_current_test", + srcs = ["linking_current_test.cc"], + data = [ + "//vmecpp_large_cpp_tests/test_data:w7x", + ], + deps = [ + "@googletest//:gtest_main", + "@abseil-cpp//absl/status:statusor", + "@abseil-cpp//absl/status", + "@abseil-cpp//absl/log:check", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/magnetic_field_provider:magnetic_field_provider_lib", + ], +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/linking_current_test/linking_current_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/linking_current_test/linking_current_test.cc new file mode 100644 index 000000000..755c82e62 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/linking_current_test/linking_current_test.cc @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include +#include +#include + +#include "absl/log/check.h" +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "gtest/gtest.h" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/composed_types_lib/composed_types_lib.h" +#include "vmecpp/common/magnetic_configuration_lib/magnetic_configuration_lib.h" +#include "vmecpp/common/magnetic_field_provider/magnetic_field_provider_lib.h" + +using composed_types::CurveRZFourier; +using composed_types::CurveRZFourierFromCsv; +using magnetics::MagneticConfiguration; +using testing::IsCloseRelAbs; + +TEST(TestLinkingCurrent, CheckForW7X) { + static constexpr double kTolerance = 5.0e-3; + + std::filesystem::path makegrid_coils_filename( + "vmecpp_large_cpp_tests/test_data/coils.w7x"); + std::filesystem::path axis_fourier_geometry_filename( + "vmecpp_large_cpp_tests/test_data/axis_coefficients_w7x.csv"); + + // read coil geometry from file + absl::StatusOr maybe_magnetic_configuration = + magnetics::ImportMagneticConfigurationFromCoilsFile( + makegrid_coils_filename); + CHECK_OK(maybe_magnetic_configuration); + MagneticConfiguration magnetic_configuration = + maybe_magnetic_configuration.value(); + + // W7-X standard magnetic configuration + // 13.5kA in non-planar coils + // no current in planar coils + Eigen::VectorXd circuit_currents(7); + circuit_currents << 13.5e3, 13.5e3, 13.5e3, 13.5e3, 13.5e3, 0.0, 0.0; + + // set circuit currents in MagneticConfiguration + CHECK_OK(magnetics::SetCircuitCurrents( + circuit_currents, + /*m_magnetic_configuration=*/magnetic_configuration)); + + // read axis geometry coefficients + absl::StatusOr maybe_axis_coefficients_csv = + file_io::ReadFile(axis_fourier_geometry_filename); + CHECK_OK(maybe_axis_coefficients_csv); + const std::string& axis_coefficients_csv = + maybe_axis_coefficients_csv.value(); + + absl::StatusOr maybe_axis_coefficients = + CurveRZFourierFromCsv(axis_coefficients_csv); + CHECK_OK(maybe_axis_coefficients); + const CurveRZFourier& axis_coefficients = maybe_axis_coefficients.value(); + + absl::StatusOr maybe_linking_current = + LinkingCurrent(magnetic_configuration, axis_coefficients); + CHECK_OK(maybe_linking_current); + const double linking_current = maybe_linking_current.value(); + + EXPECT_TRUE(IsCloseRelAbs(72.9e6, linking_current, kTolerance)); +} // TestLinkingCurrent:CheckForW7X diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/.gitignore b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/.gitignore new file mode 100644 index 000000000..296f74bb6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/.gitignore @@ -0,0 +1,6 @@ +# LibreOffice lock files +.~lock* + +# wout_solovev.nc is ignored at the repo root (it's a common dev output), +# but the test_data copy is reference data that must be tracked. +!wout_solovev.nc diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/BUILD.bazel new file mode 100644 index 000000000..97cef212d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/BUILD.bazel @@ -0,0 +1,101 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +filegroup( + name = "solovev", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_solovev.csv", + "boundary_coefficients_solovev.csv", + "jxbout_solovev.nc", + "mercier.solovev", + "threed1.solovev", + "solovev.out.h5", + "wout_solovev.nc", + ] + glob(["solovev/**/*.json"]), +) + +filegroup( + name = "solovev_analytical", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_solovev_analytical.csv", + "boundary_coefficients_solovev_analytical.csv", + "jxbout_solovev_analytical.nc", + "mercier.solovev_analytical", + "threed1.solovev_analytical", + ] + glob(["solovev_analytical/**/*.json"]), +) + +filegroup( + name = "solovev_no_axis", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_solovev_no_axis.csv", + "boundary_coefficients_solovev_no_axis.csv", + "jxbout_solovev_no_axis.nc", + "mercier.solovev_no_axis", + "threed1.solovev_no_axis", + "wout_solovev_no_axis.nc", + ] + glob(["solovev_no_axis/**/*.json"]), +) + +filegroup( + name = "cth_like_fixed_bdy", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_cth_like_fixed_bdy.csv", + "boundary_coefficients_cth_like_fixed_bdy.csv", + "jxbout_cth_like_fixed_bdy.nc", + "mercier.cth_like_fixed_bdy", + "threed1.cth_like_fixed_bdy", + "cth_like_fixed_bdy.out.h5", + "wout_cth_like_fixed_bdy.nc", + ] + glob(["cth_like_fixed_bdy/**/*.json"]), +) + +filegroup( + name = "cth_like_fixed_bdy_nzeta_37", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_cth_like_fixed_bdy_nzeta_37.csv", + "boundary_coefficients_cth_like_fixed_bdy_nzeta_37.csv", + "jxbout_cth_like_fixed_bdy_nzeta_37.nc", + "mercier.cth_like_fixed_bdy_nzeta_37", + "threed1.cth_like_fixed_bdy_nzeta_37", + "wout_cth_like_fixed_bdy_nzeta_37.nc", + ] + glob(["cth_like_fixed_bdy_nzeta_37/**/*.json"]), +) + +filegroup( + name = "cma", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_cma.csv", + "boundary_coefficients_cma.csv", + "mercier.cma", + "threed1.cma", + "wout_cma.nc", + ] + glob(["cma/**/*.json"]), +) + +filegroup( + name = "cth_like_free_bdy", + visibility = ["//visibility:public"], + srcs = [ + "axis_coefficients_cth_like_free_bdy.csv", + "boundary_coefficients_cth_like_free_bdy.csv", + "jxbout_cth_like_free_bdy.nc", + "mercier.cth_like_free_bdy", + "threed1.cth_like_free_bdy", + ] + glob(["cth_like_free_bdy/**/*.json"]), +) + +filegroup( + name = "w7x", + visibility = ["//visibility:public"], + srcs = [ + "coils.w7x", + "axis_coefficients_w7x.csv", + ], +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/README.md b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/README.md new file mode 100644 index 000000000..c27bee1cf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/README.md @@ -0,0 +1,27 @@ +# Test Data for VMEC++ + +All combinations of the following choices should be tested: + +0. fixed-boundary (F) and free-boundary (T) +1. constrained-iota (F) and constrained-current (T) +2. axisymmetric Tokamak (F) and three-dimensional stellarator (T) +3. stellarator-symmetric (F) and non-stellarator-symmetric (T) + +| case name | 3 | 2 | 1 | 0 | +|----------------------|---|---|---|---| +| `solovev` | F | F | F | F | +| TODO | F | F | F | T | +| TODO | F | F | T | F | +| TODO | F | F | T | T | +| TODO | F | T | F | F | +| TODO | F | T | F | T | +| `cth_like_fixed_bdy` | F | T | T | F | +| TODO | F | T | T | T | +| TODO | T | F | F | F | +| TODO | T | F | F | T | +| TODO | T | F | T | F | +| TODO | T | F | T | T | +| TODO | T | T | F | F | +| TODO | T | T | F | T | +| TODO | T | T | T | F | +| TODO | T | T | T | T | diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cma.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cma.csv new file mode 100644 index 000000000..9c48a56d4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cma.csv @@ -0,0 +1,8 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,0,0,0,0 +1,0,0,0,0 +2,0,0,0,0 +3,0,0,0,0 +4,0,0,0,0 +5,0,0,0,0 +6,0,0,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_fixed_bdy.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_fixed_bdy.csv new file mode 100644 index 000000000..c0d1547a3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_fixed_bdy.csv @@ -0,0 +1,6 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,0.786037734951267,0,0,0 +1,-0.0302978726119071,0.0273158409510113,0,0 +2,0.000915258048528683,-0.000937096584979097,0,0 +3,-1.91959906744039E-05,1.741833421328E-05,0,0 +4,1.45930777845745E-06,-5.91222841432118E-07,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_fixed_bdy_nzeta_37.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_fixed_bdy_nzeta_37.csv new file mode 100644 index 000000000..c0d1547a3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_fixed_bdy_nzeta_37.csv @@ -0,0 +1,6 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,0.786037734951267,0,0,0 +1,-0.0302978726119071,0.0273158409510113,0,0 +2,0.000915258048528683,-0.000937096584979097,0,0 +3,-1.91959906744039E-05,1.741833421328E-05,0,0 +4,1.45930777845745E-06,-5.91222841432118E-07,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_free_bdy.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_free_bdy.csv new file mode 100644 index 000000000..c0d1547a3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_cth_like_free_bdy.csv @@ -0,0 +1,6 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,0.786037734951267,0,0,0 +1,-0.0302978726119071,0.0273158409510113,0,0 +2,0.000915258048528683,-0.000937096584979097,0,0 +3,-1.91959906744039E-05,1.741833421328E-05,0,0 +4,1.45930777845745E-06,-5.91222841432118E-07,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev.csv new file mode 100644 index 000000000..0cc1e1a16 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev.csv @@ -0,0 +1,2 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,4.0,0.0,0.0,0.0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_analytical.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_analytical.csv new file mode 100644 index 000000000..21d050df6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_analytical.csv @@ -0,0 +1,2 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,0.0,0.0,0.0,0.0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_no_axis.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_no_axis.csv new file mode 100644 index 000000000..21d050df6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_solovev_no_axis.csv @@ -0,0 +1,2 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,0.0,0.0,0.0,0.0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_w7x.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_w7x.csv new file mode 100644 index 000000000..974736293 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/axis_coefficients_w7x.csv @@ -0,0 +1,10 @@ +n,raxis_c,zaxis_s,raxis_s,zaxis_c +0,5.646432286445623,-0,0,0 +1,0.3520836509683967,-0.2955219528163405,0,0 +2,0.01202069873340776,-0.01344830871518563,0,0 +3,0.0006021803754102575,-0.00011670634889841,0,0 +4,-0.0002942653336735084,5.231054234947395e-05,0,0 +5,-6.680657137224177e-05,3.058069046039054e-05,0,0 +6,-7.120011593088746e-05,-9.229545503137699e-06,0,0 +7,-3.615013285247203e-05,-1.238669265586533e-06,0,0 +8,-0.0001731852544956113,-0.0001410380858787534,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cma.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cma.csv new file mode 100644 index 000000000..4b060ce95 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cma.csv @@ -0,0 +1,66 @@ +n,m,rbc,zbs,rbs,zbc +-6,0,0,0,0,0 +-5,0,0,0,0,0 +-4,0,0,0,0,0 +-3,0,0,0,0,0 +-2,0,0,0,0,0 +-1,0,0,0,0,0 + 0,0, 1.000000000000000e+00, 0.000000000000000e+00,0,0 + 1,0,-7.644321965093537e-02, 3.074125881604448e-01,0,0 + 2,0,-1.324126418028418e-02, 1.542129248893585e-03,0,0 + 3,0, 1.420977053009254e-02,-9.144742714707998e-03,0,0 + 4,0,-5.504435855162935e-03, 3.460797854109088e-03,0,0 + 5,0, 2.553384848788198e-04, 9.883634616616728e-05,0,0 + 6,0,-1.185011324568191e-03,-2.880135818991747e-06,0,0 +-6,1,-1.202025254622908e-04,-3.824446509542573e-05,0,0 +-5,1, 6.941752124278125e-04, 8.108927537995539e-04,0,0 +-4,1,-8.094624068832210e-04, 2.655765394140272e-04,0,0 +-3,1, 6.713810248166207e-03, 3.648069053720122e-03,0,0 +-2,1,-2.567930216425583e-02,-7.382561322274653e-03,0,0 +-1,1, 2.050253804808166e-02, 5.723757729696597e-03,0,0 + 0,1, 1.572621671365258e-01, 2.368390378510535e-01,0,0 + 1,1, 1.047284153032750e-01,-9.939702516666893e-02,0,0 + 2,1, 5.245713453838931e-02,-2.425684102695022e-02,0,0 + 3,1,-1.370886243307166e-02, 3.655726929818442e-04,0,0 + 4,1, 2.303920109478939e-03,-1.405685942654125e-03,0,0 + 5,1,-1.797977199990663e-03, 4.032459604105783e-05,0,0 + 6,1,-1.127798792956909e-03, 8.840023911914129e-04,0,0 +-6,2, 6.920323299065562e-04, 1.320686742275814e-04,0,0 +-5,2,-9.543127510458719e-04,-5.573663814308586e-04,0,0 +-4,2,-1.680310177254153e-03,-8.427232066969988e-04,0,0 +-3,2, 4.953442911158945e-03, 5.805693726626450e-03,0,0 +-2,2,-4.556920611897498e-03,-2.495880769569751e-03,0,0 +-1,2,-1.773171978291314e-03,-1.608731490617312e-02,0,0 + 0,2,-1.219094417536678e-02, 1.617414407135419e-02,0,0 + 1,2,-3.583509443086943e-03, 1.024237892621557e-02,0,0 + 2,2,-1.030923092585679e-02,-1.901517879607994e-02,0,0 + 3,2, 6.141194835902971e-03,-1.526222014090178e-02,0,0 + 4,2,-6.255196754866160e-03,-4.338984478901778e-03,0,0 + 5,2,-2.171246142273294e-03, 2.638466061498996e-03,0,0 + 6,2, 9.442146568524488e-04,-2.528283463976346e-04,0,0 +-6,3, 6.471069192439680e-04, 1.975996576549061e-04,0,0 +-5,3, 3.756283466314262e-05,-4.260795814768445e-04,0,0 +-4,3,-1.881608284746710e-04,-4.341456161461416e-04,0,0 +-3,3,-5.416568802079458e-04, 7.166845118997602e-05,0,0 +-2,3,-2.603073072881438e-03, 1.920115232912769e-03,0,0 +-1,3, 2.032789557854657e-03, 2.134113397386284e-03,0,0 + 0,3,-3.594369822956610e-03, 5.070170388360828e-03,0,0 + 1,3, 1.184431233968696e-02, 4.722733327563772e-03,0,0 + 2,3, 8.362234645779227e-06, 1.183301470387100e-03,0,0 + 3,3, 9.509574133642763e-04,-4.316655750776096e-03,0,0 + 4,3, 1.616195157207865e-03,-1.748249071557586e-03,0,0 + 5,3, 1.604779702550668e-04,-6.600708198037322e-04,0,0 + 6,3,-2.627451027047592e-04, 1.057899479874507e-03,0,0 +-6,4, 4.447359108466256e-05,-1.032135146992660e-04,0,0 +-5,4, 2.521492700224221e-07, 4.950847753563548e-05,0,0 +-4,4, 1.497840987841863e-04,-1.706742726333019e-04,0,0 +-3,4,-3.904415453615698e-05,-3.350555683490269e-04,0,0 +-2,4, 1.960713376050221e-04, 5.665989189036979e-04,0,0 +-1,4, 1.990034938618596e-03,-2.535981637356631e-04,0,0 + 0,4,-1.552522144076541e-03, 1.383118539333910e-04,0,0 + 1,4, 3.713111027194971e-05, 3.194362295971315e-04,0,0 + 2,4, 2.965425907839499e-03,-2.046663508155578e-04,0,0 + 3,4,-3.631182882795961e-03, 1.839222193547008e-03,0,0 + 4,4,-1.191273889898481e-03, 8.247816900845371e-04,0,0 + 5,4, 7.451616548054759e-05,-1.811951853902116e-04,0,0 + 6,4, 8.526322572912445e-05,-1.255143181157281e-04,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_fixed_bdy.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_fixed_bdy.csv new file mode 100644 index 000000000..a53c7991a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_fixed_bdy.csv @@ -0,0 +1,46 @@ +n,m,rbc,zbs,rbs,zbc +-4,0,0,0,0,0 +-3,0,0,0,0,0 +-2,0,0,0,0,0 +-1,0,0,0,0,0 +0,0,0.780906309727434,0,0,0 +1,0,-0.046151739531816,0.0449223151020507,0,0 +2,0,0.0025346622908875,-0.00157959039976886,0,0 +3,0,-0.000294570027126834,0.000110096448338774,0,0 +4,0,4.87628905278232E-05,-3.41523759959853E-05,0,0 +-4,1,1.10991985982551E-05,8.86243753757977E-06,0,0 +-3,1,-6.69760263500533E-05,-7.61994068511444E-06,0,0 +-2,1,0.000344811566716634,-0.000102387369227698,0,0 +-1,1,-0.00566091264003757,-0.00308184739411174,0,0 +0,1,0.131435746235883,0.164601748843378,0,0 +1,1,-0.039386399008392,0.0303393558516301,0,0 +2,1,0.00488869740987901,-0.00451585182685075,0,0 +3,1,-0.000438124054375238,0.000322392099487897,0,0 +4,1,4.81645985535357E-05,-3.48737658782808E-05,0,0 +-4,2,-1.53011178035308E-06,-1.28442261664991E-06,0,0 +-3,2,2.35413167655254E-05,2.93065492924715E-05,0,0 +-2,2,-8.83026333729552E-05,-0.000193078473966611,0,0 +-1,2,0.000146058452530242,0.000917965755419898,0,0 +0,2,0.00147170066093047,-0.00272248379340565,0,0 +1,2,-0.00320611057583166,0.00355657869194155,0,0 +2,2,0.00228943846580024,-0.00205297288922009,0,0 +3,2,-0.000319173467542497,0.000328755917997435,0,0 +4,2,2.60138638307058E-05,-3.57925786395997E-05,0,0 +-4,3,-2.22269133805289E-06,3.83110072934457E-06,0,0 +-3,3,8.93182437579942E-07,-3.24731939556698E-06,0,0 +-2,3,-1.86926512003518E-05,-3.77850265219013E-06,0,0 +-1,3,-0.000103222718482529,-7.43052945541678E-07,0,0 +0,3,-0.00010590693425821,0.000120213894931637,0,0 +1,3,-3.70460344545912E-05,9.70588501764729E-05,0,0 +2,3,0.000384952481942609,-0.000305563766958157,0,0 +3,3,-8.73464736915271E-05,7.12819152728525E-05,0,0 +4,3,1.70559212798558E-05,-1.14192148882868E-05,0,0 +-4,4,-4.11611838328142E-06,2.79111955871817E-06,0,0 +-3,4,-3.670147571078E-06,-1.0123457043081E-06,0,0 +-2,4,3.27663252086114E-06,1.33742394885452E-05,0,0 +-1,4,-5.49897884990649E-05,-6.56302557453055E-05,0,0 +0,4,0.000611036997986113,0.000408527289143525,0,0 +1,4,0.000157752536759372,-0.00113568343044368,0,0 +2,4,0.000238939203660074,0.000453498195180046,0,0 +3,4,-7.45864378517666E-05,-5.07003662052117E-05,0,0 +4,4,1.0767515627784E-05,5.22398328609138E-06,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_fixed_bdy_nzeta_37.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_fixed_bdy_nzeta_37.csv new file mode 100644 index 000000000..a53c7991a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_fixed_bdy_nzeta_37.csv @@ -0,0 +1,46 @@ +n,m,rbc,zbs,rbs,zbc +-4,0,0,0,0,0 +-3,0,0,0,0,0 +-2,0,0,0,0,0 +-1,0,0,0,0,0 +0,0,0.780906309727434,0,0,0 +1,0,-0.046151739531816,0.0449223151020507,0,0 +2,0,0.0025346622908875,-0.00157959039976886,0,0 +3,0,-0.000294570027126834,0.000110096448338774,0,0 +4,0,4.87628905278232E-05,-3.41523759959853E-05,0,0 +-4,1,1.10991985982551E-05,8.86243753757977E-06,0,0 +-3,1,-6.69760263500533E-05,-7.61994068511444E-06,0,0 +-2,1,0.000344811566716634,-0.000102387369227698,0,0 +-1,1,-0.00566091264003757,-0.00308184739411174,0,0 +0,1,0.131435746235883,0.164601748843378,0,0 +1,1,-0.039386399008392,0.0303393558516301,0,0 +2,1,0.00488869740987901,-0.00451585182685075,0,0 +3,1,-0.000438124054375238,0.000322392099487897,0,0 +4,1,4.81645985535357E-05,-3.48737658782808E-05,0,0 +-4,2,-1.53011178035308E-06,-1.28442261664991E-06,0,0 +-3,2,2.35413167655254E-05,2.93065492924715E-05,0,0 +-2,2,-8.83026333729552E-05,-0.000193078473966611,0,0 +-1,2,0.000146058452530242,0.000917965755419898,0,0 +0,2,0.00147170066093047,-0.00272248379340565,0,0 +1,2,-0.00320611057583166,0.00355657869194155,0,0 +2,2,0.00228943846580024,-0.00205297288922009,0,0 +3,2,-0.000319173467542497,0.000328755917997435,0,0 +4,2,2.60138638307058E-05,-3.57925786395997E-05,0,0 +-4,3,-2.22269133805289E-06,3.83110072934457E-06,0,0 +-3,3,8.93182437579942E-07,-3.24731939556698E-06,0,0 +-2,3,-1.86926512003518E-05,-3.77850265219013E-06,0,0 +-1,3,-0.000103222718482529,-7.43052945541678E-07,0,0 +0,3,-0.00010590693425821,0.000120213894931637,0,0 +1,3,-3.70460344545912E-05,9.70588501764729E-05,0,0 +2,3,0.000384952481942609,-0.000305563766958157,0,0 +3,3,-8.73464736915271E-05,7.12819152728525E-05,0,0 +4,3,1.70559212798558E-05,-1.14192148882868E-05,0,0 +-4,4,-4.11611838328142E-06,2.79111955871817E-06,0,0 +-3,4,-3.670147571078E-06,-1.0123457043081E-06,0,0 +-2,4,3.27663252086114E-06,1.33742394885452E-05,0,0 +-1,4,-5.49897884990649E-05,-6.56302557453055E-05,0,0 +0,4,0.000611036997986113,0.000408527289143525,0,0 +1,4,0.000157752536759372,-0.00113568343044368,0,0 +2,4,0.000238939203660074,0.000453498195180046,0,0 +3,4,-7.45864378517666E-05,-5.07003662052117E-05,0,0 +4,4,1.0767515627784E-05,5.22398328609138E-06,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_free_bdy.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_free_bdy.csv new file mode 100644 index 000000000..a53c7991a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_cth_like_free_bdy.csv @@ -0,0 +1,46 @@ +n,m,rbc,zbs,rbs,zbc +-4,0,0,0,0,0 +-3,0,0,0,0,0 +-2,0,0,0,0,0 +-1,0,0,0,0,0 +0,0,0.780906309727434,0,0,0 +1,0,-0.046151739531816,0.0449223151020507,0,0 +2,0,0.0025346622908875,-0.00157959039976886,0,0 +3,0,-0.000294570027126834,0.000110096448338774,0,0 +4,0,4.87628905278232E-05,-3.41523759959853E-05,0,0 +-4,1,1.10991985982551E-05,8.86243753757977E-06,0,0 +-3,1,-6.69760263500533E-05,-7.61994068511444E-06,0,0 +-2,1,0.000344811566716634,-0.000102387369227698,0,0 +-1,1,-0.00566091264003757,-0.00308184739411174,0,0 +0,1,0.131435746235883,0.164601748843378,0,0 +1,1,-0.039386399008392,0.0303393558516301,0,0 +2,1,0.00488869740987901,-0.00451585182685075,0,0 +3,1,-0.000438124054375238,0.000322392099487897,0,0 +4,1,4.81645985535357E-05,-3.48737658782808E-05,0,0 +-4,2,-1.53011178035308E-06,-1.28442261664991E-06,0,0 +-3,2,2.35413167655254E-05,2.93065492924715E-05,0,0 +-2,2,-8.83026333729552E-05,-0.000193078473966611,0,0 +-1,2,0.000146058452530242,0.000917965755419898,0,0 +0,2,0.00147170066093047,-0.00272248379340565,0,0 +1,2,-0.00320611057583166,0.00355657869194155,0,0 +2,2,0.00228943846580024,-0.00205297288922009,0,0 +3,2,-0.000319173467542497,0.000328755917997435,0,0 +4,2,2.60138638307058E-05,-3.57925786395997E-05,0,0 +-4,3,-2.22269133805289E-06,3.83110072934457E-06,0,0 +-3,3,8.93182437579942E-07,-3.24731939556698E-06,0,0 +-2,3,-1.86926512003518E-05,-3.77850265219013E-06,0,0 +-1,3,-0.000103222718482529,-7.43052945541678E-07,0,0 +0,3,-0.00010590693425821,0.000120213894931637,0,0 +1,3,-3.70460344545912E-05,9.70588501764729E-05,0,0 +2,3,0.000384952481942609,-0.000305563766958157,0,0 +3,3,-8.73464736915271E-05,7.12819152728525E-05,0,0 +4,3,1.70559212798558E-05,-1.14192148882868E-05,0,0 +-4,4,-4.11611838328142E-06,2.79111955871817E-06,0,0 +-3,4,-3.670147571078E-06,-1.0123457043081E-06,0,0 +-2,4,3.27663252086114E-06,1.33742394885452E-05,0,0 +-1,4,-5.49897884990649E-05,-6.56302557453055E-05,0,0 +0,4,0.000611036997986113,0.000408527289143525,0,0 +1,4,0.000157752536759372,-0.00113568343044368,0,0 +2,4,0.000238939203660074,0.000453498195180046,0,0 +3,4,-7.45864378517666E-05,-5.07003662052117E-05,0,0 +4,4,1.0767515627784E-05,5.22398328609138E-06,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev.csv new file mode 100644 index 000000000..c20f4933d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev.csv @@ -0,0 +1,7 @@ +n,m,rbc,zbs,rbs,zbc +0,0,3.999,0,0,0 +0,1,1.026,1.58,0,0 +0,2,-0.068,0.01,0,0 +0,3,0,0,0,0 +0,4,0,0,0,0 +0,5,0,0,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_analytical.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_analytical.csv new file mode 100644 index 000000000..6679d2092 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_analytical.csv @@ -0,0 +1,14 @@ +n,m,rbc,zbs,rbs,zbc +0,0,3.933370603101e+00,0.0,0.0,0.0 +0,1,-1.025899678142e+00,1.581138830084e+00,0.0,0.0 +0,2,-6.809124378642e-02,0.0,0.0,0.0 +0,3,-9.080031777300e-03,0.0,0.0,0.0 +0,4,-1.516336810656e-03,0.0,0.0,0.0 +0,5,-2.838744594993e-04,0.0,0.0,0.0 +0,6,-5.697082348932e-05,0.0,0.0,0.0 +0,7,-1.198195946489e-05,0.0,0.0,0.0 +0,8,-2.606510095840e-06,0.0,0.0,0.0 +0,9,-5.816406878883e-07,0.0,0.0,0.0 +0,10,-1.324037181689e-07,0.0,0.0,0.0 +0,11,-3.062633595619e-08,0.0,0.0,0.0 +0,12,-7.177875393912e-09,0.0,0.0,0.0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_no_axis.csv b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_no_axis.csv new file mode 100644 index 000000000..c20f4933d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/boundary_coefficients_solovev_no_axis.csv @@ -0,0 +1,7 @@ +n,m,rbc,zbs,rbs,zbc +0,0,3.999,0,0,0 +0,1,1.026,1.58,0,0 +0,2,-0.068,0.01,0,0 +0,3,0,0,0,0 +0,4,0,0,0,0 +0,5,0,0,0,0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma.json new file mode 100644 index 000000000..2e38ffd73 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2220e115d98797230b7bdab5f10b3a89dbef61d20246c9c28855cea53084e4d0 +size 13120 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00025_000001_02.cma.json new file mode 100644 index 000000000..199d8e3e3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c05ad214d41ed6044852bb20fd8061a5869e45ab21768d9d9b7b5c73eb08d8e +size 144296 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00025_000002_02.cma.json new file mode 100644 index 000000000..8dccd9671 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3af69ba19e102c0961cab9e16cfce623d4876f03ce52cf78557887481f255c74 +size 144424 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00051_000001_01.cma.json new file mode 100644 index 000000000..8ae964b09 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cc0198548575c193b7d82f90efdc5d0a5e3a45731c08314c467e0eae8f2d752 +size 297516 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00051_000002_01.cma.json new file mode 100644 index 000000000..60ca05724 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/add_fluxes/add_fluxes_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c821b2faa35191e69bb61c4eacfb3f5572347800b19d6481b7e466ca00dbb6bc +size 297351 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00025_000001_02.cma.json new file mode 100644 index 000000000..68647035f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8927ef6ed2c41e311cd19000eacc108dbba598ea319849aaf57325c71870b36c +size 231070 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00025_000002_02.cma.json new file mode 100644 index 000000000..12b212ef2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0480e0bdc5d79987b4d09b394c95255d350fb2cdfa37574a5fb9a3d7deebef2e +size 285047 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00051_000001_01.cma.json new file mode 100644 index 000000000..7a71e1c5d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a25be2c28974b8e9760e3c12e9fbdecd599b56364180e48fdef7a12277c5913 +size 585901 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00051_000002_01.cma.json new file mode 100644 index 000000000..0d0413992 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcontrav/bcontrav_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29fac49ef43737bbaa8049f274a2e149590326a76bba48ae131373d30719264e +size 585820 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00025_000001_02.cma.json new file mode 100644 index 000000000..94f12a3d6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e2a9c9760f43c87e184b65ed615f63c7b3b31c958368440b581bc6edf90f30e +size 429459 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00025_000002_02.cma.json new file mode 100644 index 000000000..3071a18cb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:948c793d04f641e4b029d6fb4676d98e597e2ff8144e9353603efaaa0ae02621 +size 429834 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00051_000001_01.cma.json new file mode 100644 index 000000000..449179ec1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf0d6a0a4d27113eec7e9041fa73f495fd1658c0145f2efcfcafb24446416791 +size 883633 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00051_000002_01.cma.json new file mode 100644 index 000000000..fa0ed68f2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov/bcov_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7e753c0e550f06ae414148bc5b6e14fbeabb27b3b4d06c6765212baf032c362 +size 883644 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00025_000001_02.cma.json new file mode 100644 index 000000000..342f0bea6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf2d2d541e579d5fc7cd9f54f3aff491ca09de2a600837276d1e25876529d452 +size 292659 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00025_000002_02.cma.json new file mode 100644 index 000000000..02400c4ea --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21e18a79c24b3afd98ed53033ff3c092934b3f6a9a4e25e8e211951da560b735 +size 292830 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00051_000001_01.cma.json new file mode 100644 index 000000000..45b9a1e53 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9467c709c520b008c2d11c129553b88da429d0095c205c0f9f9ffe7aeb00426e +size 596688 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00051_000002_01.cma.json new file mode 100644 index 000000000..063fd3c80 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcov_full/bcov_full_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:829019747534487e3bea592a03d0f93775796faa4e7fddfb50c11826b7843699 +size 596687 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcovar_fileout/bcovar_fileout_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcovar_fileout/bcovar_fileout_00051_000000_01.cma.json new file mode 100644 index 000000000..c03c02718 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bcovar_fileout/bcovar_fileout_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5756ac1c9bf89ba78a620dc1f7d162b9ddd77e0176f647ebb25e13659e8320df +size 1766030 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bss/bss_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bss/bss_00051_000000_01.cma.json new file mode 100644 index 000000000..1691b56e0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/bss/bss_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90ec9b10754ae5aea5284defe6695a9f4cbee5cb9a3f9ae32ef3ceabb77baa82 +size 2973197 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00025_000001_02.cma.json new file mode 100644 index 000000000..b1d6f4ee5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74c180b4bc57b4f222efe815a1e8b4b9adca3fd0bed7edfc49a14d753f6c3c2f +size 4775 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00025_000002_02.cma.json new file mode 100644 index 000000000..2c30a603f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b3fd695f40e3dcf7aec25fbaadd737da17052ce9d96a416a778a34f9ab81c3d +size 4819 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00051_000001_01.cma.json new file mode 100644 index 000000000..05fe51c8a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e300ffb02ad3c5b5ff4aa6fccee6a2d3ed2c30edc9fe47a6ff393b47b22aa783 +size 9983 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00051_000002_01.cma.json new file mode 100644 index 000000000..03e79a2b7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/calc_fbal/calc_fbal_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe16d9b2f01990638da9888188522d4d3367105718785a8e10495fe82e9e92e6 +size 9988 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00025_000001_02.cma.json new file mode 100644 index 000000000..64246acf0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4697feaef237e63f95173d3a915aba8d2a24180b39bacecaab1aef0685924065 +size 1281054 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00025_000002_02.cma.json new file mode 100644 index 000000000..58fe0c77c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0143d6984c92caefa0a862926db1db1afbe5d61af28e140de2b4fb5c8c61ee4d +size 1280184 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00051_000001_01.cma.json new file mode 100644 index 000000000..b5ba7c7c4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4189f049083f5ad15345ea7f457b36bd56c6cbe3d04266c5a768b0362737e708 +size 2652626 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00051_000002_01.cma.json new file mode 100644 index 000000000..c8bca8d0d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/constraint_force/constraint_force_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5e2f74c3b010bd6327b1504ee4a00d71ac7de9de714c514a316bf4517aef506 +size 2652868 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00025_000001_02.cma.json new file mode 100644 index 000000000..606a08efe --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96e868646a4950661f72565d4ec6995c05c201f9e67e2a35505e247bfc10ca65 +size 1297759 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00025_000002_02.cma.json new file mode 100644 index 000000000..aaf50fcc6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92205379188838a700598bbc068f72f4c1c37f28f1409664a812c50cbd5aca7a +size 1401109 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00051_000001_01.cma.json new file mode 100644 index 000000000..daad5c9c3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65189f2f961e2e7e235b9b829342a8ea9a8c3c8dd1aa96eac3fbff00b0d66ac2 +size 2718057 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00051_000002_01.cma.json new file mode 100644 index 000000000..d0bd0ac8e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/evolve/evolve_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d69a44e8093d22578e7776f14aed3805358f3ccd50692a0b4e7eb47ae62ea90 +size 2886695 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fixaray/fixaray_00000_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fixaray/fixaray_00000_000001_01.cma.json new file mode 100644 index 000000000..997e92616 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fixaray/fixaray_00000_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f64cb85fd78c55afd3c29b4a6b2245daf0fc83ceed54e703f52b299cf174fb34 +size 114037 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forceNorms_tcon/forceNorms_tcon_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forceNorms_tcon/forceNorms_tcon_00025_000001_02.cma.json new file mode 100644 index 000000000..0eb0527a4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forceNorms_tcon/forceNorms_tcon_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58b0b3b3cc281ba2fdb6c4c1b9d1eadb9fdfbdaeada53d97917264b1f2a08b72 +size 403978 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forceNorms_tcon/forceNorms_tcon_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forceNorms_tcon/forceNorms_tcon_00051_000001_01.cma.json new file mode 100644 index 000000000..dbce50047 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forceNorms_tcon/forceNorms_tcon_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da131ee88b92c128be623581f8411b736e080ecf04bb33aa32e11417136c3953 +size 878072 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00025_000001_02.cma.json new file mode 100644 index 000000000..b9ae6516f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3effb6c098bc9494d47bed56a8f35330c4ff57212b4b25dd4f72af56812c3f15 +size 8556230 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00025_000002_02.cma.json new file mode 100644 index 000000000..8a02bb28e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62080a71373d5961edee5ce51ca37e7e66c2b9901f1204ff44d5fe9d78f7b4c7 +size 8560234 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00051_000001_01.cma.json new file mode 100644 index 000000000..50fdf5e76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9a867aacf5520a3efaebf87d0109d5dcadf8459463345b45bbcd7241e7d8087 +size 17558807 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00051_000002_01.cma.json new file mode 100644 index 000000000..ace39fc45 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/forces/forces_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dfd11e6158ed830b0fd50199ee7453bc503702f4b46c77acf64a8ddbb0f55e1 +size 17559559 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00025_000001_02.cma.json new file mode 100644 index 000000000..cd8358e9b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5a6afe843c50fdf87221605549848f1c7a1dd087594d5a1a56d8ec978400b46 +size 233 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00025_000002_02.cma.json new file mode 100644 index 000000000..e3b29ae02 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77b5a17ce9d1905c020b4c18bcfd8f9cce5d63c0bdcfaec5a5450a77526ef030 +size 235 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00051_000001_01.cma.json new file mode 100644 index 000000000..16ed2862c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fd7c9a53043c80a2a704f8d3db2655f00da5510466838481da5e653bad9891b +size 241 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00051_000002_01.cma.json new file mode 100644 index 000000000..209609037 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq/fsq_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9ffc5950dff570a7552081d11aba232b9261557d17c033f6849cbb8bf08dc46 +size 242 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00025_000001_02.cma.json new file mode 100644 index 000000000..f5e45590f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acc1692d8c3824b5e1bcd2e7fe8af7b615e5ed06a7f14c7431d59891a5e6ebbe +size 143 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00025_000002_02.cma.json new file mode 100644 index 000000000..6482b8ee1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:185a34977b9dc1121bd8eb288a275a391d7dd5a4f47bdc70ed44500e52fdcef9 +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00051_000001_01.cma.json new file mode 100644 index 000000000..5341ee993 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89470f314276dd70f3aee525b9be5150c5c4157d786380404b0cdff95fcb0d45 +size 147 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00051_000002_01.cma.json new file mode 100644 index 000000000..702753dcb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/fsq1/fsq1_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74d77d6aa5fe1461523e2f4ad455e96031f9a154cb2fc7b39bc612e0d5281105 +size 147 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000001_01.cma.json new file mode 100644 index 000000000..416f24ffa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00b508c286b017af160d613aec7db90fbddc4f51dc3a26501e26dc5370e97a75 +size 3043390 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000001_02.cma.json new file mode 100644 index 000000000..997587c82 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6257531eae7d9c6ca04052a9b422cbf1f5ea38e8507a303c6d2216f5e57d280b +size 3046461 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000002_02.cma.json new file mode 100644 index 000000000..73c66ec92 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8eaebf15b85aad899f4e6b3d6319972a72f970fb26781823bcff424ba2a47f7d +size 3283641 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00051_000001_01.cma.json new file mode 100644 index 000000000..1255a31f9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2fc919ae305621f1dd5d8937e0afd4569b808ad33c2a17c57ef092086138ddc +size 6705436 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00051_000002_01.cma.json new file mode 100644 index 000000000..b141d67dc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/funct3d_geometry/funct3d_geometry_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f398cde56bb24cdad60d85ed60c56ea6348654076a86623905b27a82d8a296fd +size 6705978 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/guess_axis/guess_axis_00025_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/guess_axis/guess_axis_00025_000001_01.cma.json new file mode 100644 index 000000000..8acb516c3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/guess_axis/guess_axis_00025_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edc4e53bf2b33130d549354c9ffe2285b5c0833a558d0b044388bef032ee0088 +size 61716 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/interp/interp_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/interp/interp_00051_000001_01.cma.json new file mode 100644 index 000000000..aac12765e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/interp/interp_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c562949dfdc8ef01c4b081b89f4e6ab52a02fef4fa3acd6f101404594ee3d346 +size 1337231 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000001_01.cma.json new file mode 100644 index 000000000..5d02bdb96 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2aae39eff937665923ff7bf1e7275276236a839938090ba292b0b2bcff95fa4 +size 870513 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000001_02.cma.json new file mode 100644 index 000000000..b93f3ea6c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90ac4e3d032c8613f7f1070788aada08689e5f9b8fdd5c5eb0534151deb6248d +size 883640 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000002_02.cma.json new file mode 100644 index 000000000..b40f6871d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:503ad61da867db11d95d90be08a0d6106de18ae06cdf7c2d789edbdebce7e116 +size 883653 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00051_000001_01.cma.json new file mode 100644 index 000000000..12fb45d11 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6691f85434611040b2d441673622a7fa6d3b6c76131f0c686c0a344f59f508b0 +size 1802220 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00051_000002_01.cma.json new file mode 100644 index 000000000..4e423237f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jacobian/jacobian_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4dc6d67fef011400230af8f55edcad4c7ef24dd70838a1366788eda4a163833 +size 1802636 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00051_000000_01.cma.json new file mode 100644 index 000000000..2031c208b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd881fe7e9885e6d4ff03982bdb757568a17cdff999e38f37d11385ac57ccc04 +size 2738662 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jxbout/jxbout_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jxbout/jxbout_00051_000000_01.cma.json new file mode 100644 index 000000000..0a66fee63 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/jxbout/jxbout_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1ce5d255742844073f4903c8d727533f836420081fa9a33dd490fc8eb0cc3ee +size 4324786 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00025_000001_02.cma.json new file mode 100644 index 000000000..744461019 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1854c46284f38d9e719e6e88e304d0bf594bfd6bc01c2af61d3b01abd466803b +size 702483 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00025_000002_02.cma.json new file mode 100644 index 000000000..e6b06d37a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e933ad11d9f0c1e86d88f9b5f5003b71b733f97373c7175dae17e470f5e05993 +size 774189 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00051_000001_01.cma.json new file mode 100644 index 000000000..b3bd91653 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f05712363b3ac708760084bb90308a77e4cd0e68a5e65b6a8d40f00da033163c +size 1582185 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00051_000002_01.cma.json new file mode 100644 index 000000000..a638f972c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lambda_forces/lambda_forces_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14d9dd0b57fd6cc00e32beeccab89b7569338b2ca4c58974089a5a14eaa00358 +size 1582195 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lamcal/lamcal_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lamcal/lamcal_00025_000001_02.cma.json new file mode 100644 index 000000000..1816d1e45 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lamcal/lamcal_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfa11f11bca0060f8c3c62239e88ca0adbe4c34122c8c60043e662d92e4c8a51 +size 39116 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lamcal/lamcal_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lamcal/lamcal_00051_000001_01.cma.json new file mode 100644 index 000000000..93df6f98e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lamcal/lamcal_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be66a724561218193ed249999b148d94711081cb36e683714064fb7b5846d62c +size 80161 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00025_000001_02.cma.json new file mode 100644 index 000000000..32f35bb0f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d67da65930288b39e3d2a56a431f129bb4955257609f2de7cb18f4a46be7d3 +size 1764379 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00025_000002_02.cma.json new file mode 100644 index 000000000..585c26d1b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa082aa1f57c0d33b385ddb8d1f4b5af523ef05167d849dacd2e4cb2310bd31f +size 1898608 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00051_000001_01.cma.json new file mode 100644 index 000000000..2be671ac2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c84586e557d9878550c1323eeff765aaf6652caff35263f84e73c6def541912c +size 3889041 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00051_000002_01.cma.json new file mode 100644 index 000000000..8a074653a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/lulv_comb/lulv_comb_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3be80a9daef76dcb856e1ef7d2e671f1f4823a2009c67e80c1825dff083e18e0 +size 3888898 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/mercier/mercier_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/mercier/mercier_00051_000000_01.cma.json new file mode 100644 index 000000000..4313756c7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/mercier/mercier_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b4d9d13432bb9d6fe57640ea5a879cba738fac4e5f4d7687d5a55b2888370dc +size 1165128 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00025_000001_02.cma.json new file mode 100644 index 000000000..96303c535 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d9812311ea3ccc69d6fc8d77979662b7552a989aee5cb7acb5167690a4e9e3b +size 728396 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00025_000002_02.cma.json new file mode 100644 index 000000000..936169a2b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8c27e62d1c9c80ffaaf663824e0fa3d202e4a5cd6d28d0ad52683830491d7f6 +size 728385 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00051_000001_01.cma.json new file mode 100644 index 000000000..e08c444fd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75dbcae310d2e33c4db5ddc3594e98dd49f4b507b04bd5796d754f09cc8510bf +size 1485045 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00051_000002_01.cma.json new file mode 100644 index 000000000..6930f482c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/metric/metric_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:040f49aff394c9403927d30b9e3bc35ebc145c652e6e32587e8bf49447d699af +size 1484961 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/multigrid_result/multigrid_result_00025_000218_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/multigrid_result/multigrid_result_00025_000218_00.cma.json new file mode 100644 index 000000000..ff540c25c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/multigrid_result/multigrid_result_00025_000218_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5991dc942b70891239a93e273c795af951639c4a6c085e89dddd91873970082 +size 515079 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/multigrid_result/multigrid_result_00051_000207_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/multigrid_result/multigrid_result_00051_000207_00.cma.json new file mode 100644 index 000000000..543fbbdd3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/multigrid_result/multigrid_result_00051_000207_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c62b4fdf2f2364886af059d20a56607faf7e65ae72aa82a415bf8e971f83e5f +size 1054108 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00025_000001_02.cma.json new file mode 100644 index 000000000..b86d2ae03 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a75fcb4574e073c3675a08742781b0c6135b814494ada3111bdc4427d0a99805 +size 245605 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00025_000002_02.cma.json new file mode 100644 index 000000000..269be203b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1c8dd60d83a3e04ac23b6fe9b67cc0110912e0a0052c31daa4f881f32777bf2 +size 249436 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00051_000001_01.cma.json new file mode 100644 index 000000000..957baf04d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0461f26bd18aa597e52b670e4f171f5e5b343c9825c41ec42ddebeda6f8261f8 +size 510874 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00051_000002_01.cma.json new file mode 100644 index 000000000..4ee0dd3af --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/phys_gc/phys_gc_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b1a1d356722137a09a296fdc96362594a9d3a0208652f57a42d9973057f518d +size 516722 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/precondn/precondn_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/precondn/precondn_00025_000001_02.cma.json new file mode 100644 index 000000000..a9a26e733 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/precondn/precondn_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2636a4ca736918892146037545625bf987c5693ff693ec779d4952995d33875 +size 18130 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/precondn/precondn_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/precondn/precondn_00051_000001_01.cma.json new file mode 100644 index 000000000..8465968aa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/precondn/precondn_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5229a1c3fbd122d35ecbfdc6386438984b5cffee40d644410c1eee7de5d20349 +size 36497 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/printout/printout_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/printout/printout_00025_000001_02.cma.json new file mode 100644 index 000000000..747a5ea2c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/printout/printout_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34b95f0c0451cfe35ebbb1cc6d56d1d2a246d61fd7caf46aa0188c2f65ca40e3 +size 282355 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/printout/printout_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/printout/printout_00051_000001_01.cma.json new file mode 100644 index 000000000..024debdea --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/printout/printout_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7751f68595059367ada17a398cf6de527376a578e8febf87fba0e89cdf815b65 +size 525125 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil1d/profil1d_00025_000001_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil1d/profil1d_00025_000001_00.cma.json new file mode 100644 index 000000000..dfa9b6c55 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil1d/profil1d_00025_000001_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0015816764849e6bf7ec0ed0ba0400209d6ce65788c103f1f2c8d617469f532 +size 7277 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil1d/profil1d_00051_000001_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil1d/profil1d_00051_000001_00.cma.json new file mode 100644 index 000000000..43b1000f1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil1d/profil1d_00051_000001_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b35d4e3b9cf41e0865de09c013efc659349a8cfc39420e9d56edcb0a63837dd4 +size 14263 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00025_000001_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00025_000001_00.cma.json new file mode 100644 index 000000000..8e9ffd9c0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00025_000001_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ce0f9c85f59fe924eefab3349cad2bf6a8ff6c93663b2eadc73c29551f4c79e +size 195699 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00025_000001_02.cma.json new file mode 100644 index 000000000..a7cbd0a76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24a4a8994c4b96e18e998df8ed12343a729211262b55ae91a3ffee4c3127f2fd +size 195827 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00051_000001_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00051_000001_00.cma.json new file mode 100644 index 000000000..50e774fd3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/profil3d/profil3d_00051_000001_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8478849caaba0988dbc4884c82ed65854db435ef884c2948d07cdfd3dd54dccb +size 401527 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/readin_boundary/readin_boundary_00000_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/readin_boundary/readin_boundary_00000_000001_01.cma.json new file mode 100644 index 000000000..9aa0f559d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/readin_boundary/readin_boundary_00000_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aab11d473acf22c7febb6abec94540b842c50f129d4f5521a43a0ab3d551d93 +size 5155 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00025_000001_02.cma.json new file mode 100644 index 000000000..6b69a49e7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a0d5097745ee3f9c0ba9344f984376af3e214c7d8837689272c7175676e0776 +size 161599 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00025_000002_02.cma.json new file mode 100644 index 000000000..aa5ba2763 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0f156288f3a86b91f3aaa6230164e996347ade9cc8fddfd2a7695f41f2ee8f9 +size 165412 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00051_000001_01.cma.json new file mode 100644 index 000000000..be2ee0c20 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fa9321d8b252bd3360d72267eaef4a320495ace556e56f37eeb0ce2394a48ae +size 338154 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00051_000002_01.cma.json new file mode 100644 index 000000000..451010924 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scale_m1/scale_m1_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b585f5e24da5f660b392acca57bf4bf4b8bb1e3b4d06f575c2257e4d575dd1d8 +size 344005 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00025_000001_02.cma.json new file mode 100644 index 000000000..4326f6e86 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16222fbf024d1451801495cb41e16228c625c2df5a3ac7db44c8529e6c2f9697 +size 106995 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00025_000002_02.cma.json new file mode 100644 index 000000000..87a19ecdd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e408bac4b1cdf89313f6df067ab2210fce84842cc34e62cf41d0f6c3ee62e68e +size 107273 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00051_000001_01.cma.json new file mode 100644 index 000000000..3ab8512d7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a36e1a04755aabf79241a368e7f1ad118e29482646c262b0bb4eae9f2c7a8c7 +size 221500 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00051_000002_01.cma.json new file mode 100644 index 000000000..3ab8512d7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_R/scalfor_R_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a36e1a04755aabf79241a368e7f1ad118e29482646c262b0bb4eae9f2c7a8c7 +size 221500 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00025_000001_02.cma.json new file mode 100644 index 000000000..75bae8fe4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aef2e841d4a7a532956ceb5d5c9ba0831b3f4da6de9b920d4340bda9a2d3bd38 +size 107251 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00025_000002_02.cma.json new file mode 100644 index 000000000..689ac52ee --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6d424259db05ff86df1c95cd2c6252d5f4c5346c61b339b181bc3cd19fe9a3a +size 107050 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00051_000001_01.cma.json new file mode 100644 index 000000000..9bf3ee10f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49b0503a13de8da29cdd5d1a50283bcd015c7fc07185a0b3dc255955c9f252a7 +size 221200 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00051_000002_01.cma.json new file mode 100644 index 000000000..9bf3ee10f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_Z/scalfor_Z_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49b0503a13de8da29cdd5d1a50283bcd015c7fc07185a0b3dc255955c9f252a7 +size 221200 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00025_000001_02.cma.json new file mode 100644 index 000000000..72140d7ca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcb95954ff737567ae9aa52970700d4770eaee4034ec294ce200dd538bc2d947 +size 265759 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00025_000002_02.cma.json new file mode 100644 index 000000000..6df3d5cdc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86c713b43ddfd82ad099570947168719eede145cce45aaa413ef028b068157d5 +size 268535 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00051_000001_01.cma.json new file mode 100644 index 000000000..fb665f079 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f68963f73e5e37fef541387b6922c9b4c4de236d96b7311b4838269148c3fc4c +size 549897 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00051_000002_01.cma.json new file mode 100644 index 000000000..07b0f0f03 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/scalfor_out/scalfor_out_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e783f36a61f0ead01cbcc838ba997e42ca5284f5aad6b1208d1771fa89c38896 +size 555210 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/spectral_constraint/spectral_constraint_00000_000001_00.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/spectral_constraint/spectral_constraint_00000_000001_00.cma.json new file mode 100644 index 000000000..5ec8ca762 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/spectral_constraint/spectral_constraint_00000_000001_00.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd187963b64bcfcf21c24791d50259e1a953b8c2d8f1556c7e502007e4e62568 +size 514 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_axis/threed1_axis_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_axis/threed1_axis_00051_000000_01.cma.json new file mode 100644 index 000000000..af7235686 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_axis/threed1_axis_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e657667bec78d820a6128770b042e9ee9b1d741088aa86ad779cdd8a672a54d2 +size 693 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_beta/threed1_beta_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_beta/threed1_beta_00051_000000_01.cma.json new file mode 100644 index 000000000..e9370f4a6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_beta/threed1_beta_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e1dad3af7a19ad2cebd7aa44fc2c2b907522204a1f9a8b35d79c9349ccf6a02 +size 136 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_firstTable/threed1_firstTable_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_firstTable/threed1_firstTable_00051_000000_01.cma.json new file mode 100644 index 000000000..9e021de49 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_firstTable/threed1_firstTable_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6367f44d4a91d2498b26f7c9fc359e0ea30bc6947542f376cc95178d1c4319ec +size 23773 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_geomag/threed1_geomag_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_geomag/threed1_geomag_00051_000000_01.cma.json new file mode 100644 index 000000000..f9e03d441 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_geomag/threed1_geomag_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0982cb9d0fa700e26314298a524ad6d0f5c362fa44513de754a808c1ef0f59bb +size 35428 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_shafrint/threed1_shafrint_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_shafrint/threed1_shafrint_00051_000000_01.cma.json new file mode 100644 index 000000000..73811f12b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_shafrint/threed1_shafrint_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10b856465c44cf10c592b2d93f3ff60ee0783a3d727b0e8be7b46bf51d7192d1 +size 486 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_volquant/threed1_volquant_00051_000000_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_volquant/threed1_volquant_00051_000000_01.cma.json new file mode 100644 index 000000000..1850e78a0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/threed1_volquant/threed1_volquant_00051_000000_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ce72328d763a5dd848b065a5a7cf22bd519b9a13b491ea3cd4553c22e3e250 +size 291 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00025_000001_02.cma.json new file mode 100644 index 000000000..caa79987c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:688531c5c2328f73333f5560c8df153cfaee94dd094dcfb53e5246a92c761933 +size 217581 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00025_000002_02.cma.json new file mode 100644 index 000000000..d61dfc88e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e481137229c2ff57fa07e2b55c9ddda7eac84a1a386367c31f617710ee04f1cb +size 218844 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00051_000001_01.cma.json new file mode 100644 index 000000000..c1e5634d2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:407276f2294abbc0e6c5e7f492b60cf368fad8723e6abb0fc9aec0d63f9695c9 +size 453996 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00051_000002_01.cma.json new file mode 100644 index 000000000..12d6452e3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/tomnsps/tomnsps_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fc6d4c9c8edc6e086437268de0676bb3f9d55432b6865dcf47d2d8217cac5cc +size 454304 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000001_01.cma.json new file mode 100644 index 000000000..384dab81e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:195769090a7775535f32d81c621e56bf908507e486bab460a4ae17e037d0aa68 +size 255520 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000001_02.cma.json new file mode 100644 index 000000000..3b0bd3ed7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a6749483738ab9dee8554c14ff00705c0dac186ab6b444756997c1c70122407 +size 255648 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000002_02.cma.json new file mode 100644 index 000000000..8ece4860a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80a4ecc49c13838dfd0b63354d2d56da09a2d86db665528079819d7bd9d9e278 +size 280965 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00051_000001_01.cma.json new file mode 100644 index 000000000..216d95f78 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ce0d8d03ecf02e63fbf9870efcb416f24673e12d5245f015d5bea0dba402dba +size 575541 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00051_000002_01.cma.json new file mode 100644 index 000000000..587ee724f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/totzsp_input/totzsp_input_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40e3fad237f747fc1a6379efed24c5e15174d7acf16cf4decc441509298bf1e9 +size 575597 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00025_000001_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00025_000001_02.cma.json new file mode 100644 index 000000000..fea9a8704 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00025_000001_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1ac8fff1736e0e9e9c925a13d2b0c42fd241475e9c17525816fc365a2274754 +size 795 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00025_000002_02.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00025_000002_02.cma.json new file mode 100644 index 000000000..8c9dc1cb9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00025_000002_02.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:486ff9b56fe1bedae2974b649f8166fef23ba1a8e655288e8f13d0863e34c9b3 +size 790 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00051_000001_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00051_000001_01.cma.json new file mode 100644 index 000000000..a4e31fda0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00051_000001_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65287dd96dbfc2a03c40fcd2f763144d66fe2083d71f1f6989270165fd0a5a55 +size 1572 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00051_000002_01.cma.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00051_000002_01.cma.json new file mode 100644 index 000000000..078fdb797 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cma/volume/volume_00051_000002_01.cma.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03d44cb6e6cd12c7223d93de8415921689e3217927b1bdaaaad2d919f036f3c8 +size 1571 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.cth_like b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.cth_like new file mode 100644 index 000000000..301778258 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.cth_like @@ -0,0 +1,229 @@ +! Simplified Coil model based on CTH. + +&MGRID_NLI + MGRID_EXT = 'cth_like' + MGRID_MODE = 'R' + LSTELL_SYM = .TRUE. + RMIN = 0.45 + RMAX = 1.05 + ZMIN = -0.3 + ZMAX = 0.3 + IR = 101 + JZ = 101 + KP = 36 +/ + +** coils_dot_starts_below ** +periods 5 +begin filament +mirror NUL +1.13366 0. 0. 96 +1.1284 0.0324661 0.0600069 96 +1.11269 0.0660545 0.118482 96 +1.0867 0.101324 0.173958 96 +1.05079 0.1379 0.225085 96 +1.00565 0.174435 0.270661 96 +0.95232 0.208904 0.309637 96 +0.892312 0.239152 0.341109 96 +0.827436 0.263483 0.364319 96 +0.759623 0.28112 0.37865 96 +0.690669 0.292363 0.383661 96 +0.622062 0.298452 0.379121 96 +0.554917 0.301189 0.365058 96 +0.490005 0.302485 0.341791 96 +0.427826 0.303968 0.309939 96 +0.368663 0.306766 0.270398 96 +0.312606 0.311488 0.224283 96 +0.259552 0.318366 0.172851 96 +0.209208 0.327452 0.117433 96 +0.161083 0.338787 0.0593731 96 +0.114531 0.35249 5.0307E-17 96 +0.0688152 0.368767 -0.0593731 96 +0.0232192 0.387884 -0.117433 96 +-0.0228512 0.410125 -0.172851 96 +-0.0698152 0.435744 -0.224283 96 +-0.117943 0.464873 -0.270398 96 +-0.167451 0.497385 -0.309939 96 +-0.218626 0.532733 -0.341791 96 +-0.271902 0.569839 -0.365058 96 +-0.327833 0.607092 -0.379121 96 +-0.386916 0.642492 -0.383661 96 +-0.44931 0.673926 -0.37865 96 +-0.514538 0.699517 -0.364319 96 +-0.581326 0.717965 -0.341109 96 +-0.647652 0.728767 -0.309637 96 +-0.711054 0.732224 -0.270661 96 +-0.769054 0.729204 -0.225085 96 +-0.8196 0.720717 -0.173958 96 +-0.861359 0.707462 -0.118482 96 +-0.893813 0.689523 -0.0600069 96 +-0.917147 0.666346 -9.54098E-17 96 +-0.931979 0.636992 0.0600069 96 +-0.939011 0.600584 0.118482 96 +-0.938713 0.556772 0.173958 96 +-0.931165 0.506077 0.225085 96 +-0.916114 0.449983 0.270661 96 +-0.893234 0.390753 0.309637 96 +-0.862465 0.33101 0.341109 96 +-0.824281 0.273192 0.364319 96 +-0.779786 0.219064 0.37865 96 +-0.73061 0.169438 0.383661 96 +-0.678685 0.124186 0.379121 96 +-0.625972 0.0825046 0.365058 96 +-0.574219 0.0433018 0.341791 96 +-0.524787 0.00555449 0.309939 96 +-0.478567 -0.0314838 0.270398 96 +-0.435991 -0.0682541 0.224283 96 +-0.397113 -0.105003 0.172851 96 +-0.361724 -0.141945 0.117433 96 +-0.329453 -0.179402 0.0593731 96 +-0.299846 -0.217851 1.50054E-16 96 +-0.272429 -0.25789 -0.0593731 96 +-0.246777 -0.300157 -0.117433 96 +-0.222578 -0.34523 -0.172851 96 +-0.199642 -0.393561 -0.224283 96 +-0.177828 -0.445415 -0.270398 96 +-0.156885 -0.500818 -0.309939 96 +-0.136261 -0.559495 -0.341791 96 +-0.114969 -0.62083 -0.365058 96 +-0.091617 -0.683843 -0.379121 96 +-0.0646255 -0.747211 -0.383661 96 +-0.0326245 -0.809315 -0.37865 96 +0.00510449 -0.868359 -0.364319 96 +0.0482928 -0.922541 -0.341109 96 +0.0956033 -0.970266 -0.309637 96 +0.144864 -1.01033 -0.270661 96 +0.193562 -1.04198 -0.225085 96 +0.239443 -1.06482 -0.173958 96 +0.281019 -1.07864 -0.118482 96 +0.317818 -1.08321 -0.0600069 96 +0.350319 -1.07817 -1.89952E-16 96 +0.379572 -1.06314 0.0600069 96 +0.406662 -1.03782 0.118482 96 +0.432173 -1.0022 0.173958 96 +0.455864 -0.95675 0.225085 96 +0.476659 -0.902522 0.270661 96 +0.492963 -0.841156 0.309637 96 +0.503186 -0.774737 0.341109 96 +0.506279 -0.705518 0.364319 96 +0.502097 -0.635573 0.37865 96 +0.491482 -0.56652 0.383661 96 +0.476073 -0.49939 0.379121 96 +0.457927 -0.434685 0.365058 96 +0.4391 -0.372549 0.341791 96 +0.421296 -0.312956 0.309939 96 +0.405675 -0.255824 0.270398 96 +0.392843 -0.20105 0.224283 96 +0.382991 -0.148468 0.172851 96 +0.376075 -0.0977799 0.117433 96 +0.371983 -0.0485082 0.0593731 96 +0.37063 -4.94396E-17 2.498E-16 96 +0.371983 0.0485082 -0.0593731 96 +0.376075 0.0977799 -0.117433 96 +0.382991 0.148468 -0.172851 96 +0.392843 0.20105 -0.224283 96 +0.405675 0.255824 -0.270398 96 +0.421296 0.312956 -0.309939 96 +0.4391 0.372549 -0.341791 96 +0.457927 0.434685 -0.365058 96 +0.476073 0.49939 -0.379121 96 +0.491482 0.56652 -0.383661 96 +0.502097 0.635573 -0.37865 96 +0.506279 0.705518 -0.364319 96 +0.503186 0.774737 -0.341109 96 +0.492963 0.841156 -0.309637 96 +0.476659 0.902522 -0.270661 96 +0.455864 0.95675 -0.225085 96 +0.432173 1.0022 -0.173958 96 +0.406662 1.03782 -0.118482 96 +0.379572 1.06314 -0.0600069 96 +0.350319 1.07817 -2.7929E-16 96 +0.317818 1.08321 0.0600069 96 +0.281019 1.07864 0.118482 96 +0.239443 1.06482 0.173958 96 +0.193562 1.04198 0.225085 96 +0.144864 1.01033 0.270661 96 +0.0956033 0.970266 0.309637 96 +0.0482928 0.922541 0.341109 96 +0.00510449 0.868359 0.364319 96 +-0.0326245 0.809315 0.37865 96 +-0.0646255 0.747211 0.383661 96 +-0.091617 0.683843 0.379121 96 +-0.114969 0.62083 0.365058 96 +-0.136261 0.559495 0.341791 96 +-0.156885 0.500818 0.309939 96 +-0.177828 0.445415 0.270398 96 +-0.199642 0.393561 0.224283 96 +-0.222578 0.34523 0.172851 96 +-0.246777 0.300157 0.117433 96 +-0.272429 0.25789 0.0593731 96 +-0.299846 0.217851 3.50414E-16 96 +-0.329453 0.179402 -0.0593731 96 +-0.361724 0.141945 -0.117433 96 +-0.397113 0.105003 -0.172851 96 +-0.435991 0.0682541 -0.224283 96 +-0.478567 0.0314838 -0.270398 96 +-0.524787 -0.00555449 -0.309939 96 +-0.574219 -0.0433018 -0.341791 96 +-0.625972 -0.0825046 -0.365058 96 +-0.678685 -0.124186 -0.379121 96 +-0.73061 -0.169438 -0.383661 96 +-0.779786 -0.219064 -0.37865 96 +-0.824281 -0.273192 -0.364319 96 +-0.862465 -0.33101 -0.341109 96 +-0.893234 -0.390753 -0.309637 96 +-0.916114 -0.449983 -0.270661 96 +-0.931165 -0.506077 -0.225085 96 +-0.938713 -0.556772 -0.173958 96 +-0.939011 -0.600584 -0.118482 96 +-0.931979 -0.636992 -0.0600069 96 +-0.917147 -0.666346 -3.75568E-16 96 +-0.893813 -0.689523 0.0600069 96 +-0.861359 -0.707462 0.118482 96 +-0.8196 -0.720717 0.173958 96 +-0.769054 -0.729204 0.225085 96 +-0.711054 -0.732224 0.270661 96 +-0.647652 -0.728767 0.309637 96 +-0.581326 -0.717965 0.341109 96 +-0.514538 -0.699517 0.364319 96 +-0.44931 -0.673926 0.37865 96 +-0.386916 -0.642492 0.383661 96 +-0.327833 -0.607092 0.379121 96 +-0.271902 -0.569839 0.365058 96 +-0.218626 -0.532733 0.341791 96 +-0.167451 -0.497385 0.309939 96 +-0.117943 -0.464873 0.270398 96 +-0.0698152 -0.435744 0.224283 96 +-0.0228512 -0.410125 0.172851 96 +0.0232192 -0.387884 0.117433 96 +0.0688152 -0.368767 0.0593731 96 +0.114531 -0.35249 3.99854E-16 96 +0.161083 -0.338787 -0.0593731 96 +0.209208 -0.327452 -0.117433 96 +0.259552 -0.318366 -0.172851 96 +0.312606 -0.311488 -0.224283 96 +0.368663 -0.306766 -0.270398 96 +0.427826 -0.303968 -0.309939 96 +0.490005 -0.302485 -0.341791 96 +0.554917 -0.301189 -0.365058 96 +0.622062 -0.298452 -0.379121 96 +0.690669 -0.292363 -0.383661 96 +0.759623 -0.28112 -0.37865 96 +0.827436 -0.263483 -0.364319 96 +0.892312 -0.239152 -0.341109 96 +0.95232 -0.208904 -0.309637 96 +1.00565 -0.174435 -0.270661 96 +1.05079 -0.1379 -0.225085 96 +1.0867 -0.101324 -0.173958 96 +1.11269 -0.0660545 -0.118482 96 +1.1284 -0.0324661 -0.0600069 96 +1.13366 0. 0. 0 1 HF-OVF + 1.26599000000000E+00 0.00000000000000E+00 -5.23002000000000E-01 -16 1 HF-OVF + 1.26599000000000E+00 0.00000000000000E+00 5.23002000000000E-01 -16 1 HF-OVF + 1.26799000000000E+00 0.00000000000000E+00 5.73261000000000E-01 -36 2 TVF + 1.26799000000000E+00 0.00000000000000E+00 -5.73261000000000E-01 -36 2 TVF + 1.26799000000000E+00 0.00000000000000E+00 4.63502000000000E-01 -36 2 TVF + 1.26799000000000E+00 0.00000000000000E+00 -4.63502000000000E-01 -36 2 TVF + 2.51000000000000E-01 0.00000000000000E+00 4.31000000000000E-01 124 2 TVF + 2.51000000000000E-01 0.00000000000000E+00 -4.31000000000000E-01 124 2 TVF +end diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.solovev b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.solovev new file mode 100644 index 000000000..2cdeb2a30 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.solovev @@ -0,0 +1,38 @@ +! Coils for a free-boundary equilibrium similar to the Solov'ev equilibrium in Hirshman & Whitson (1983). +! Also used in the free-boundary SPEC verification paper by Hudson et al (2020). + +&MGRID_NLI + MGRID_EXT = 'solovev' + MGRID_MODE = 'R' + LSTELL_SYM = .false. + IR = 201 + JZ = 201 + KP = 1 + Rmin = 2.0 + Rmax = 6.0 + Zmin = -2.0 + Zmax = 2.0 +/ + +** coils_dot_starts_below ** +periods 1 +begin filament +mirror NIL + 0.0 0.0 -1.0e6 1 + 0.0 0.0 1.0e6 1 + 1.0e6 0.0 1.0e6 1 + 1.0e6 0.0 -1.0e6 1 + 0.0 0.0 -1.0e6 0 1 CS + 0.867845 0.0 1.86006 1 2 PF_01 + 4.49628 0.0 3.69583 1 3 PF_02 + 8.63810 0.0 -2.46839 1 4 PF_03 + 8.63847 0.0 2.46836 1 5 PF_03 + 4.49620 0.0 -3.69589 1 6 PF_02 + 0.867842 0.0 -1.86005 1 7 PF_01 + 1.19984 0.0 3.34106 1 8 PF_01 + 2.62980 0.0 5.24924 1 9 PF_02 + 9.65488 0.0 -3.29570 1 10 PF_03 + 9.65501 0.0 3.29541 1 11 PF_03 + 2.62966 0.0 -5.24925 1 12 PF_02 + 1.19984 0.0 -3.34102 1 13 PF_01 +end diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.w7x b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.w7x new file mode 100644 index 000000000..1b567b4ff --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/coils.w7x @@ -0,0 +1,6814 @@ +! coils_dot file for W7-X + +&MGRID_NLI +MGRID_EXT = 'w7x' +MGRID_MODE = 'R' +LSTELL_SYM = .TRUE. +RMIN = 4.30 +RMAX = 6.70 +ZMIN = -1.20 +ZMAX = 1.20 +IR = 121 +JZ = 121 +KP = 36 +/ + +! The coils_dot portion MUST contain the start string, which is +! two asterisks, a space,'coils_dot_starts_below', a space, two asterisks. +! '**'//' coils_dot_starts_below '//'**' + +** coils_dot_starts_below ** +periods 5 +begin filament +mirror NIL +6.842620711000E+00 4.311918695000E-01 1.744954334000E-02 1.080000000000E+02 +6.840909591000E+00 4.349679992000E-01 -7.150080869000E-02 1.080000000000E+02 +6.834295197000E+00 4.390314970000E-01 -1.602254120000E-01 1.080000000000E+02 +6.822716328000E+00 4.449170650000E-01 -2.484589536000E-01 1.080000000000E+02 +6.806284779000E+00 4.534665441000E-01 -3.354886308000E-01 1.080000000000E+02 +6.785059992000E+00 4.654143892000E-01 -4.212413326000E-01 1.080000000000E+02 +6.759287908000E+00 4.814857874000E-01 -5.049593618000E-01 1.080000000000E+02 +6.729220387000E+00 5.017869848000E-01 -5.863142345000E-01 1.080000000000E+02 +6.695111615000E+00 5.256470021000E-01 -6.651770142000E-01 1.080000000000E+02 +6.657315824000E+00 5.520665233000E-01 -7.412825815000E-01 1.080000000000E+02 +6.615988942000E+00 5.813000754000E-01 -8.145657329000E-01 1.080000000000E+02 +6.571327496000E+00 6.125928666000E-01 -8.850071242000E-01 1.080000000000E+02 +6.522970207000E+00 6.424151302000E-01 -9.537419589000E-01 1.080000000000E+02 +6.470399851000E+00 6.652451236000E-01 -1.021917209000E+00 1.080000000000E+02 +6.413584066000E+00 6.778977815000E-01 -1.089263674000E+00 1.080000000000E+02 +6.352994173000E+00 6.794865078000E-01 -1.154539058000E+00 1.080000000000E+02 +6.288922030000E+00 6.741525070000E-01 -1.216246575000E+00 1.080000000000E+02 +6.220769209000E+00 6.691398559000E-01 -1.273441742000E+00 1.080000000000E+02 +6.148453344000E+00 6.645657220000E-01 -1.325285698000E+00 1.080000000000E+02 +6.072180961000E+00 6.580973273000E-01 -1.370749447000E+00 1.080000000000E+02 +5.991985600000E+00 6.491772188000E-01 -1.408608053000E+00 1.080000000000E+02 +5.908461565000E+00 6.381001210000E-01 -1.437348696000E+00 1.080000000000E+02 +5.821851282000E+00 6.277100730000E-01 -1.455639493000E+00 1.080000000000E+02 +5.733218021000E+00 6.215795764000E-01 -1.462072215000E+00 1.080000000000E+02 +5.644362339000E+00 6.206306804000E-01 -1.455667884000E+00 1.080000000000E+02 +5.557639668000E+00 6.250943385000E-01 -1.435958561000E+00 1.080000000000E+02 +5.475414269000E+00 6.349449551000E-01 -1.403042952000E+00 1.080000000000E+02 +5.400209274000E+00 6.501693635000E-01 -1.357785149000E+00 1.080000000000E+02 +5.333982935000E+00 6.705703710000E-01 -1.301808004000E+00 1.080000000000E+02 +5.277997406000E+00 6.959637297000E-01 -1.237341473000E+00 1.080000000000E+02 +5.232549838000E+00 7.259273235000E-01 -1.166812923000E+00 1.080000000000E+02 +5.196741130000E+00 7.586709674000E-01 -1.092107862000E+00 1.080000000000E+02 +5.168231147000E+00 7.881034414000E-01 -1.013024536000E+00 1.080000000000E+02 +5.145820695000E+00 8.040844071000E-01 -9.282726209000E-01 1.080000000000E+02 +5.132988496000E+00 8.079610459000E-01 -8.402099046000E-01 1.080000000000E+02 +5.131597478000E+00 8.006726914000E-01 -7.514880132000E-01 1.080000000000E+02 +5.141515836000E+00 7.825090660000E-01 -6.647899090000E-01 1.080000000000E+02 +5.160378133000E+00 7.519053483000E-01 -5.833000314000E-01 1.080000000000E+02 +5.184151358000E+00 7.072647208000E-01 -5.099892243000E-01 1.080000000000E+02 +5.209151434000E+00 6.509540912000E-01 -4.456338674000E-01 1.080000000000E+02 +5.233477772000E+00 5.879016734000E-01 -3.875539046000E-01 1.080000000000E+02 +5.256070633000E+00 5.221797546000E-01 -3.318667032000E-01 1.080000000000E+02 +5.277443706000E+00 4.594148154000E-01 -2.723890661000E-01 1.080000000000E+02 +5.294107088000E+00 3.951074144000E-01 -2.130101728000E-01 1.080000000000E+02 +5.306467377000E+00 3.339215658000E-01 -1.494783330000E-01 1.080000000000E+02 +5.312024976000E+00 2.723898200000E-01 -8.530081591000E-02 1.080000000000E+02 +5.307538296000E+00 2.139447446000E-01 -1.819661694000E-02 1.080000000000E+02 +5.291955836000E+00 1.554567698000E-01 4.718627597000E-02 1.080000000000E+02 +5.269561859000E+00 9.642600794000E-02 1.100117670000E-01 1.080000000000E+02 +5.248664816000E+00 3.278089332000E-02 1.687606404000E-01 1.080000000000E+02 +5.228400321000E+00 -3.101171402000E-02 2.275175217000E-01 1.080000000000E+02 +5.206521210000E+00 -9.232726022000E-02 2.882948801000E-01 1.080000000000E+02 +5.179072143000E+00 -1.458225071000E-01 3.540587787000E-01 1.080000000000E+02 +5.144639742000E+00 -1.853654754000E-01 4.260584823000E-01 1.080000000000E+02 +5.106168446000E+00 -2.075629019000E-01 5.032871173000E-01 1.080000000000E+02 +5.068395602000E+00 -2.129816713000E-01 5.837632627000E-01 1.080000000000E+02 +5.034561622000E+00 -2.043352689000E-01 6.657541041000E-01 1.080000000000E+02 +5.005934544000E+00 -1.840211999000E-01 7.475896770000E-01 1.080000000000E+02 +4.982187208000E+00 -1.524354321000E-01 8.274301477000E-01 1.080000000000E+02 +4.963304905000E+00 -1.129728839000E-01 9.050198505000E-01 1.080000000000E+02 +4.951811943000E+00 -7.330794776000E-02 9.840199882000E-01 1.080000000000E+02 +4.952170289000E+00 -3.914399396000E-02 1.066259509000E+00 1.080000000000E+02 +4.967327324000E+00 -1.029952568000E-02 1.149164457000E+00 1.080000000000E+02 +4.998273942000E+00 1.501167633000E-02 1.228771473000E+00 1.080000000000E+02 +5.044541763000E+00 3.752851103000E-02 1.301455248000E+00 1.080000000000E+02 +5.104459683000E+00 5.677025204000E-02 1.364609021000E+00 1.080000000000E+02 +5.175638729000E+00 7.011633232000E-02 1.416487546000E+00 1.080000000000E+02 +5.255036196000E+00 7.495677513000E-02 1.456473280000E+00 1.080000000000E+02 +5.339305756000E+00 6.951507119000E-02 1.484801442000E+00 1.080000000000E+02 +5.425259365000E+00 5.433793821000E-02 1.502532507000E+00 1.080000000000E+02 +5.511546607000E+00 3.400716135000E-02 1.511502484000E+00 1.080000000000E+02 +5.598233972000E+00 1.329607745000E-02 1.512984118000E+00 1.080000000000E+02 +5.685500340000E+00 -3.286520992000E-03 1.507450791000E+00 1.080000000000E+02 +5.773248622000E+00 -1.197056691000E-02 1.494787468000E+00 1.080000000000E+02 +5.860074265000E+00 -1.369704000000E-02 1.474786583000E+00 1.080000000000E+02 +5.944807498000E+00 -1.008513961000E-02 1.447633049000E+00 1.080000000000E+02 +6.026645718000E+00 -3.786653005000E-04 1.413793625000E+00 1.080000000000E+02 +6.104689238000E+00 1.626336237000E-02 1.374018251000E+00 1.080000000000E+02 +6.177941864000E+00 4.013749478000E-02 1.329400646000E+00 1.080000000000E+02 +6.245924627000E+00 7.150624693000E-02 1.280975246000E+00 1.080000000000E+02 +6.307653700000E+00 1.107436291000E-01 1.230287750000E+00 1.080000000000E+02 +6.363610984000E+00 1.562078658000E-01 1.177853833000E+00 1.080000000000E+02 +6.415352259000E+00 2.036280468000E-01 1.123012040000E+00 1.080000000000E+02 +6.464143798000E+00 2.501532454000E-01 1.064920566000E+00 1.080000000000E+02 +6.511596694000E+00 2.918270557000E-01 1.002061223000E+00 1.080000000000E+02 +6.558708896000E+00 3.235099674000E-01 9.334175927000E-01 1.080000000000E+02 +6.604317690000E+00 3.457292941000E-01 8.601609198000E-01 1.080000000000E+02 +6.646953210000E+00 3.626203940000E-01 7.837241475000E-01 1.080000000000E+02 +6.685979972000E+00 3.761268087000E-01 7.047985910000E-01 1.080000000000E+02 +6.721149657000E+00 3.870871061000E-01 6.236520547000E-01 1.080000000000E+02 +6.752113339000E+00 3.963623976000E-01 5.407768227000E-01 1.080000000000E+02 +6.778788051000E+00 4.046814011000E-01 4.560661339000E-01 1.080000000000E+02 +6.800956077000E+00 4.115800394000E-01 3.701617308000E-01 1.080000000000E+02 +6.818617412000E+00 4.167769020000E-01 2.829651087000E-01 1.080000000000E+02 +6.831506098000E+00 4.215286640000E-01 1.949310037000E-01 1.080000000000E+02 +6.839498568000E+00 4.265082904000E-01 1.063739981000E-01 1.080000000000E+02 +6.842620711000E+00 4.311918695000E-01 1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +6.643640420000E+00 1.378705287000E+00 2.786784824000E-03 1.080000000000E+02 +6.644016420000E+00 1.389411241000E+00 -8.489061568000E-02 1.080000000000E+02 +6.640144048000E+00 1.399752818000E+00 -1.724869752000E-01 1.080000000000E+02 +6.632496981000E+00 1.407980654000E+00 -2.600860194000E-01 1.080000000000E+02 +6.621613619000E+00 1.411845377000E+00 -3.477269332000E-01 1.080000000000E+02 +6.607227412000E+00 1.411642961000E+00 -4.348356053000E-01 1.080000000000E+02 +6.588951768000E+00 1.407824870000E+00 -5.212198625000E-01 1.080000000000E+02 +6.567183273000E+00 1.398428291000E+00 -6.062523787000E-01 1.080000000000E+02 +6.542415036000E+00 1.380954658000E+00 -6.892798267000E-01 1.080000000000E+02 +6.514173959000E+00 1.356876780000E+00 -7.694019289000E-01 1.080000000000E+02 +6.482859580000E+00 1.325213175000E+00 -8.457732406000E-01 1.080000000000E+02 +6.447784629000E+00 1.289031117000E+00 -9.182365063000E-01 1.080000000000E+02 +6.406901413000E+00 1.253918505000E+00 -9.881923803000E-01 1.080000000000E+02 +6.360095781000E+00 1.220875505000E+00 -1.055471471000E+00 1.080000000000E+02 +6.306113223000E+00 1.194416155000E+00 -1.120196685000E+00 1.080000000000E+02 +6.244570096000E+00 1.177801832000E+00 -1.181327921000E+00 1.080000000000E+02 +6.176470232000E+00 1.169619746000E+00 -1.237059622000E+00 1.080000000000E+02 +6.102409122000E+00 1.170933166000E+00 -1.285194785000E+00 1.080000000000E+02 +6.023401775000E+00 1.182006660000E+00 -1.323067807000E+00 1.080000000000E+02 +5.940792728000E+00 1.200489722000E+00 -1.348281183000E+00 1.080000000000E+02 +5.856613196000E+00 1.225208902000E+00 -1.358569067000E+00 1.080000000000E+02 +5.773685228000E+00 1.255194047000E+00 -1.353085167000E+00 1.080000000000E+02 +5.695492839000E+00 1.291066010000E+00 -1.333014261000E+00 1.080000000000E+02 +5.622935132000E+00 1.330457442000E+00 -1.301720477000E+00 1.080000000000E+02 +5.555311890000E+00 1.371278140000E+00 -1.262085734000E+00 1.080000000000E+02 +5.490398309000E+00 1.409106442000E+00 -1.215714425000E+00 1.080000000000E+02 +5.426195537000E+00 1.438437855000E+00 -1.162638692000E+00 1.080000000000E+02 +5.364050458000E+00 1.457733963000E+00 -1.102951579000E+00 1.080000000000E+02 +5.305322317000E+00 1.463058549000E+00 -1.037139043000E+00 1.080000000000E+02 +5.252708418000E+00 1.453593714000E+00 -9.667867241000E-01 1.080000000000E+02 +5.209086119000E+00 1.430111607000E+00 -8.936981911000E-01 1.080000000000E+02 +5.178037117000E+00 1.394822618000E+00 -8.188905247000E-01 1.080000000000E+02 +5.163632079000E+00 1.353497795000E+00 -7.421450537000E-01 1.080000000000E+02 +5.166861312000E+00 1.307608914000E+00 -6.667474988000E-01 1.080000000000E+02 +5.181219276000E+00 1.252787274000E+00 -5.989634359000E-01 1.080000000000E+02 +5.198397524000E+00 1.189239997000E+00 -5.400717519000E-01 1.080000000000E+02 +5.215666387000E+00 1.126470241000E+00 -4.803836822000E-01 1.080000000000E+02 +5.228851049000E+00 1.060796204000E+00 -4.228264178000E-01 1.080000000000E+02 +5.235510752000E+00 9.926600101000E-01 -3.670458051000E-01 1.080000000000E+02 +5.235145346000E+00 9.241223686000E-01 -3.112409570000E-01 1.080000000000E+02 +5.229597750000E+00 8.574141894000E-01 -2.536123470000E-01 1.080000000000E+02 +5.222274311000E+00 7.920473800000E-01 -1.946452353000E-01 1.080000000000E+02 +5.215661680000E+00 7.259894751000E-01 -1.364003779000E-01 1.080000000000E+02 +5.209029632000E+00 6.585854927000E-01 -7.966775233000E-02 1.080000000000E+02 +5.200442861000E+00 5.898163457000E-01 -2.494784873000E-02 1.080000000000E+02 +5.186096077000E+00 5.214810094000E-01 2.916971350000E-02 1.080000000000E+02 +5.161762090000E+00 4.574496863000E-01 8.494149535000E-02 1.080000000000E+02 +5.125994571000E+00 4.027764377000E-01 1.443669380000E-01 1.080000000000E+02 +5.082895375000E+00 3.596315296000E-01 2.083126740000E-01 1.080000000000E+02 +5.036290979000E+00 3.296934215000E-01 2.770763044000E-01 1.080000000000E+02 +4.989521827000E+00 3.113333016000E-01 3.497702850000E-01 1.080000000000E+02 +4.941449330000E+00 3.090818341000E-01 4.238156204000E-01 1.080000000000E+02 +4.892518039000E+00 3.231836166000E-01 4.959805589000E-01 1.080000000000E+02 +4.844168104000E+00 3.497770517000E-01 5.649597706000E-01 1.080000000000E+02 +4.797842912000E+00 3.839689737000E-01 6.319745517000E-01 1.080000000000E+02 +4.756423942000E+00 4.188770729000E-01 7.017224202000E-01 1.080000000000E+02 +4.723791509000E+00 4.498239852000E-01 7.777589224000E-01 1.080000000000E+02 +4.702794140000E+00 4.765845308000E-01 8.592609358000E-01 1.080000000000E+02 +4.695087054000E+00 5.004339933000E-01 9.439925506000E-01 1.080000000000E+02 +4.701454020000E+00 5.226934795000E-01 1.029225643000E+00 1.080000000000E+02 +4.722017137000E+00 5.441512842000E-01 1.112414355000E+00 1.080000000000E+02 +4.756509262000E+00 5.642428580000E-01 1.191204722000E+00 1.080000000000E+02 +4.803577331000E+00 5.826237931000E-01 1.263647540000E+00 1.080000000000E+02 +4.861012131000E+00 6.000061110000E-01 1.328492129000E+00 1.080000000000E+02 +4.926860412000E+00 6.164324717000E-01 1.385061074000E+00 1.080000000000E+02 +4.999989178000E+00 6.290923381000E-01 1.432913650000E+00 1.080000000000E+02 +5.078847654000E+00 6.366156177000E-01 1.472011314000E+00 1.080000000000E+02 +5.161278411000E+00 6.438518974000E-01 1.502926011000E+00 1.080000000000E+02 +5.245650355000E+00 6.557160034000E-01 1.525941209000E+00 1.080000000000E+02 +5.330973182000E+00 6.733225445000E-01 1.540955846000E+00 1.080000000000E+02 +5.415794088000E+00 6.966924104000E-01 1.547836060000E+00 1.080000000000E+02 +5.499339895000E+00 7.254315084000E-01 1.546702180000E+00 1.080000000000E+02 +5.580536153000E+00 7.591999542000E-01 1.537810757000E+00 1.080000000000E+02 +5.657925352000E+00 7.984969458000E-01 1.521653119000E+00 1.080000000000E+02 +5.730890243000E+00 8.427569411000E-01 1.498846663000E+00 1.080000000000E+02 +5.800518222000E+00 8.888473544000E-01 1.469852265000E+00 1.080000000000E+02 +5.867703093000E+00 9.342666050000E-01 1.435050927000E+00 1.080000000000E+02 +5.933213917000E+00 9.775991079000E-01 1.394624322000E+00 1.080000000000E+02 +5.997334312000E+00 1.017526000000E+00 1.348880339000E+00 1.080000000000E+02 +6.059905992000E+00 1.053856708000E+00 1.298134958000E+00 1.080000000000E+02 +6.120618864000E+00 1.086377930000E+00 1.242822431000E+00 1.080000000000E+02 +6.179647097000E+00 1.114085459000E+00 1.183240350000E+00 1.080000000000E+02 +6.236953625000E+00 1.136397571000E+00 1.119713595000E+00 1.080000000000E+02 +6.291368669000E+00 1.155381524000E+00 1.052910239000E+00 1.080000000000E+02 +6.342057854000E+00 1.174084581000E+00 9.829305340000E-01 1.080000000000E+02 +6.388725797000E+00 1.192690916000E+00 9.103747398000E-01 1.080000000000E+02 +6.431696132000E+00 1.210752598000E+00 8.352590367000E-01 1.080000000000E+02 +6.470544013000E+00 1.229014048000E+00 7.581530132000E-01 1.080000000000E+02 +6.505168239000E+00 1.248214832000E+00 6.790841041000E-01 1.080000000000E+02 +6.535851242000E+00 1.267135971000E+00 5.984352213000E-01 1.080000000000E+02 +6.563092600000E+00 1.284316278000E+00 5.162774167000E-01 1.080000000000E+02 +6.586858176000E+00 1.299970819000E+00 4.326343739000E-01 1.080000000000E+02 +6.606676061000E+00 1.315271575000E+00 3.478877549000E-01 1.080000000000E+02 +6.622049048000E+00 1.331487172000E+00 2.624374443000E-01 1.080000000000E+02 +6.632778832000E+00 1.349174400000E+00 1.765219348000E-01 1.080000000000E+02 +6.639687437000E+00 1.365792034000E+00 9.012406132000E-02 1.080000000000E+02 +6.643640420000E+00 1.378705287000E+00 2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +6.363713956000E+00 2.128162379000E+00 3.632685538000E-02 1.080000000000E+02 +6.379908367000E+00 2.108115304000E+00 -4.805479793000E-02 1.080000000000E+02 +6.391461939000E+00 2.087284016000E+00 -1.330022602000E-01 1.080000000000E+02 +6.400148737000E+00 2.061942659000E+00 -2.170477619000E-01 1.080000000000E+02 +6.406163537000E+00 2.032381175000E+00 -2.999547317000E-01 1.080000000000E+02 +6.410185957000E+00 1.997719144000E+00 -3.810313384000E-01 1.080000000000E+02 +6.411135076000E+00 1.960951758000E+00 -4.611599500000E-01 1.080000000000E+02 +6.406881996000E+00 1.926418885000E+00 -5.422183342000E-01 1.080000000000E+02 +6.396278130000E+00 1.895742350000E+00 -6.243033587000E-01 1.080000000000E+02 +6.378101927000E+00 1.870579724000E+00 -7.068846032000E-01 1.080000000000E+02 +6.352318669000E+00 1.849848174000E+00 -7.885880029000E-01 1.080000000000E+02 +6.318191072000E+00 1.833796156000E+00 -8.684143517000E-01 1.080000000000E+02 +6.274186891000E+00 1.825898276000E+00 -9.444199619000E-01 1.080000000000E+02 +6.220013095000E+00 1.827356520000E+00 -1.014026757000E+00 1.080000000000E+02 +6.156347548000E+00 1.837683092000E+00 -1.074292285000E+00 1.080000000000E+02 +6.084612448000E+00 1.855311626000E+00 -1.122466283000E+00 1.080000000000E+02 +6.006732509000E+00 1.878693996000E+00 -1.156570420000E+00 1.080000000000E+02 +5.925434455000E+00 1.907278119000E+00 -1.175727956000E+00 1.080000000000E+02 +5.844826615000E+00 1.942801593000E+00 -1.180212576000E+00 1.080000000000E+02 +5.769575723000E+00 1.988093083000E+00 -1.172009822000E+00 1.080000000000E+02 +5.699286952000E+00 2.038773149000E+00 -1.155518699000E+00 1.080000000000E+02 +5.625560061000E+00 2.082208037000E+00 -1.133893710000E+00 1.080000000000E+02 +5.546200253000E+00 2.109205640000E+00 -1.106430447000E+00 1.080000000000E+02 +5.466579776000E+00 2.120864684000E+00 -1.070335916000E+00 1.080000000000E+02 +5.392350965000E+00 2.120964126000E+00 -1.022604995000E+00 1.080000000000E+02 +5.328858411000E+00 2.115191313000E+00 -9.616664656000E-01 1.080000000000E+02 +5.277822646000E+00 2.099771698000E+00 -8.913395217000E-01 1.080000000000E+02 +5.234769347000E+00 2.068559850000E+00 -8.209661657000E-01 1.080000000000E+02 +5.193817285000E+00 2.021276421000E+00 -7.587395914000E-01 1.080000000000E+02 +5.156280985000E+00 1.959214751000E+00 -7.085053980000E-01 1.080000000000E+02 +5.128201134000E+00 1.885891955000E+00 -6.683070249000E-01 1.080000000000E+02 +5.111994364000E+00 1.807625867000E+00 -6.309463669000E-01 1.080000000000E+02 +5.107197588000E+00 1.729247244000E+00 -5.907387262000E-01 1.080000000000E+02 +5.111866677000E+00 1.652286265000E+00 -5.478583852000E-01 1.080000000000E+02 +5.117693771000E+00 1.578985241000E+00 -4.991121880000E-01 1.080000000000E+02 +5.118215109000E+00 1.508485081000E+00 -4.461358974000E-01 1.080000000000E+02 +5.109509479000E+00 1.439159402000E+00 -3.922509070000E-01 1.080000000000E+02 +5.091875208000E+00 1.370034814000E+00 -3.403860995000E-01 1.080000000000E+02 +5.070017868000E+00 1.299790175000E+00 -2.916382842000E-01 1.080000000000E+02 +5.051978178000E+00 1.226376910000E+00 -2.462074493000E-01 1.080000000000E+02 +5.042687073000E+00 1.149884311000E+00 -2.031942363000E-01 1.080000000000E+02 +5.030067880000E+00 1.077060272000E+00 -1.550619236000E-01 1.080000000000E+02 +5.009230268000E+00 1.011653966000E+00 -9.962429365000E-02 1.080000000000E+02 +4.976958534000E+00 9.568618200000E-01 -3.845435998000E-02 1.080000000000E+02 +4.934281234000E+00 9.121849315000E-01 2.448555749000E-02 1.080000000000E+02 +4.881076270000E+00 8.788352917000E-01 8.649636904000E-02 1.080000000000E+02 +4.819500779000E+00 8.578730073000E-01 1.460500498000E-01 1.080000000000E+02 +4.753368880000E+00 8.481351468000E-01 2.036424630000E-01 1.080000000000E+02 +4.686309048000E+00 8.470509883000E-01 2.609630366000E-01 1.080000000000E+02 +4.619994740000E+00 8.546842285000E-01 3.185973837000E-01 1.080000000000E+02 +4.555414498000E+00 8.713058334000E-01 3.764466502000E-01 1.080000000000E+02 +4.493831652000E+00 8.956987359000E-01 4.346658470000E-01 1.080000000000E+02 +4.438788473000E+00 9.208578308000E-01 4.988404496000E-01 1.080000000000E+02 +4.392819861000E+00 9.459804438000E-01 5.697936167000E-01 1.080000000000E+02 +4.356655749000E+00 9.730232829000E-01 6.456312705000E-01 1.080000000000E+02 +4.331672738000E+00 1.001676472000E+00 7.252260042000E-01 1.080000000000E+02 +4.318791406000E+00 1.031398741000E+00 8.072828216000E-01 1.080000000000E+02 +4.317526898000E+00 1.062634345000E+00 8.897856590000E-01 1.080000000000E+02 +4.327075141000E+00 1.095599749000E+00 9.710448039000E-01 1.080000000000E+02 +4.347724461000E+00 1.128893857000E+00 1.050138721000E+00 1.080000000000E+02 +4.378198580000E+00 1.162743062000E+00 1.125601149000E+00 1.080000000000E+02 +4.418915275000E+00 1.195280687000E+00 1.196814028000E+00 1.080000000000E+02 +4.469162561000E+00 1.225582841000E+00 1.262691804000E+00 1.080000000000E+02 +4.524945380000E+00 1.258628196000E+00 1.322504398000E+00 1.080000000000E+02 +4.583207789000E+00 1.298320310000E+00 1.375655668000E+00 1.080000000000E+02 +4.644594986000E+00 1.341851109000E+00 1.421583532000E+00 1.080000000000E+02 +4.710539180000E+00 1.386079918000E+00 1.460188986000E+00 1.080000000000E+02 +4.781411366000E+00 1.428439767000E+00 1.491069996000E+00 1.080000000000E+02 +4.857619318000E+00 1.466512852000E+00 1.513978101000E+00 1.080000000000E+02 +4.937427500000E+00 1.501038811000E+00 1.528680731000E+00 1.080000000000E+02 +5.019163925000E+00 1.533815259000E+00 1.535219663000E+00 1.080000000000E+02 +5.101512302000E+00 1.565220695000E+00 1.533750385000E+00 1.080000000000E+02 +5.183803016000E+00 1.595673190000E+00 1.524583142000E+00 1.080000000000E+02 +5.265097539000E+00 1.625986377000E+00 1.508093490000E+00 1.080000000000E+02 +5.344244928000E+00 1.656904457000E+00 1.484797470000E+00 1.080000000000E+02 +5.420904491000E+00 1.688963477000E+00 1.455093589000E+00 1.080000000000E+02 +5.494418963000E+00 1.722478683000E+00 1.419493916000E+00 1.080000000000E+02 +5.564272894000E+00 1.757441247000E+00 1.378577601000E+00 1.080000000000E+02 +5.630209732000E+00 1.794075357000E+00 1.332770951000E+00 1.080000000000E+02 +5.692045304000E+00 1.832075625000E+00 1.282612075000E+00 1.080000000000E+02 +5.749773723000E+00 1.871091206000E+00 1.228575236000E+00 1.080000000000E+02 +5.803826303000E+00 1.910401290000E+00 1.170998922000E+00 1.080000000000E+02 +5.854696722000E+00 1.949187536000E+00 1.110182121000E+00 1.080000000000E+02 +5.902988110000E+00 1.986464933000E+00 1.046417130000E+00 1.080000000000E+02 +5.949370672000E+00 2.021151235000E+00 9.799657947000E-01 1.080000000000E+02 +5.994581696000E+00 2.052319981000E+00 9.108702606000E-01 1.080000000000E+02 +6.038956580000E+00 2.079134440000E+00 8.394336353000E-01 1.080000000000E+02 +6.081673305000E+00 2.102564325000E+00 7.659096737000E-01 1.080000000000E+02 +6.121844537000E+00 2.123861639000E+00 6.903510399000E-01 1.080000000000E+02 +6.159785669000E+00 2.142229518000E+00 6.127886991000E-01 1.080000000000E+02 +6.195762662000E+00 2.156487158000E+00 5.335701480000E-01 1.080000000000E+02 +6.229880263000E+00 2.165904773000E+00 4.527156872000E-01 1.080000000000E+02 +6.261990770000E+00 2.169750666000E+00 3.706549346000E-01 1.080000000000E+02 +6.292250116000E+00 2.166693987000E+00 2.879184587000E-01 1.080000000000E+02 +6.319647402000E+00 2.158199745000E+00 2.044325232000E-01 1.080000000000E+02 +6.343796036000E+00 2.144571860000E+00 1.206362437000E-01 1.080000000000E+02 +6.363713956000E+00 2.128162379000E+00 3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +6.109347735000E+00 2.634276656000E+00 3.187537464000E-02 1.080000000000E+02 +6.141532971000E+00 2.606247998000E+00 -4.635841915000E-02 1.080000000000E+02 +6.166951411000E+00 2.579529745000E+00 -1.274648788000E-01 1.080000000000E+02 +6.183737770000E+00 2.557383198000E+00 -2.120822207000E-01 1.080000000000E+02 +6.190225661000E+00 2.543048476000E+00 -2.997983967000E-01 1.080000000000E+02 +6.186093205000E+00 2.537535597000E+00 -3.886351210000E-01 1.080000000000E+02 +6.171309817000E+00 2.541715417000E+00 -4.764366174000E-01 1.080000000000E+02 +6.145914913000E+00 2.556585893000E+00 -5.605003417000E-01 1.080000000000E+02 +6.110163870000E+00 2.582793989000E+00 -6.378051764000E-01 1.080000000000E+02 +6.065265883000E+00 2.617981623000E+00 -7.062104980000E-01 1.080000000000E+02 +6.012009433000E+00 2.659236425000E+00 -7.645271884000E-01 1.080000000000E+02 +5.950880551000E+00 2.704681051000E+00 -8.108473046000E-01 1.080000000000E+02 +5.883071369000E+00 2.752577611000E+00 -8.432354714000E-01 1.080000000000E+02 +5.810749029000E+00 2.801522435000E+00 -8.607369806000E-01 1.080000000000E+02 +5.736399004000E+00 2.850569056000E+00 -8.640060786000E-01 1.080000000000E+02 +5.660643839000E+00 2.896797453000E+00 -8.562220560000E-01 1.080000000000E+02 +5.579655881000E+00 2.931512000000E+00 -8.427262700000E-01 1.080000000000E+02 +5.494426024000E+00 2.949761461000E+00 -8.243174216000E-01 1.080000000000E+02 +5.408445348000E+00 2.952817993000E+00 -8.012208021000E-01 1.080000000000E+02 +5.323379660000E+00 2.941204700000E+00 -7.773689488000E-01 1.080000000000E+02 +5.240414620000E+00 2.915167245000E+00 -7.578816060000E-01 1.080000000000E+02 +5.162150445000E+00 2.874434075000E+00 -7.452820520000E-01 1.080000000000E+02 +5.092739004000E+00 2.819289688000E+00 -7.366388673000E-01 1.080000000000E+02 +5.034184446000E+00 2.752837985000E+00 -7.270540685000E-01 1.080000000000E+02 +4.988264379000E+00 2.677536196000E+00 -7.142960837000E-01 1.080000000000E+02 +4.955135323000E+00 2.596405252000E+00 -6.982493624000E-01 1.080000000000E+02 +4.935221819000E+00 2.511497554000E+00 -6.800217467000E-01 1.080000000000E+02 +4.924747995000E+00 2.425053057000E+00 -6.610368381000E-01 1.080000000000E+02 +4.919293369000E+00 2.338142535000E+00 -6.421364412000E-01 1.080000000000E+02 +4.914619572000E+00 2.251234072000E+00 -6.230907784000E-01 1.080000000000E+02 +4.908522983000E+00 2.164728233000E+00 -6.026804297000E-01 1.080000000000E+02 +4.898215387000E+00 2.079645480000E+00 -5.783904634000E-01 1.080000000000E+02 +4.886271109000E+00 1.996748992000E+00 -5.479092097000E-01 1.080000000000E+02 +4.873219137000E+00 1.917199566000E+00 -5.099632237000E-01 1.080000000000E+02 +4.868565935000E+00 1.838768869000E+00 -4.679474510000E-01 1.080000000000E+02 +4.861758538000E+00 1.762358796000E+00 -4.226801226000E-01 1.080000000000E+02 +4.846640633000E+00 1.688211627000E+00 -3.756353333000E-01 1.080000000000E+02 +4.818480463000E+00 1.618138364000E+00 -3.283193574000E-01 1.080000000000E+02 +4.775915256000E+00 1.554974294000E+00 -2.820781068000E-01 1.080000000000E+02 +4.719320422000E+00 1.502381725000E+00 -2.376983871000E-01 1.080000000000E+02 +4.651796034000E+00 1.462429678000E+00 -1.954128437000E-01 1.080000000000E+02 +4.576004387000E+00 1.437212036000E+00 -1.560456650000E-01 1.080000000000E+02 +4.494047601000E+00 1.428987731000E+00 -1.219181286000E-01 1.080000000000E+02 +4.409901903000E+00 1.434824975000E+00 -9.346268448000E-02 1.080000000000E+02 +4.325949794000E+00 1.447838848000E+00 -6.642283384000E-02 1.080000000000E+02 +4.243762054000E+00 1.462981172000E+00 -3.558837129000E-02 1.080000000000E+02 +4.165111582000E+00 1.477516103000E+00 3.754172340000E-03 1.080000000000E+02 +4.092685681000E+00 1.490852134000E+00 5.388091285000E-02 1.080000000000E+02 +4.027980988000E+00 1.504545482000E+00 1.135748529000E-01 1.080000000000E+02 +3.971478829000E+00 1.519890516000E+00 1.807565333000E-01 1.080000000000E+02 +3.924020346000E+00 1.536713359000E+00 2.542191153000E-01 1.080000000000E+02 +3.886239263000E+00 1.554624039000E+00 3.329023539000E-01 1.080000000000E+02 +3.858435969000E+00 1.573392337000E+00 4.155171011000E-01 1.080000000000E+02 +3.840607521000E+00 1.592924400000E+00 5.006187195000E-01 1.080000000000E+02 +3.832731559000E+00 1.613021490000E+00 5.870384289000E-01 1.080000000000E+02 +3.834757773000E+00 1.633422791000E+00 6.737108263000E-01 1.080000000000E+02 +3.846341645000E+00 1.654141250000E+00 7.596450919000E-01 1.080000000000E+02 +3.866276921000E+00 1.676087882000E+00 8.436327263000E-01 1.080000000000E+02 +3.892929860000E+00 1.701083398000E+00 9.249046690000E-01 1.080000000000E+02 +3.925626136000E+00 1.729842869000E+00 1.002637062000E+00 1.080000000000E+02 +3.964630243000E+00 1.761745959000E+00 1.076114245000E+00 1.080000000000E+02 +4.009618846000E+00 1.796721175000E+00 1.144593485000E+00 1.080000000000E+02 +4.060097085000E+00 1.834801320000E+00 1.207380380000E+00 1.080000000000E+02 +4.116261198000E+00 1.874590669000E+00 1.263842748000E+00 1.080000000000E+02 +4.178887014000E+00 1.913836763000E+00 1.313751841000E+00 1.080000000000E+02 +4.246909202000E+00 1.952224944000E+00 1.356669215000E+00 1.080000000000E+02 +4.318262713000E+00 1.991799227000E+00 1.392276244000E+00 1.080000000000E+02 +4.391089915000E+00 2.035102457000E+00 1.420151472000E+00 1.080000000000E+02 +4.463257207000E+00 2.083489462000E+00 1.439465232000E+00 1.080000000000E+02 +4.534215302000E+00 2.136494070000E+00 1.449884186000E+00 1.080000000000E+02 +4.603662931000E+00 2.192308664000E+00 1.451432017000E+00 1.080000000000E+02 +4.670186715000E+00 2.250975168000E+00 1.443978096000E+00 1.080000000000E+02 +4.732392401000E+00 2.312626123000E+00 1.427519630000E+00 1.080000000000E+02 +4.790208201000E+00 2.375804756000E+00 1.402784195000E+00 1.080000000000E+02 +4.845155468000E+00 2.438283615000E+00 1.371062779000E+00 1.080000000000E+02 +4.899267477000E+00 2.498318189000E+00 1.333595471000E+00 1.080000000000E+02 +4.955428355000E+00 2.553535245000E+00 1.291888617000E+00 1.080000000000E+02 +5.015458074000E+00 2.602041405000E+00 1.247327499000E+00 1.080000000000E+02 +5.080156882000E+00 2.642255297000E+00 1.201173169000E+00 1.080000000000E+02 +5.149256462000E+00 2.673345489000E+00 1.154170635000E+00 1.080000000000E+02 +5.221006861000E+00 2.695704748000E+00 1.106391465000E+00 1.080000000000E+02 +5.293521613000E+00 2.711108036000E+00 1.056863518000E+00 1.080000000000E+02 +5.364843644000E+00 2.721815755000E+00 1.004521395000E+00 1.080000000000E+02 +5.432965275000E+00 2.731270735000E+00 9.479798854000E-01 1.080000000000E+02 +5.498007131000E+00 2.739518282000E+00 8.876176364000E-01 1.080000000000E+02 +5.559542609000E+00 2.747455734000E+00 8.236903164000E-01 1.080000000000E+02 +5.618852694000E+00 2.752998034000E+00 7.574711850000E-01 1.080000000000E+02 +5.676641133000E+00 2.755175178000E+00 6.895838911000E-01 1.080000000000E+02 +5.733046204000E+00 2.753501719000E+00 6.207042323000E-01 1.080000000000E+02 +5.787973759000E+00 2.748619035000E+00 5.506192747000E-01 1.080000000000E+02 +5.840997196000E+00 2.741127309000E+00 4.794354850000E-01 1.080000000000E+02 +5.892012366000E+00 2.731082147000E+00 4.071715453000E-01 1.080000000000E+02 +5.940889229000E+00 2.718446479000E+00 3.337124203000E-01 1.080000000000E+02 +5.987407128000E+00 2.702783994000E+00 2.593013285000E-01 1.080000000000E+02 +6.031267734000E+00 2.683719576000E+00 1.840910744000E-01 1.080000000000E+02 +6.072154482000E+00 2.660697759000E+00 1.084250821000E-01 1.080000000000E+02 +6.109347735000E+00 2.634276656000E+00 3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +5.752242722000E+00 3.290992454000E+00 -3.206635964000E-02 1.080000000000E+02 +5.735864133000E+00 3.350576153000E+00 -9.558959151000E-02 1.080000000000E+02 +5.707868427000E+00 3.414368505000E+00 -1.502609002000E-01 1.080000000000E+02 +5.668713979000E+00 3.478301489000E+00 -1.975103298000E-01 1.080000000000E+02 +5.618131884000E+00 3.538101431000E+00 -2.389271858000E-01 1.080000000000E+02 +5.557282500000E+00 3.591558238000E+00 -2.748207179000E-01 1.080000000000E+02 +5.490234730000E+00 3.638992008000E+00 -3.080563152000E-01 1.080000000000E+02 +5.418240726000E+00 3.676363552000E+00 -3.436690988000E-01 1.080000000000E+02 +5.340036569000E+00 3.702141809000E+00 -3.763048784000E-01 1.080000000000E+02 +5.258548457000E+00 3.721496611000E+00 -4.052293645000E-01 1.080000000000E+02 +5.177130955000E+00 3.729591464000E+00 -4.392283960000E-01 1.080000000000E+02 +5.098843243000E+00 3.722275086000E+00 -4.800337212000E-01 1.080000000000E+02 +5.025692411000E+00 3.700042630000E+00 -5.247345144000E-01 1.080000000000E+02 +4.959216583000E+00 3.663320405000E+00 -5.704365727000E-01 1.080000000000E+02 +4.900696448000E+00 3.613432642000E+00 -6.144560156000E-01 1.080000000000E+02 +4.851599223000E+00 3.551697690000E+00 -6.547457037000E-01 1.080000000000E+02 +4.813323282000E+00 3.479924343000E+00 -6.898657429000E-01 1.080000000000E+02 +4.786312292000E+00 3.400851683000E+00 -7.191623664000E-01 1.080000000000E+02 +4.769934586000E+00 3.316939880000E+00 -7.426294678000E-01 1.080000000000E+02 +4.757654910000E+00 3.231463772000E+00 -7.624802322000E-01 1.080000000000E+02 +4.748111962000E+00 3.144785526000E+00 -7.779139702000E-01 1.080000000000E+02 +4.739493712000E+00 3.057130803000E+00 -7.877001548000E-01 1.080000000000E+02 +4.728060180000E+00 2.969357220000E+00 -7.913832776000E-01 1.080000000000E+02 +4.709815427000E+00 2.882679269000E+00 -7.895526386000E-01 1.080000000000E+02 +4.689127860000E+00 2.796976619000E+00 -7.811847600000E-01 1.080000000000E+02 +4.671007851000E+00 2.711567590000E+00 -7.661370968000E-01 1.080000000000E+02 +4.653109087000E+00 2.626876723000E+00 -7.471733717000E-01 1.080000000000E+02 +4.631907832000E+00 2.543306203000E+00 -7.269319722000E-01 1.080000000000E+02 +4.605001580000E+00 2.461238499000E+00 -7.069563165000E-01 1.080000000000E+02 +4.569276132000E+00 2.382305588000E+00 -6.885508517000E-01 1.080000000000E+02 +4.522240133000E+00 2.308994413000E+00 -6.723087025000E-01 1.080000000000E+02 +4.464825633000E+00 2.243230570000E+00 -6.572772207000E-01 1.080000000000E+02 +4.398139151000E+00 2.186792695000E+00 -6.427120602000E-01 1.080000000000E+02 +4.323124804000E+00 2.141573433000E+00 -6.291917806000E-01 1.080000000000E+02 +4.240843211000E+00 2.110179324000E+00 -6.193379278000E-01 1.080000000000E+02 +4.153991677000E+00 2.093275279000E+00 -6.153164653000E-01 1.080000000000E+02 +4.066244867000E+00 2.082035189000E+00 -6.108406342000E-01 1.080000000000E+02 +3.979723140000E+00 2.068444079000E+00 -5.976498684000E-01 1.080000000000E+02 +3.896233821000E+00 2.051929419000E+00 -5.730609127000E-01 1.080000000000E+02 +3.816403280000E+00 2.035256916000E+00 -5.383970067000E-01 1.080000000000E+02 +3.740780803000E+00 2.020115622000E+00 -4.947621310000E-01 1.080000000000E+02 +3.670725045000E+00 2.006659994000E+00 -4.421942386000E-01 1.080000000000E+02 +3.607585836000E+00 1.994932843000E+00 -3.812203306000E-01 1.080000000000E+02 +3.552956608000E+00 1.984359135000E+00 -3.122472237000E-01 1.080000000000E+02 +3.504194781000E+00 1.977627202000E+00 -2.386307155000E-01 1.080000000000E+02 +3.457713364000E+00 1.977834914000E+00 -1.632283249000E-01 1.080000000000E+02 +3.417248218000E+00 1.982025179000E+00 -8.452815995000E-02 1.080000000000E+02 +3.382743442000E+00 1.990235068000E+00 -3.268188411000E-03 1.080000000000E+02 +3.353060450000E+00 2.003466655000E+00 7.911508161000E-02 1.080000000000E+02 +3.329372839000E+00 2.020669322000E+00 1.627636593000E-01 1.080000000000E+02 +3.310788863000E+00 2.042671412000E+00 2.465256910000E-01 1.080000000000E+02 +3.299688964000E+00 2.067272394000E+00 3.309221835000E-01 1.080000000000E+02 +3.295981348000E+00 2.094425193000E+00 4.151413601000E-01 1.080000000000E+02 +3.299415055000E+00 2.124300450000E+00 4.985211599000E-01 1.080000000000E+02 +3.310497008000E+00 2.156117338000E+00 5.804104256000E-01 1.080000000000E+02 +3.330032454000E+00 2.188620760000E+00 6.604511422000E-01 1.080000000000E+02 +3.359318265000E+00 2.219311564000E+00 7.382277411000E-01 1.080000000000E+02 +3.398172326000E+00 2.246943187000E+00 8.130003965000E-01 1.080000000000E+02 +3.443306267000E+00 2.275108505000E+00 8.837344519000E-01 1.080000000000E+02 +3.491239014000E+00 2.309805399000E+00 9.496690099000E-01 1.080000000000E+02 +3.540528946000E+00 2.353240875000E+00 1.009152163000E+00 1.080000000000E+02 +3.591610313000E+00 2.403952127000E+00 1.060859533000E+00 1.080000000000E+02 +3.644796448000E+00 2.460297621000E+00 1.103835896000E+00 1.080000000000E+02 +3.700066461000E+00 2.520753060000E+00 1.137456428000E+00 1.080000000000E+02 +3.757210290000E+00 2.584090271000E+00 1.161466271000E+00 1.080000000000E+02 +3.815060806000E+00 2.649664350000E+00 1.175425951000E+00 1.080000000000E+02 +3.872504432000E+00 2.716991618000E+00 1.179281333000E+00 1.080000000000E+02 +3.928091309000E+00 2.785783456000E+00 1.173138038000E+00 1.080000000000E+02 +3.980896149000E+00 2.855232261000E+00 1.157882812000E+00 1.080000000000E+02 +4.032434128000E+00 2.923855223000E+00 1.135668523000E+00 1.080000000000E+02 +4.084677031000E+00 2.990100980000E+00 1.108680995000E+00 1.080000000000E+02 +4.141076217000E+00 3.051735607000E+00 1.079331268000E+00 1.080000000000E+02 +4.204886516000E+00 3.105614014000E+00 1.049719473000E+00 1.080000000000E+02 +4.274491251000E+00 3.151297832000E+00 1.019495947000E+00 1.080000000000E+02 +4.348891880000E+00 3.188216883000E+00 9.885700701000E-01 1.080000000000E+02 +4.426706505000E+00 3.216360871000E+00 9.570750472000E-01 1.080000000000E+02 +4.507496755000E+00 3.235330554000E+00 9.259972860000E-01 1.080000000000E+02 +4.590818964000E+00 3.244268315000E+00 8.971800023000E-01 1.080000000000E+02 +4.675777854000E+00 3.243625175000E+00 8.719921484000E-01 1.080000000000E+02 +4.761379590000E+00 3.234518833000E+00 8.511651264000E-01 1.080000000000E+02 +4.846955142000E+00 3.219373272000E+00 8.338806698000E-01 1.080000000000E+02 +4.932333573000E+00 3.203858480000E+00 8.161032666000E-01 1.080000000000E+02 +5.017361603000E+00 3.191283419000E+00 7.945068161000E-01 1.080000000000E+02 +5.101356372000E+00 3.180693677000E+00 7.685448264000E-01 1.080000000000E+02 +5.183940117000E+00 3.170095403000E+00 7.382924668000E-01 1.080000000000E+02 +5.264404972000E+00 3.159073469000E+00 7.029154360000E-01 1.080000000000E+02 +5.341954221000E+00 3.147907667000E+00 6.614534371000E-01 1.080000000000E+02 +5.415392788000E+00 3.138052270000E+00 6.129080743000E-01 1.080000000000E+02 +5.483575614000E+00 3.131338431000E+00 5.567854442000E-01 1.080000000000E+02 +5.546213197000E+00 3.127580211000E+00 4.941808118000E-01 1.080000000000E+02 +5.602948959000E+00 3.127082411000E+00 4.262021665000E-01 1.080000000000E+02 +5.652759050000E+00 3.132188988000E+00 3.530417735000E-01 1.080000000000E+02 +5.695055057000E+00 3.143382740000E+00 2.760107546000E-01 1.080000000000E+02 +5.727817530000E+00 3.163532199000E+00 1.962732381000E-01 1.080000000000E+02 +5.748464496000E+00 3.195613286000E+00 1.162295333000E-01 1.080000000000E+02 +5.756579355000E+00 3.238584500000E+00 3.922229480000E-02 1.080000000000E+02 +5.752242722000E+00 3.290992454000E+00 -3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +5.752242722000E+00 -3.290992454000E+00 3.206635964000E-02 1.080000000000E+02 +5.756579355000E+00 -3.238584500000E+00 -3.922229480000E-02 1.080000000000E+02 +5.748464496000E+00 -3.195613286000E+00 -1.162295333000E-01 1.080000000000E+02 +5.727817530000E+00 -3.163532199000E+00 -1.962732381000E-01 1.080000000000E+02 +5.695055057000E+00 -3.143382740000E+00 -2.760107546000E-01 1.080000000000E+02 +5.652759050000E+00 -3.132188988000E+00 -3.530417735000E-01 1.080000000000E+02 +5.602948959000E+00 -3.127082411000E+00 -4.262021665000E-01 1.080000000000E+02 +5.546213197000E+00 -3.127580211000E+00 -4.941808118000E-01 1.080000000000E+02 +5.483575614000E+00 -3.131338431000E+00 -5.567854442000E-01 1.080000000000E+02 +5.415392788000E+00 -3.138052270000E+00 -6.129080743000E-01 1.080000000000E+02 +5.341954221000E+00 -3.147907667000E+00 -6.614534371000E-01 1.080000000000E+02 +5.264404972000E+00 -3.159073469000E+00 -7.029154360000E-01 1.080000000000E+02 +5.183940117000E+00 -3.170095403000E+00 -7.382924668000E-01 1.080000000000E+02 +5.101356372000E+00 -3.180693677000E+00 -7.685448264000E-01 1.080000000000E+02 +5.017361603000E+00 -3.191283419000E+00 -7.945068161000E-01 1.080000000000E+02 +4.932333573000E+00 -3.203858480000E+00 -8.161032666000E-01 1.080000000000E+02 +4.846955142000E+00 -3.219373272000E+00 -8.338806698000E-01 1.080000000000E+02 +4.761379590000E+00 -3.234518833000E+00 -8.511651264000E-01 1.080000000000E+02 +4.675777854000E+00 -3.243625175000E+00 -8.719921484000E-01 1.080000000000E+02 +4.590818964000E+00 -3.244268315000E+00 -8.971800023000E-01 1.080000000000E+02 +4.507496755000E+00 -3.235330554000E+00 -9.259972860000E-01 1.080000000000E+02 +4.426706505000E+00 -3.216360871000E+00 -9.570750472000E-01 1.080000000000E+02 +4.348891880000E+00 -3.188216883000E+00 -9.885700701000E-01 1.080000000000E+02 +4.274491251000E+00 -3.151297832000E+00 -1.019495947000E+00 1.080000000000E+02 +4.204886516000E+00 -3.105614014000E+00 -1.049719473000E+00 1.080000000000E+02 +4.141076217000E+00 -3.051735607000E+00 -1.079331268000E+00 1.080000000000E+02 +4.084677031000E+00 -2.990100980000E+00 -1.108680995000E+00 1.080000000000E+02 +4.032434128000E+00 -2.923855223000E+00 -1.135668523000E+00 1.080000000000E+02 +3.980896149000E+00 -2.855232261000E+00 -1.157882812000E+00 1.080000000000E+02 +3.928091309000E+00 -2.785783456000E+00 -1.173138038000E+00 1.080000000000E+02 +3.872504432000E+00 -2.716991618000E+00 -1.179281333000E+00 1.080000000000E+02 +3.815060806000E+00 -2.649664350000E+00 -1.175425951000E+00 1.080000000000E+02 +3.757210290000E+00 -2.584090271000E+00 -1.161466271000E+00 1.080000000000E+02 +3.700066461000E+00 -2.520753060000E+00 -1.137456428000E+00 1.080000000000E+02 +3.644796448000E+00 -2.460297621000E+00 -1.103835896000E+00 1.080000000000E+02 +3.591610313000E+00 -2.403952127000E+00 -1.060859533000E+00 1.080000000000E+02 +3.540528946000E+00 -2.353240875000E+00 -1.009152163000E+00 1.080000000000E+02 +3.491239014000E+00 -2.309805399000E+00 -9.496690099000E-01 1.080000000000E+02 +3.443306267000E+00 -2.275108505000E+00 -8.837344519000E-01 1.080000000000E+02 +3.398172326000E+00 -2.246943187000E+00 -8.130003965000E-01 1.080000000000E+02 +3.359318265000E+00 -2.219311564000E+00 -7.382277411000E-01 1.080000000000E+02 +3.330032454000E+00 -2.188620760000E+00 -6.604511422000E-01 1.080000000000E+02 +3.310497008000E+00 -2.156117338000E+00 -5.804104256000E-01 1.080000000000E+02 +3.299415055000E+00 -2.124300450000E+00 -4.985211599000E-01 1.080000000000E+02 +3.295981348000E+00 -2.094425193000E+00 -4.151413601000E-01 1.080000000000E+02 +3.299688964000E+00 -2.067272394000E+00 -3.309221835000E-01 1.080000000000E+02 +3.310788863000E+00 -2.042671412000E+00 -2.465256910000E-01 1.080000000000E+02 +3.329372839000E+00 -2.020669322000E+00 -1.627636593000E-01 1.080000000000E+02 +3.353060450000E+00 -2.003466655000E+00 -7.911508161000E-02 1.080000000000E+02 +3.382743442000E+00 -1.990235068000E+00 3.268188411000E-03 1.080000000000E+02 +3.417248218000E+00 -1.982025179000E+00 8.452815995000E-02 1.080000000000E+02 +3.457713364000E+00 -1.977834914000E+00 1.632283249000E-01 1.080000000000E+02 +3.504194781000E+00 -1.977627202000E+00 2.386307155000E-01 1.080000000000E+02 +3.552956608000E+00 -1.984359135000E+00 3.122472237000E-01 1.080000000000E+02 +3.607585836000E+00 -1.994932843000E+00 3.812203306000E-01 1.080000000000E+02 +3.670725045000E+00 -2.006659994000E+00 4.421942386000E-01 1.080000000000E+02 +3.740780803000E+00 -2.020115622000E+00 4.947621310000E-01 1.080000000000E+02 +3.816403280000E+00 -2.035256916000E+00 5.383970067000E-01 1.080000000000E+02 +3.896233821000E+00 -2.051929419000E+00 5.730609127000E-01 1.080000000000E+02 +3.979723140000E+00 -2.068444079000E+00 5.976498684000E-01 1.080000000000E+02 +4.066244867000E+00 -2.082035189000E+00 6.108406342000E-01 1.080000000000E+02 +4.153991677000E+00 -2.093275279000E+00 6.153164653000E-01 1.080000000000E+02 +4.240843211000E+00 -2.110179324000E+00 6.193379278000E-01 1.080000000000E+02 +4.323124804000E+00 -2.141573433000E+00 6.291917806000E-01 1.080000000000E+02 +4.398139151000E+00 -2.186792695000E+00 6.427120602000E-01 1.080000000000E+02 +4.464825633000E+00 -2.243230570000E+00 6.572772207000E-01 1.080000000000E+02 +4.522240133000E+00 -2.308994413000E+00 6.723087025000E-01 1.080000000000E+02 +4.569276132000E+00 -2.382305588000E+00 6.885508517000E-01 1.080000000000E+02 +4.605001580000E+00 -2.461238499000E+00 7.069563165000E-01 1.080000000000E+02 +4.631907832000E+00 -2.543306203000E+00 7.269319722000E-01 1.080000000000E+02 +4.653109087000E+00 -2.626876723000E+00 7.471733717000E-01 1.080000000000E+02 +4.671007851000E+00 -2.711567590000E+00 7.661370968000E-01 1.080000000000E+02 +4.689127860000E+00 -2.796976619000E+00 7.811847600000E-01 1.080000000000E+02 +4.709815427000E+00 -2.882679269000E+00 7.895526386000E-01 1.080000000000E+02 +4.728060180000E+00 -2.969357220000E+00 7.913832776000E-01 1.080000000000E+02 +4.739493712000E+00 -3.057130803000E+00 7.877001548000E-01 1.080000000000E+02 +4.748111962000E+00 -3.144785526000E+00 7.779139702000E-01 1.080000000000E+02 +4.757654910000E+00 -3.231463772000E+00 7.624802322000E-01 1.080000000000E+02 +4.769934586000E+00 -3.316939880000E+00 7.426294678000E-01 1.080000000000E+02 +4.786312292000E+00 -3.400851683000E+00 7.191623664000E-01 1.080000000000E+02 +4.813323282000E+00 -3.479924343000E+00 6.898657429000E-01 1.080000000000E+02 +4.851599223000E+00 -3.551697690000E+00 6.547457037000E-01 1.080000000000E+02 +4.900696448000E+00 -3.613432642000E+00 6.144560156000E-01 1.080000000000E+02 +4.959216583000E+00 -3.663320405000E+00 5.704365727000E-01 1.080000000000E+02 +5.025692411000E+00 -3.700042630000E+00 5.247345144000E-01 1.080000000000E+02 +5.098843243000E+00 -3.722275086000E+00 4.800337212000E-01 1.080000000000E+02 +5.177130955000E+00 -3.729591464000E+00 4.392283960000E-01 1.080000000000E+02 +5.258548457000E+00 -3.721496611000E+00 4.052293645000E-01 1.080000000000E+02 +5.340036569000E+00 -3.702141809000E+00 3.763048784000E-01 1.080000000000E+02 +5.418240726000E+00 -3.676363552000E+00 3.436690988000E-01 1.080000000000E+02 +5.490234730000E+00 -3.638992008000E+00 3.080563152000E-01 1.080000000000E+02 +5.557282500000E+00 -3.591558238000E+00 2.748207179000E-01 1.080000000000E+02 +5.618131884000E+00 -3.538101431000E+00 2.389271858000E-01 1.080000000000E+02 +5.668713979000E+00 -3.478301489000E+00 1.975103298000E-01 1.080000000000E+02 +5.707868427000E+00 -3.414368505000E+00 1.502609002000E-01 1.080000000000E+02 +5.735864133000E+00 -3.350576153000E+00 9.558959151000E-02 1.080000000000E+02 +5.752242722000E+00 -3.290992454000E+00 3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +6.109347735000E+00 -2.634276656000E+00 -3.187537464000E-02 1.080000000000E+02 +6.072154482000E+00 -2.660697759000E+00 -1.084250821000E-01 1.080000000000E+02 +6.031267734000E+00 -2.683719576000E+00 -1.840910744000E-01 1.080000000000E+02 +5.987407128000E+00 -2.702783994000E+00 -2.593013285000E-01 1.080000000000E+02 +5.940889229000E+00 -2.718446479000E+00 -3.337124203000E-01 1.080000000000E+02 +5.892012366000E+00 -2.731082147000E+00 -4.071715453000E-01 1.080000000000E+02 +5.840997196000E+00 -2.741127309000E+00 -4.794354850000E-01 1.080000000000E+02 +5.787973759000E+00 -2.748619035000E+00 -5.506192747000E-01 1.080000000000E+02 +5.733046204000E+00 -2.753501719000E+00 -6.207042323000E-01 1.080000000000E+02 +5.676641133000E+00 -2.755175178000E+00 -6.895838911000E-01 1.080000000000E+02 +5.618852694000E+00 -2.752998034000E+00 -7.574711850000E-01 1.080000000000E+02 +5.559542609000E+00 -2.747455734000E+00 -8.236903164000E-01 1.080000000000E+02 +5.498007131000E+00 -2.739518282000E+00 -8.876176364000E-01 1.080000000000E+02 +5.432965275000E+00 -2.731270735000E+00 -9.479798854000E-01 1.080000000000E+02 +5.364843644000E+00 -2.721815755000E+00 -1.004521395000E+00 1.080000000000E+02 +5.293521613000E+00 -2.711108036000E+00 -1.056863518000E+00 1.080000000000E+02 +5.221006861000E+00 -2.695704748000E+00 -1.106391465000E+00 1.080000000000E+02 +5.149256462000E+00 -2.673345489000E+00 -1.154170635000E+00 1.080000000000E+02 +5.080156882000E+00 -2.642255297000E+00 -1.201173169000E+00 1.080000000000E+02 +5.015458074000E+00 -2.602041405000E+00 -1.247327499000E+00 1.080000000000E+02 +4.955428355000E+00 -2.553535245000E+00 -1.291888617000E+00 1.080000000000E+02 +4.899267477000E+00 -2.498318189000E+00 -1.333595471000E+00 1.080000000000E+02 +4.845155468000E+00 -2.438283615000E+00 -1.371062779000E+00 1.080000000000E+02 +4.790208201000E+00 -2.375804756000E+00 -1.402784195000E+00 1.080000000000E+02 +4.732392401000E+00 -2.312626123000E+00 -1.427519630000E+00 1.080000000000E+02 +4.670186715000E+00 -2.250975168000E+00 -1.443978096000E+00 1.080000000000E+02 +4.603662931000E+00 -2.192308664000E+00 -1.451432017000E+00 1.080000000000E+02 +4.534215302000E+00 -2.136494070000E+00 -1.449884186000E+00 1.080000000000E+02 +4.463257207000E+00 -2.083489462000E+00 -1.439465232000E+00 1.080000000000E+02 +4.391089915000E+00 -2.035102457000E+00 -1.420151472000E+00 1.080000000000E+02 +4.318262713000E+00 -1.991799227000E+00 -1.392276244000E+00 1.080000000000E+02 +4.246909202000E+00 -1.952224944000E+00 -1.356669215000E+00 1.080000000000E+02 +4.178887014000E+00 -1.913836763000E+00 -1.313751841000E+00 1.080000000000E+02 +4.116261198000E+00 -1.874590669000E+00 -1.263842748000E+00 1.080000000000E+02 +4.060097085000E+00 -1.834801320000E+00 -1.207380380000E+00 1.080000000000E+02 +4.009618846000E+00 -1.796721175000E+00 -1.144593485000E+00 1.080000000000E+02 +3.964630243000E+00 -1.761745959000E+00 -1.076114245000E+00 1.080000000000E+02 +3.925626136000E+00 -1.729842869000E+00 -1.002637062000E+00 1.080000000000E+02 +3.892929860000E+00 -1.701083398000E+00 -9.249046690000E-01 1.080000000000E+02 +3.866276921000E+00 -1.676087882000E+00 -8.436327263000E-01 1.080000000000E+02 +3.846341645000E+00 -1.654141250000E+00 -7.596450919000E-01 1.080000000000E+02 +3.834757773000E+00 -1.633422791000E+00 -6.737108263000E-01 1.080000000000E+02 +3.832731559000E+00 -1.613021490000E+00 -5.870384289000E-01 1.080000000000E+02 +3.840607521000E+00 -1.592924400000E+00 -5.006187195000E-01 1.080000000000E+02 +3.858435969000E+00 -1.573392337000E+00 -4.155171011000E-01 1.080000000000E+02 +3.886239263000E+00 -1.554624039000E+00 -3.329023539000E-01 1.080000000000E+02 +3.924020346000E+00 -1.536713359000E+00 -2.542191153000E-01 1.080000000000E+02 +3.971478829000E+00 -1.519890516000E+00 -1.807565333000E-01 1.080000000000E+02 +4.027980988000E+00 -1.504545482000E+00 -1.135748529000E-01 1.080000000000E+02 +4.092685681000E+00 -1.490852134000E+00 -5.388091285000E-02 1.080000000000E+02 +4.165111582000E+00 -1.477516103000E+00 -3.754172340000E-03 1.080000000000E+02 +4.243762054000E+00 -1.462981172000E+00 3.558837129000E-02 1.080000000000E+02 +4.325949794000E+00 -1.447838848000E+00 6.642283384000E-02 1.080000000000E+02 +4.409901903000E+00 -1.434824975000E+00 9.346268448000E-02 1.080000000000E+02 +4.494047601000E+00 -1.428987731000E+00 1.219181286000E-01 1.080000000000E+02 +4.576004387000E+00 -1.437212036000E+00 1.560456650000E-01 1.080000000000E+02 +4.651796034000E+00 -1.462429678000E+00 1.954128437000E-01 1.080000000000E+02 +4.719320422000E+00 -1.502381725000E+00 2.376983871000E-01 1.080000000000E+02 +4.775915256000E+00 -1.554974294000E+00 2.820781068000E-01 1.080000000000E+02 +4.818480463000E+00 -1.618138364000E+00 3.283193574000E-01 1.080000000000E+02 +4.846640633000E+00 -1.688211627000E+00 3.756353333000E-01 1.080000000000E+02 +4.861758538000E+00 -1.762358796000E+00 4.226801226000E-01 1.080000000000E+02 +4.868565935000E+00 -1.838768869000E+00 4.679474510000E-01 1.080000000000E+02 +4.873219137000E+00 -1.917199566000E+00 5.099632237000E-01 1.080000000000E+02 +4.886271109000E+00 -1.996748992000E+00 5.479092097000E-01 1.080000000000E+02 +4.898215387000E+00 -2.079645480000E+00 5.783904634000E-01 1.080000000000E+02 +4.908522983000E+00 -2.164728233000E+00 6.026804297000E-01 1.080000000000E+02 +4.914619572000E+00 -2.251234072000E+00 6.230907784000E-01 1.080000000000E+02 +4.919293369000E+00 -2.338142535000E+00 6.421364412000E-01 1.080000000000E+02 +4.924747995000E+00 -2.425053057000E+00 6.610368381000E-01 1.080000000000E+02 +4.935221819000E+00 -2.511497554000E+00 6.800217467000E-01 1.080000000000E+02 +4.955135323000E+00 -2.596405252000E+00 6.982493624000E-01 1.080000000000E+02 +4.988264379000E+00 -2.677536196000E+00 7.142960837000E-01 1.080000000000E+02 +5.034184446000E+00 -2.752837985000E+00 7.270540685000E-01 1.080000000000E+02 +5.092739004000E+00 -2.819289688000E+00 7.366388673000E-01 1.080000000000E+02 +5.162150445000E+00 -2.874434075000E+00 7.452820520000E-01 1.080000000000E+02 +5.240414620000E+00 -2.915167245000E+00 7.578816060000E-01 1.080000000000E+02 +5.323379660000E+00 -2.941204700000E+00 7.773689488000E-01 1.080000000000E+02 +5.408445348000E+00 -2.952817993000E+00 8.012208021000E-01 1.080000000000E+02 +5.494426024000E+00 -2.949761461000E+00 8.243174216000E-01 1.080000000000E+02 +5.579655881000E+00 -2.931512000000E+00 8.427262700000E-01 1.080000000000E+02 +5.660643839000E+00 -2.896797453000E+00 8.562220560000E-01 1.080000000000E+02 +5.736399004000E+00 -2.850569056000E+00 8.640060786000E-01 1.080000000000E+02 +5.810749029000E+00 -2.801522435000E+00 8.607369806000E-01 1.080000000000E+02 +5.883071369000E+00 -2.752577611000E+00 8.432354714000E-01 1.080000000000E+02 +5.950880551000E+00 -2.704681051000E+00 8.108473046000E-01 1.080000000000E+02 +6.012009433000E+00 -2.659236425000E+00 7.645271884000E-01 1.080000000000E+02 +6.065265883000E+00 -2.617981623000E+00 7.062104980000E-01 1.080000000000E+02 +6.110163870000E+00 -2.582793989000E+00 6.378051764000E-01 1.080000000000E+02 +6.145914913000E+00 -2.556585893000E+00 5.605003417000E-01 1.080000000000E+02 +6.171309817000E+00 -2.541715417000E+00 4.764366174000E-01 1.080000000000E+02 +6.186093205000E+00 -2.537535597000E+00 3.886351210000E-01 1.080000000000E+02 +6.190225661000E+00 -2.543048476000E+00 2.997983967000E-01 1.080000000000E+02 +6.183737770000E+00 -2.557383198000E+00 2.120822207000E-01 1.080000000000E+02 +6.166951411000E+00 -2.579529745000E+00 1.274648788000E-01 1.080000000000E+02 +6.141532971000E+00 -2.606247998000E+00 4.635841915000E-02 1.080000000000E+02 +6.109347735000E+00 -2.634276656000E+00 -3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +6.363713956000E+00 -2.128162379000E+00 -3.632685538000E-02 1.080000000000E+02 +6.343796036000E+00 -2.144571860000E+00 -1.206362437000E-01 1.080000000000E+02 +6.319647402000E+00 -2.158199745000E+00 -2.044325232000E-01 1.080000000000E+02 +6.292250116000E+00 -2.166693987000E+00 -2.879184587000E-01 1.080000000000E+02 +6.261990770000E+00 -2.169750666000E+00 -3.706549346000E-01 1.080000000000E+02 +6.229880263000E+00 -2.165904773000E+00 -4.527156872000E-01 1.080000000000E+02 +6.195762662000E+00 -2.156487158000E+00 -5.335701480000E-01 1.080000000000E+02 +6.159785669000E+00 -2.142229518000E+00 -6.127886991000E-01 1.080000000000E+02 +6.121844537000E+00 -2.123861639000E+00 -6.903510399000E-01 1.080000000000E+02 +6.081673305000E+00 -2.102564325000E+00 -7.659096737000E-01 1.080000000000E+02 +6.038956580000E+00 -2.079134440000E+00 -8.394336353000E-01 1.080000000000E+02 +5.994581696000E+00 -2.052319981000E+00 -9.108702606000E-01 1.080000000000E+02 +5.949370672000E+00 -2.021151235000E+00 -9.799657947000E-01 1.080000000000E+02 +5.902988110000E+00 -1.986464933000E+00 -1.046417130000E+00 1.080000000000E+02 +5.854696722000E+00 -1.949187536000E+00 -1.110182121000E+00 1.080000000000E+02 +5.803826303000E+00 -1.910401290000E+00 -1.170998922000E+00 1.080000000000E+02 +5.749773723000E+00 -1.871091206000E+00 -1.228575236000E+00 1.080000000000E+02 +5.692045304000E+00 -1.832075625000E+00 -1.282612075000E+00 1.080000000000E+02 +5.630209732000E+00 -1.794075357000E+00 -1.332770951000E+00 1.080000000000E+02 +5.564272894000E+00 -1.757441247000E+00 -1.378577601000E+00 1.080000000000E+02 +5.494418963000E+00 -1.722478683000E+00 -1.419493916000E+00 1.080000000000E+02 +5.420904491000E+00 -1.688963477000E+00 -1.455093589000E+00 1.080000000000E+02 +5.344244928000E+00 -1.656904457000E+00 -1.484797470000E+00 1.080000000000E+02 +5.265097539000E+00 -1.625986377000E+00 -1.508093490000E+00 1.080000000000E+02 +5.183803016000E+00 -1.595673190000E+00 -1.524583142000E+00 1.080000000000E+02 +5.101512302000E+00 -1.565220695000E+00 -1.533750385000E+00 1.080000000000E+02 +5.019163925000E+00 -1.533815259000E+00 -1.535219663000E+00 1.080000000000E+02 +4.937427500000E+00 -1.501038811000E+00 -1.528680731000E+00 1.080000000000E+02 +4.857619318000E+00 -1.466512852000E+00 -1.513978101000E+00 1.080000000000E+02 +4.781411366000E+00 -1.428439767000E+00 -1.491069996000E+00 1.080000000000E+02 +4.710539180000E+00 -1.386079918000E+00 -1.460188986000E+00 1.080000000000E+02 +4.644594986000E+00 -1.341851109000E+00 -1.421583532000E+00 1.080000000000E+02 +4.583207789000E+00 -1.298320310000E+00 -1.375655668000E+00 1.080000000000E+02 +4.524945380000E+00 -1.258628196000E+00 -1.322504398000E+00 1.080000000000E+02 +4.469162561000E+00 -1.225582841000E+00 -1.262691804000E+00 1.080000000000E+02 +4.418915275000E+00 -1.195280687000E+00 -1.196814028000E+00 1.080000000000E+02 +4.378198580000E+00 -1.162743062000E+00 -1.125601149000E+00 1.080000000000E+02 +4.347724461000E+00 -1.128893857000E+00 -1.050138721000E+00 1.080000000000E+02 +4.327075141000E+00 -1.095599749000E+00 -9.710448039000E-01 1.080000000000E+02 +4.317526898000E+00 -1.062634345000E+00 -8.897856590000E-01 1.080000000000E+02 +4.318791406000E+00 -1.031398741000E+00 -8.072828216000E-01 1.080000000000E+02 +4.331672738000E+00 -1.001676472000E+00 -7.252260042000E-01 1.080000000000E+02 +4.356655749000E+00 -9.730232829000E-01 -6.456312705000E-01 1.080000000000E+02 +4.392819861000E+00 -9.459804438000E-01 -5.697936167000E-01 1.080000000000E+02 +4.438788473000E+00 -9.208578308000E-01 -4.988404496000E-01 1.080000000000E+02 +4.493831652000E+00 -8.956987359000E-01 -4.346658470000E-01 1.080000000000E+02 +4.555414498000E+00 -8.713058334000E-01 -3.764466502000E-01 1.080000000000E+02 +4.619994740000E+00 -8.546842285000E-01 -3.185973837000E-01 1.080000000000E+02 +4.686309048000E+00 -8.470509883000E-01 -2.609630366000E-01 1.080000000000E+02 +4.753368880000E+00 -8.481351468000E-01 -2.036424630000E-01 1.080000000000E+02 +4.819500779000E+00 -8.578730073000E-01 -1.460500498000E-01 1.080000000000E+02 +4.881076270000E+00 -8.788352917000E-01 -8.649636904000E-02 1.080000000000E+02 +4.934281234000E+00 -9.121849315000E-01 -2.448555749000E-02 1.080000000000E+02 +4.976958534000E+00 -9.568618200000E-01 3.845435998000E-02 1.080000000000E+02 +5.009230268000E+00 -1.011653966000E+00 9.962429365000E-02 1.080000000000E+02 +5.030067880000E+00 -1.077060272000E+00 1.550619236000E-01 1.080000000000E+02 +5.042687073000E+00 -1.149884311000E+00 2.031942363000E-01 1.080000000000E+02 +5.051978178000E+00 -1.226376910000E+00 2.462074493000E-01 1.080000000000E+02 +5.070017868000E+00 -1.299790175000E+00 2.916382842000E-01 1.080000000000E+02 +5.091875208000E+00 -1.370034814000E+00 3.403860995000E-01 1.080000000000E+02 +5.109509479000E+00 -1.439159402000E+00 3.922509070000E-01 1.080000000000E+02 +5.118215109000E+00 -1.508485081000E+00 4.461358974000E-01 1.080000000000E+02 +5.117693771000E+00 -1.578985241000E+00 4.991121880000E-01 1.080000000000E+02 +5.111866677000E+00 -1.652286265000E+00 5.478583852000E-01 1.080000000000E+02 +5.107197588000E+00 -1.729247244000E+00 5.907387262000E-01 1.080000000000E+02 +5.111994364000E+00 -1.807625867000E+00 6.309463669000E-01 1.080000000000E+02 +5.128201134000E+00 -1.885891955000E+00 6.683070249000E-01 1.080000000000E+02 +5.156280985000E+00 -1.959214751000E+00 7.085053980000E-01 1.080000000000E+02 +5.193817285000E+00 -2.021276421000E+00 7.587395914000E-01 1.080000000000E+02 +5.234769347000E+00 -2.068559850000E+00 8.209661657000E-01 1.080000000000E+02 +5.277822646000E+00 -2.099771698000E+00 8.913395217000E-01 1.080000000000E+02 +5.328858411000E+00 -2.115191313000E+00 9.616664656000E-01 1.080000000000E+02 +5.392350965000E+00 -2.120964126000E+00 1.022604995000E+00 1.080000000000E+02 +5.466579776000E+00 -2.120864684000E+00 1.070335916000E+00 1.080000000000E+02 +5.546200253000E+00 -2.109205640000E+00 1.106430447000E+00 1.080000000000E+02 +5.625560061000E+00 -2.082208037000E+00 1.133893710000E+00 1.080000000000E+02 +5.699286952000E+00 -2.038773149000E+00 1.155518699000E+00 1.080000000000E+02 +5.769575723000E+00 -1.988093083000E+00 1.172009822000E+00 1.080000000000E+02 +5.844826615000E+00 -1.942801593000E+00 1.180212576000E+00 1.080000000000E+02 +5.925434455000E+00 -1.907278119000E+00 1.175727956000E+00 1.080000000000E+02 +6.006732509000E+00 -1.878693996000E+00 1.156570420000E+00 1.080000000000E+02 +6.084612448000E+00 -1.855311626000E+00 1.122466283000E+00 1.080000000000E+02 +6.156347548000E+00 -1.837683092000E+00 1.074292285000E+00 1.080000000000E+02 +6.220013095000E+00 -1.827356520000E+00 1.014026757000E+00 1.080000000000E+02 +6.274186891000E+00 -1.825898276000E+00 9.444199619000E-01 1.080000000000E+02 +6.318191072000E+00 -1.833796156000E+00 8.684143517000E-01 1.080000000000E+02 +6.352318669000E+00 -1.849848174000E+00 7.885880029000E-01 1.080000000000E+02 +6.378101927000E+00 -1.870579724000E+00 7.068846032000E-01 1.080000000000E+02 +6.396278130000E+00 -1.895742350000E+00 6.243033587000E-01 1.080000000000E+02 +6.406881996000E+00 -1.926418885000E+00 5.422183342000E-01 1.080000000000E+02 +6.411135076000E+00 -1.960951758000E+00 4.611599500000E-01 1.080000000000E+02 +6.410185957000E+00 -1.997719144000E+00 3.810313384000E-01 1.080000000000E+02 +6.406163537000E+00 -2.032381175000E+00 2.999547317000E-01 1.080000000000E+02 +6.400148737000E+00 -2.061942659000E+00 2.170477619000E-01 1.080000000000E+02 +6.391461939000E+00 -2.087284016000E+00 1.330022602000E-01 1.080000000000E+02 +6.379908367000E+00 -2.108115304000E+00 4.805479793000E-02 1.080000000000E+02 +6.363713956000E+00 -2.128162379000E+00 -3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +6.643640420000E+00 -1.378705287000E+00 -2.786784824000E-03 1.080000000000E+02 +6.639687437000E+00 -1.365792034000E+00 -9.012406132000E-02 1.080000000000E+02 +6.632778832000E+00 -1.349174400000E+00 -1.765219348000E-01 1.080000000000E+02 +6.622049048000E+00 -1.331487172000E+00 -2.624374443000E-01 1.080000000000E+02 +6.606676061000E+00 -1.315271575000E+00 -3.478877549000E-01 1.080000000000E+02 +6.586858176000E+00 -1.299970819000E+00 -4.326343739000E-01 1.080000000000E+02 +6.563092600000E+00 -1.284316278000E+00 -5.162774167000E-01 1.080000000000E+02 +6.535851242000E+00 -1.267135971000E+00 -5.984352213000E-01 1.080000000000E+02 +6.505168239000E+00 -1.248214832000E+00 -6.790841041000E-01 1.080000000000E+02 +6.470544013000E+00 -1.229014048000E+00 -7.581530132000E-01 1.080000000000E+02 +6.431696132000E+00 -1.210752598000E+00 -8.352590367000E-01 1.080000000000E+02 +6.388725797000E+00 -1.192690916000E+00 -9.103747398000E-01 1.080000000000E+02 +6.342057854000E+00 -1.174084581000E+00 -9.829305340000E-01 1.080000000000E+02 +6.291368669000E+00 -1.155381524000E+00 -1.052910239000E+00 1.080000000000E+02 +6.236953625000E+00 -1.136397571000E+00 -1.119713595000E+00 1.080000000000E+02 +6.179647097000E+00 -1.114085459000E+00 -1.183240350000E+00 1.080000000000E+02 +6.120618864000E+00 -1.086377930000E+00 -1.242822431000E+00 1.080000000000E+02 +6.059905992000E+00 -1.053856708000E+00 -1.298134958000E+00 1.080000000000E+02 +5.997334312000E+00 -1.017526000000E+00 -1.348880339000E+00 1.080000000000E+02 +5.933213917000E+00 -9.775991079000E-01 -1.394624322000E+00 1.080000000000E+02 +5.867703093000E+00 -9.342666050000E-01 -1.435050927000E+00 1.080000000000E+02 +5.800518222000E+00 -8.888473544000E-01 -1.469852265000E+00 1.080000000000E+02 +5.730890243000E+00 -8.427569411000E-01 -1.498846663000E+00 1.080000000000E+02 +5.657925352000E+00 -7.984969458000E-01 -1.521653119000E+00 1.080000000000E+02 +5.580536153000E+00 -7.591999542000E-01 -1.537810757000E+00 1.080000000000E+02 +5.499339895000E+00 -7.254315084000E-01 -1.546702180000E+00 1.080000000000E+02 +5.415794088000E+00 -6.966924104000E-01 -1.547836060000E+00 1.080000000000E+02 +5.330973182000E+00 -6.733225445000E-01 -1.540955846000E+00 1.080000000000E+02 +5.245650355000E+00 -6.557160034000E-01 -1.525941209000E+00 1.080000000000E+02 +5.161278411000E+00 -6.438518974000E-01 -1.502926011000E+00 1.080000000000E+02 +5.078847654000E+00 -6.366156177000E-01 -1.472011314000E+00 1.080000000000E+02 +4.999989178000E+00 -6.290923381000E-01 -1.432913650000E+00 1.080000000000E+02 +4.926860412000E+00 -6.164324717000E-01 -1.385061074000E+00 1.080000000000E+02 +4.861012131000E+00 -6.000061110000E-01 -1.328492129000E+00 1.080000000000E+02 +4.803577331000E+00 -5.826237931000E-01 -1.263647540000E+00 1.080000000000E+02 +4.756509262000E+00 -5.642428580000E-01 -1.191204722000E+00 1.080000000000E+02 +4.722017137000E+00 -5.441512842000E-01 -1.112414355000E+00 1.080000000000E+02 +4.701454020000E+00 -5.226934795000E-01 -1.029225643000E+00 1.080000000000E+02 +4.695087054000E+00 -5.004339933000E-01 -9.439925506000E-01 1.080000000000E+02 +4.702794140000E+00 -4.765845308000E-01 -8.592609358000E-01 1.080000000000E+02 +4.723791509000E+00 -4.498239852000E-01 -7.777589224000E-01 1.080000000000E+02 +4.756423942000E+00 -4.188770729000E-01 -7.017224202000E-01 1.080000000000E+02 +4.797842912000E+00 -3.839689737000E-01 -6.319745517000E-01 1.080000000000E+02 +4.844168104000E+00 -3.497770517000E-01 -5.649597706000E-01 1.080000000000E+02 +4.892518039000E+00 -3.231836166000E-01 -4.959805589000E-01 1.080000000000E+02 +4.941449330000E+00 -3.090818341000E-01 -4.238156204000E-01 1.080000000000E+02 +4.989521827000E+00 -3.113333016000E-01 -3.497702850000E-01 1.080000000000E+02 +5.036290979000E+00 -3.296934215000E-01 -2.770763044000E-01 1.080000000000E+02 +5.082895375000E+00 -3.596315296000E-01 -2.083126740000E-01 1.080000000000E+02 +5.125994571000E+00 -4.027764377000E-01 -1.443669380000E-01 1.080000000000E+02 +5.161762090000E+00 -4.574496863000E-01 -8.494149535000E-02 1.080000000000E+02 +5.186096077000E+00 -5.214810094000E-01 -2.916971350000E-02 1.080000000000E+02 +5.200442861000E+00 -5.898163457000E-01 2.494784873000E-02 1.080000000000E+02 +5.209029632000E+00 -6.585854927000E-01 7.966775233000E-02 1.080000000000E+02 +5.215661680000E+00 -7.259894751000E-01 1.364003779000E-01 1.080000000000E+02 +5.222274311000E+00 -7.920473800000E-01 1.946452353000E-01 1.080000000000E+02 +5.229597750000E+00 -8.574141894000E-01 2.536123470000E-01 1.080000000000E+02 +5.235145346000E+00 -9.241223686000E-01 3.112409570000E-01 1.080000000000E+02 +5.235510752000E+00 -9.926600101000E-01 3.670458051000E-01 1.080000000000E+02 +5.228851049000E+00 -1.060796204000E+00 4.228264178000E-01 1.080000000000E+02 +5.215666387000E+00 -1.126470241000E+00 4.803836822000E-01 1.080000000000E+02 +5.198397524000E+00 -1.189239997000E+00 5.400717519000E-01 1.080000000000E+02 +5.181219276000E+00 -1.252787274000E+00 5.989634359000E-01 1.080000000000E+02 +5.166861312000E+00 -1.307608914000E+00 6.667474988000E-01 1.080000000000E+02 +5.163632079000E+00 -1.353497795000E+00 7.421450537000E-01 1.080000000000E+02 +5.178037117000E+00 -1.394822618000E+00 8.188905247000E-01 1.080000000000E+02 +5.209086119000E+00 -1.430111607000E+00 8.936981911000E-01 1.080000000000E+02 +5.252708418000E+00 -1.453593714000E+00 9.667867241000E-01 1.080000000000E+02 +5.305322317000E+00 -1.463058549000E+00 1.037139043000E+00 1.080000000000E+02 +5.364050458000E+00 -1.457733963000E+00 1.102951579000E+00 1.080000000000E+02 +5.426195537000E+00 -1.438437855000E+00 1.162638692000E+00 1.080000000000E+02 +5.490398309000E+00 -1.409106442000E+00 1.215714425000E+00 1.080000000000E+02 +5.555311890000E+00 -1.371278140000E+00 1.262085734000E+00 1.080000000000E+02 +5.622935132000E+00 -1.330457442000E+00 1.301720477000E+00 1.080000000000E+02 +5.695492839000E+00 -1.291066010000E+00 1.333014261000E+00 1.080000000000E+02 +5.773685228000E+00 -1.255194047000E+00 1.353085167000E+00 1.080000000000E+02 +5.856613196000E+00 -1.225208902000E+00 1.358569067000E+00 1.080000000000E+02 +5.940792728000E+00 -1.200489722000E+00 1.348281183000E+00 1.080000000000E+02 +6.023401775000E+00 -1.182006660000E+00 1.323067807000E+00 1.080000000000E+02 +6.102409122000E+00 -1.170933166000E+00 1.285194785000E+00 1.080000000000E+02 +6.176470232000E+00 -1.169619746000E+00 1.237059622000E+00 1.080000000000E+02 +6.244570096000E+00 -1.177801832000E+00 1.181327921000E+00 1.080000000000E+02 +6.306113223000E+00 -1.194416155000E+00 1.120196685000E+00 1.080000000000E+02 +6.360095781000E+00 -1.220875505000E+00 1.055471471000E+00 1.080000000000E+02 +6.406901413000E+00 -1.253918505000E+00 9.881923803000E-01 1.080000000000E+02 +6.447784629000E+00 -1.289031117000E+00 9.182365063000E-01 1.080000000000E+02 +6.482859580000E+00 -1.325213175000E+00 8.457732406000E-01 1.080000000000E+02 +6.514173959000E+00 -1.356876780000E+00 7.694019289000E-01 1.080000000000E+02 +6.542415036000E+00 -1.380954658000E+00 6.892798267000E-01 1.080000000000E+02 +6.567183273000E+00 -1.398428291000E+00 6.062523787000E-01 1.080000000000E+02 +6.588951768000E+00 -1.407824870000E+00 5.212198625000E-01 1.080000000000E+02 +6.607227412000E+00 -1.411642961000E+00 4.348356053000E-01 1.080000000000E+02 +6.621613619000E+00 -1.411845377000E+00 3.477269332000E-01 1.080000000000E+02 +6.632496981000E+00 -1.407980654000E+00 2.600860194000E-01 1.080000000000E+02 +6.640144048000E+00 -1.399752818000E+00 1.724869752000E-01 1.080000000000E+02 +6.644016420000E+00 -1.389411241000E+00 8.489061568000E-02 1.080000000000E+02 +6.643640420000E+00 -1.378705287000E+00 -2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +6.842620711000E+00 -4.311918695000E-01 -1.744954334000E-02 1.080000000000E+02 +6.839498568000E+00 -4.265082904000E-01 -1.063739981000E-01 1.080000000000E+02 +6.831506098000E+00 -4.215286640000E-01 -1.949310037000E-01 1.080000000000E+02 +6.818617412000E+00 -4.167769020000E-01 -2.829651087000E-01 1.080000000000E+02 +6.800956077000E+00 -4.115800394000E-01 -3.701617308000E-01 1.080000000000E+02 +6.778788051000E+00 -4.046814011000E-01 -4.560661339000E-01 1.080000000000E+02 +6.752113339000E+00 -3.963623976000E-01 -5.407768227000E-01 1.080000000000E+02 +6.721149657000E+00 -3.870871061000E-01 -6.236520547000E-01 1.080000000000E+02 +6.685979972000E+00 -3.761268087000E-01 -7.047985910000E-01 1.080000000000E+02 +6.646953210000E+00 -3.626203940000E-01 -7.837241475000E-01 1.080000000000E+02 +6.604317690000E+00 -3.457292941000E-01 -8.601609198000E-01 1.080000000000E+02 +6.558708896000E+00 -3.235099674000E-01 -9.334175927000E-01 1.080000000000E+02 +6.511596694000E+00 -2.918270557000E-01 -1.002061223000E+00 1.080000000000E+02 +6.464143798000E+00 -2.501532454000E-01 -1.064920566000E+00 1.080000000000E+02 +6.415352259000E+00 -2.036280468000E-01 -1.123012040000E+00 1.080000000000E+02 +6.363610984000E+00 -1.562078658000E-01 -1.177853833000E+00 1.080000000000E+02 +6.307653700000E+00 -1.107436291000E-01 -1.230287750000E+00 1.080000000000E+02 +6.245924627000E+00 -7.150624693000E-02 -1.280975246000E+00 1.080000000000E+02 +6.177941864000E+00 -4.013749478000E-02 -1.329400646000E+00 1.080000000000E+02 +6.104689238000E+00 -1.626336237000E-02 -1.374018251000E+00 1.080000000000E+02 +6.026645718000E+00 3.786653005000E-04 -1.413793625000E+00 1.080000000000E+02 +5.944807498000E+00 1.008513961000E-02 -1.447633049000E+00 1.080000000000E+02 +5.860074265000E+00 1.369704000000E-02 -1.474786583000E+00 1.080000000000E+02 +5.773248622000E+00 1.197056691000E-02 -1.494787468000E+00 1.080000000000E+02 +5.685500340000E+00 3.286520992000E-03 -1.507450791000E+00 1.080000000000E+02 +5.598233972000E+00 -1.329607745000E-02 -1.512984118000E+00 1.080000000000E+02 +5.511546607000E+00 -3.400716135000E-02 -1.511502484000E+00 1.080000000000E+02 +5.425259365000E+00 -5.433793821000E-02 -1.502532507000E+00 1.080000000000E+02 +5.339305756000E+00 -6.951507119000E-02 -1.484801442000E+00 1.080000000000E+02 +5.255036196000E+00 -7.495677513000E-02 -1.456473280000E+00 1.080000000000E+02 +5.175638729000E+00 -7.011633232000E-02 -1.416487546000E+00 1.080000000000E+02 +5.104459683000E+00 -5.677025204000E-02 -1.364609021000E+00 1.080000000000E+02 +5.044541763000E+00 -3.752851103000E-02 -1.301455248000E+00 1.080000000000E+02 +4.998273942000E+00 -1.501167633000E-02 -1.228771473000E+00 1.080000000000E+02 +4.967327324000E+00 1.029952568000E-02 -1.149164457000E+00 1.080000000000E+02 +4.952170289000E+00 3.914399396000E-02 -1.066259509000E+00 1.080000000000E+02 +4.951811943000E+00 7.330794776000E-02 -9.840199882000E-01 1.080000000000E+02 +4.963304905000E+00 1.129728839000E-01 -9.050198505000E-01 1.080000000000E+02 +4.982187208000E+00 1.524354321000E-01 -8.274301477000E-01 1.080000000000E+02 +5.005934544000E+00 1.840211999000E-01 -7.475896770000E-01 1.080000000000E+02 +5.034561622000E+00 2.043352689000E-01 -6.657541041000E-01 1.080000000000E+02 +5.068395602000E+00 2.129816713000E-01 -5.837632627000E-01 1.080000000000E+02 +5.106168446000E+00 2.075629019000E-01 -5.032871173000E-01 1.080000000000E+02 +5.144639742000E+00 1.853654754000E-01 -4.260584823000E-01 1.080000000000E+02 +5.179072143000E+00 1.458225071000E-01 -3.540587787000E-01 1.080000000000E+02 +5.206521210000E+00 9.232726022000E-02 -2.882948801000E-01 1.080000000000E+02 +5.228400321000E+00 3.101171402000E-02 -2.275175217000E-01 1.080000000000E+02 +5.248664816000E+00 -3.278089332000E-02 -1.687606404000E-01 1.080000000000E+02 +5.269561859000E+00 -9.642600794000E-02 -1.100117670000E-01 1.080000000000E+02 +5.291955836000E+00 -1.554567698000E-01 -4.718627597000E-02 1.080000000000E+02 +5.307538296000E+00 -2.139447446000E-01 1.819661694000E-02 1.080000000000E+02 +5.312024976000E+00 -2.723898200000E-01 8.530081591000E-02 1.080000000000E+02 +5.306467377000E+00 -3.339215658000E-01 1.494783330000E-01 1.080000000000E+02 +5.294107088000E+00 -3.951074144000E-01 2.130101728000E-01 1.080000000000E+02 +5.277443706000E+00 -4.594148154000E-01 2.723890661000E-01 1.080000000000E+02 +5.256070633000E+00 -5.221797546000E-01 3.318667032000E-01 1.080000000000E+02 +5.233477772000E+00 -5.879016734000E-01 3.875539046000E-01 1.080000000000E+02 +5.209151434000E+00 -6.509540912000E-01 4.456338674000E-01 1.080000000000E+02 +5.184151358000E+00 -7.072647208000E-01 5.099892243000E-01 1.080000000000E+02 +5.160378133000E+00 -7.519053483000E-01 5.833000314000E-01 1.080000000000E+02 +5.141515836000E+00 -7.825090660000E-01 6.647899090000E-01 1.080000000000E+02 +5.131597478000E+00 -8.006726914000E-01 7.514880132000E-01 1.080000000000E+02 +5.132988496000E+00 -8.079610459000E-01 8.402099046000E-01 1.080000000000E+02 +5.145820695000E+00 -8.040844071000E-01 9.282726209000E-01 1.080000000000E+02 +5.168231147000E+00 -7.881034414000E-01 1.013024536000E+00 1.080000000000E+02 +5.196741130000E+00 -7.586709674000E-01 1.092107862000E+00 1.080000000000E+02 +5.232549838000E+00 -7.259273235000E-01 1.166812923000E+00 1.080000000000E+02 +5.277997406000E+00 -6.959637297000E-01 1.237341473000E+00 1.080000000000E+02 +5.333982935000E+00 -6.705703710000E-01 1.301808004000E+00 1.080000000000E+02 +5.400209274000E+00 -6.501693635000E-01 1.357785149000E+00 1.080000000000E+02 +5.475414269000E+00 -6.349449551000E-01 1.403042952000E+00 1.080000000000E+02 +5.557639668000E+00 -6.250943385000E-01 1.435958561000E+00 1.080000000000E+02 +5.644362339000E+00 -6.206306804000E-01 1.455667884000E+00 1.080000000000E+02 +5.733218021000E+00 -6.215795764000E-01 1.462072215000E+00 1.080000000000E+02 +5.821851282000E+00 -6.277100730000E-01 1.455639493000E+00 1.080000000000E+02 +5.908461565000E+00 -6.381001210000E-01 1.437348696000E+00 1.080000000000E+02 +5.991985600000E+00 -6.491772188000E-01 1.408608053000E+00 1.080000000000E+02 +6.072180961000E+00 -6.580973273000E-01 1.370749447000E+00 1.080000000000E+02 +6.148453344000E+00 -6.645657220000E-01 1.325285698000E+00 1.080000000000E+02 +6.220769209000E+00 -6.691398559000E-01 1.273441742000E+00 1.080000000000E+02 +6.288922030000E+00 -6.741525070000E-01 1.216246575000E+00 1.080000000000E+02 +6.352994173000E+00 -6.794865078000E-01 1.154539058000E+00 1.080000000000E+02 +6.413584066000E+00 -6.778977815000E-01 1.089263674000E+00 1.080000000000E+02 +6.470399851000E+00 -6.652451236000E-01 1.021917209000E+00 1.080000000000E+02 +6.522970207000E+00 -6.424151302000E-01 9.537419589000E-01 1.080000000000E+02 +6.571327496000E+00 -6.125928666000E-01 8.850071242000E-01 1.080000000000E+02 +6.615988942000E+00 -5.813000754000E-01 8.145657329000E-01 1.080000000000E+02 +6.657315824000E+00 -5.520665233000E-01 7.412825815000E-01 1.080000000000E+02 +6.695111615000E+00 -5.256470021000E-01 6.651770142000E-01 1.080000000000E+02 +6.729220387000E+00 -5.017869848000E-01 5.863142345000E-01 1.080000000000E+02 +6.759287908000E+00 -4.814857874000E-01 5.049593618000E-01 1.080000000000E+02 +6.785059992000E+00 -4.654143892000E-01 4.212413326000E-01 1.080000000000E+02 +6.806284779000E+00 -4.534665441000E-01 3.354886308000E-01 1.080000000000E+02 +6.822716328000E+00 -4.449170650000E-01 2.484589536000E-01 1.080000000000E+02 +6.834295197000E+00 -4.390314970000E-01 1.602254120000E-01 1.080000000000E+02 +6.840909591000E+00 -4.349679992000E-01 7.150080869000E-02 1.080000000000E+02 +6.842620711000E+00 -4.311918695000E-01 -1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +6.801830000E+00 1.735620000E+00 -7.060900000E-01 3.600000000E+01 +6.761520000E+00 1.757260000E+00 -8.029600000E-01 3.600000000E+01 +6.716940000E+00 1.776460000E+00 -8.983500000E-01 3.600000000E+01 +6.667410000E+00 1.792800000E+00 -9.918700000E-01 3.600000000E+01 +6.610990000E+00 1.804880000E+00 -1.082130000E+00 3.600000000E+01 +6.547810000E+00 1.812390000E+00 -1.168230000E+00 3.600000000E+01 +6.478460000E+00 1.815380000E+00 -1.249630000E+00 3.600000000E+01 +6.402620000E+00 1.813170000E+00 -1.325010000E+00 3.600000000E+01 +6.320320000E+00 1.805170000E+00 -1.392860000E+00 3.600000000E+01 +6.232080000E+00 1.790980000E+00 -1.451630000E+00 3.600000000E+01 +6.138920000E+00 1.770550000E+00 -1.500110000E+00 3.600000000E+01 +6.042220000E+00 1.744190000E+00 -1.537570000E+00 3.600000000E+01 +5.943470000E+00 1.712490000E+00 -1.563950000E+00 3.600000000E+01 +5.844010000E+00 1.676220000E+00 -1.579670000E+00 3.600000000E+01 +5.744930000E+00 1.636120000E+00 -1.585460000E+00 3.600000000E+01 +5.647060000E+00 1.592860000E+00 -1.582110000E+00 3.600000000E+01 +5.551040000E+00 1.547000000E+00 -1.570270000E+00 3.600000000E+01 +5.457440000E+00 1.498950000E+00 -1.550420000E+00 3.600000000E+01 +5.366810000E+00 1.449070000E+00 -1.522840000E+00 3.600000000E+01 +5.279770000E+00 1.397650000E+00 -1.487590000E+00 3.600000000E+01 +5.196970000E+00 1.345010000E+00 -1.444770000E+00 3.600000000E+01 +5.118730000E+00 1.291510000E+00 -1.394960000E+00 3.600000000E+01 +5.045800000E+00 1.237490000E+00 -1.338190000E+00 3.600000000E+01 +4.979260000E+00 1.183290000E+00 -1.274170000E+00 3.600000000E+01 +4.919790000E+00 1.129370000E+00 -1.203290000E+00 3.600000000E+01 +4.868370000E+00 1.076250000E+00 -1.125800000E+00 3.600000000E+01 +4.822850000E+00 1.023970000E+00 -1.044140000E+00 3.600000000E+01 +4.781070000E+00 9.723400000E-01 -9.600900000E-01 3.600000000E+01 +4.743690000E+00 9.215700000E-01 -8.735000000E-01 3.600000000E+01 +4.710220000E+00 8.716300000E-01 -7.848200000E-01 3.600000000E+01 +4.679100000E+00 8.222400000E-01 -6.949900000E-01 3.600000000E+01 +4.649080000E+00 7.731200000E-01 -6.046400000E-01 3.600000000E+01 +4.621000000E+00 7.244700000E-01 -5.134200000E-01 3.600000000E+01 +4.595640000E+00 6.765200000E-01 -4.210300000E-01 3.600000000E+01 +4.574730000E+00 6.298000000E-01 -3.269400000E-01 3.600000000E+01 +4.559910000E+00 5.848600000E-01 -2.308300000E-01 3.600000000E+01 +4.544000000E+00 5.395900000E-01 -1.350400000E-01 3.600000000E+01 +4.526890000E+00 4.939600000E-01 -3.963000000E-02 3.600000000E+01 +4.511860000E+00 4.489700000E-01 5.642000000E-02 3.600000000E+01 +4.500750000E+00 4.052100000E-01 1.535700000E-01 3.600000000E+01 +4.492450000E+00 3.623700000E-01 2.514000000E-01 3.600000000E+01 +4.484200000E+00 3.195600000E-01 3.492500000E-01 3.600000000E+01 +4.480760000E+00 2.784100000E-01 4.480900000E-01 3.600000000E+01 +4.482520000E+00 2.391500000E-01 5.477400000E-01 3.600000000E+01 +4.488460000E+00 2.015000000E-01 6.478600000E-01 3.600000000E+01 +4.495990000E+00 1.644800000E-01 7.481100000E-01 3.600000000E+01 +4.506870000E+00 1.288300000E-01 8.485000000E-01 3.600000000E+01 +4.524340000E+00 9.599000000E-02 9.489300000E-01 3.600000000E+01 +4.548620000E+00 6.626000000E-02 1.048900000E+00 3.600000000E+01 +4.579990000E+00 3.996000000E-02 1.147850000E+00 3.600000000E+01 +4.618800000E+00 1.754000000E-02 1.245100000E+00 3.600000000E+01 +4.665500000E+00 -4.700000000E-04 1.339760000E+00 3.600000000E+01 +4.720780000E+00 -1.325000000E-02 1.430550000E+00 3.600000000E+01 +4.784880000E+00 -2.011000000E-02 1.516010000E+00 3.600000000E+01 +4.857490000E+00 -2.058000000E-02 1.594630000E+00 3.600000000E+01 +4.937950000E+00 -1.433000000E-02 1.664860000E+00 3.600000000E+01 +5.025210000E+00 -1.200000000E-03 1.725230000E+00 3.600000000E+01 +5.117810000E+00 1.858000000E-02 1.774710000E+00 3.600000000E+01 +5.214010000E+00 4.416000000E-02 1.813600000E+00 3.600000000E+01 +5.312380000E+00 7.448000000E-02 1.843010000E+00 3.600000000E+01 +5.411920000E+00 1.102500000E-01 1.860050000E+00 3.600000000E+01 +5.511070000E+00 1.494700000E-01 1.868120000E+00 3.600000000E+01 +5.609720000E+00 1.909200000E-01 1.870100000E+00 3.600000000E+01 +5.706450000E+00 2.360400000E-01 1.860860000E+00 3.600000000E+01 +5.801340000E+00 2.828300000E-01 1.845540000E+00 3.600000000E+01 +5.894050000E+00 3.315600000E-01 1.823030000E+00 3.600000000E+01 +5.983670000E+00 3.818500000E-01 1.793360000E+00 3.600000000E+01 +6.071410000E+00 4.330700000E-01 1.759350000E+00 3.600000000E+01 +6.154430000E+00 4.855700000E-01 1.717120000E+00 3.600000000E+01 +6.235080000E+00 5.387200000E-01 1.670760000E+00 3.600000000E+01 +6.310170000E+00 5.924500000E-01 1.617000000E+00 3.600000000E+01 +6.381340000E+00 6.466100000E-01 1.558010000E+00 3.600000000E+01 +6.449270000E+00 7.007600000E-01 1.495580000E+00 3.600000000E+01 +6.512260000E+00 7.549000000E-01 1.427910000E+00 3.600000000E+01 +6.573550000E+00 8.088900000E-01 1.358800000E+00 3.600000000E+01 +6.624540000E+00 8.619800000E-01 1.280960000E+00 3.600000000E+01 +6.675540000E+00 9.150600000E-01 1.203110000E+00 3.600000000E+01 +6.718480000E+00 9.668700000E-01 1.119870000E+00 3.600000000E+01 +6.759730000E+00 1.018410000E+00 1.035480000E+00 3.600000000E+01 +6.796850000E+00 1.069090000E+00 9.488300000E-01 3.600000000E+01 +6.829890000E+00 1.118930000E+00 8.599400000E-01 3.600000000E+01 +6.860480000E+00 1.168140000E+00 7.699800000E-01 3.600000000E+01 +6.881660000E+00 1.214950000E+00 6.759700000E-01 3.600000000E+01 +6.902840000E+00 1.261760000E+00 5.819600000E-01 3.600000000E+01 +6.916680000E+00 1.306390000E+00 4.855600000E-01 3.600000000E+01 +6.930350000E+00 1.350970000E+00 3.891000000E-01 3.600000000E+01 +6.938020000E+00 1.393580000E+00 2.911500000E-01 3.600000000E+01 +6.944440000E+00 1.435780000E+00 1.928800000E-01 3.600000000E+01 +6.944200000E+00 1.475580000E+00 9.349000000E-02 3.600000000E+01 +6.941950000E+00 1.514660000E+00 -6.240000000E-03 3.600000000E+01 +6.933110000E+00 1.551130000E+00 -1.065300000E-01 3.600000000E+01 +6.922810000E+00 1.587040000E+00 -2.069400000E-01 3.600000000E+01 +6.905650000E+00 1.620020000E+00 -3.074100000E-01 3.600000000E+01 +6.886710000E+00 1.652210000E+00 -4.077700000E-01 3.600000000E+01 +6.862220000E+00 1.681860000E+00 -5.077700000E-01 3.600000000E+01 +6.833610000E+00 1.709510000E+00 -6.071600000E-01 3.600000000E+01 +6.801830000E+00 1.735620000E+00 -7.060900000E-01 0.000000000E+00 6 AAE14_SC +6.116000000E+00 3.293690000E+00 -7.213900000E-01 3.600000000E+01 +6.101630000E+00 3.238430000E+00 -8.084600000E-01 3.600000000E+01 +6.081860000E+00 3.180020000E+00 -8.923100000E-01 3.600000000E+01 +6.056920000E+00 3.118800000E+00 -9.726500000E-01 3.600000000E+01 +6.026950000E+00 3.055050000E+00 -1.049200000E+00 3.600000000E+01 +5.991470000E+00 2.988780000E+00 -1.121050000E+00 3.600000000E+01 +5.948340000E+00 2.919430000E+00 -1.185540000E+00 3.600000000E+01 +5.897530000E+00 2.847650000E+00 -1.241260000E+00 3.600000000E+01 +5.841160000E+00 2.774650000E+00 -1.289570000E+00 3.600000000E+01 +5.779360000E+00 2.700990000E+00 -1.329530000E+00 3.600000000E+01 +5.712410000E+00 2.627390000E+00 -1.360190000E+00 3.600000000E+01 +5.640830000E+00 2.554690000E+00 -1.380740000E+00 3.600000000E+01 +5.565260000E+00 2.483880000E+00 -1.390330000E+00 3.600000000E+01 +5.486250000E+00 2.416340000E+00 -1.387100000E+00 3.600000000E+01 +5.405390000E+00 2.352280000E+00 -1.373500000E+00 3.600000000E+01 +5.323720000E+00 2.291750000E+00 -1.351240000E+00 3.600000000E+01 +5.241880000E+00 2.235050000E+00 -1.320860000E+00 3.600000000E+01 +5.160350000E+00 2.181610000E+00 -1.284380000E+00 3.600000000E+01 +5.079370000E+00 2.131280000E+00 -1.242550000E+00 3.600000000E+01 +4.999030000E+00 2.083440000E+00 -1.196770000E+00 3.600000000E+01 +4.919080000E+00 2.036960000E+00 -1.148930000E+00 3.600000000E+01 +4.839310000E+00 1.991070000E+00 -1.100210000E+00 3.600000000E+01 +4.759920000E+00 1.946280000E+00 -1.049910000E+00 3.600000000E+01 +4.680990000E+00 1.902810000E+00 -9.977300000E-01 3.600000000E+01 +4.602430000E+00 1.860330000E+00 -9.442200000E-01 3.600000000E+01 +4.524170000E+00 1.818630000E+00 -8.896400000E-01 3.600000000E+01 +4.446210000E+00 1.777650000E+00 -8.341100000E-01 3.600000000E+01 +4.368620000E+00 1.737600000E+00 -7.773900000E-01 3.600000000E+01 +4.291350000E+00 1.698270000E+00 -7.197400000E-01 3.600000000E+01 +4.214320000E+00 1.659490000E+00 -6.614000000E-01 3.600000000E+01 +4.138100000E+00 1.622470000E+00 -6.009100000E-01 3.600000000E+01 +4.062920000E+00 1.587610000E+00 -5.378800000E-01 3.600000000E+01 +3.989120000E+00 1.555400000E+00 -4.719100000E-01 3.600000000E+01 +3.917080000E+00 1.526350000E+00 -4.026100000E-01 3.600000000E+01 +3.847280000E+00 1.501060000E+00 -3.296700000E-01 3.600000000E+01 +3.780290000E+00 1.480130000E+00 -2.528300000E-01 3.600000000E+01 +3.716730000E+00 1.464160000E+00 -1.720200000E-01 3.600000000E+01 +3.657330000E+00 1.453750000E+00 -8.727000000E-02 3.600000000E+01 +3.602640000E+00 1.449250000E+00 1.130000000E-03 3.600000000E+01 +3.554260000E+00 1.452120000E+00 9.328000000E-02 3.600000000E+01 +3.513150000E+00 1.462710000E+00 1.882300000E-01 3.600000000E+01 +3.477430000E+00 1.478660000E+00 2.844900000E-01 3.600000000E+01 +3.447600000E+00 1.500310000E+00 3.818700000E-01 3.600000000E+01 +3.428300000E+00 1.531130000E+00 4.791500000E-01 3.600000000E+01 +3.411950000E+00 1.564520000E+00 5.764100000E-01 3.600000000E+01 +3.405660000E+00 1.605700000E+00 6.716100000E-01 3.600000000E+01 +3.401910000E+00 1.648850000E+00 7.663000000E-01 3.600000000E+01 +3.405270000E+00 1.696820000E+00 8.581300000E-01 3.600000000E+01 +3.417070000E+00 1.750500000E+00 9.465600000E-01 3.600000000E+01 +3.428860000E+00 1.804180000E+00 1.034990000E+00 3.600000000E+01 +3.452470000E+00 1.864640000E+00 1.116160000E+00 3.600000000E+01 +3.478130000E+00 1.926260000E+00 1.196060000E+00 3.600000000E+01 +3.509620000E+00 1.990550000E+00 1.270980000E+00 3.600000000E+01 +3.550400000E+00 2.059060000E+00 1.337940000E+00 3.600000000E+01 +3.594200000E+00 2.128510000E+00 1.401440000E+00 3.600000000E+01 +3.647190000E+00 2.200830000E+00 1.454390000E+00 3.600000000E+01 +3.704730000E+00 2.273670000E+00 1.500280000E+00 3.600000000E+01 +3.769930000E+00 2.347380000E+00 1.534290000E+00 3.600000000E+01 +3.839880000E+00 2.420370000E+00 1.558340000E+00 3.600000000E+01 +3.912400000E+00 2.492670000E+00 1.576410000E+00 3.600000000E+01 +3.988490000E+00 2.563270000E+00 1.584630000E+00 3.600000000E+01 +4.066710000E+00 2.631790000E+00 1.584800000E+00 3.600000000E+01 +4.146250000E+00 2.698580000E+00 1.579120000E+00 3.600000000E+01 +4.226970000E+00 2.763200000E+00 1.566880000E+00 3.600000000E+01 +4.308490000E+00 2.824870000E+00 1.547210000E+00 3.600000000E+01 +4.390240000E+00 2.884530000E+00 1.523040000E+00 3.600000000E+01 +4.472100000E+00 2.942150000E+00 1.494500000E+00 3.600000000E+01 +4.553870000E+00 2.997460000E+00 1.461420000E+00 3.600000000E+01 +4.635310000E+00 3.050180000E+00 1.423650000E+00 3.600000000E+01 +4.716370000E+00 3.100980000E+00 1.382610000E+00 3.600000000E+01 +4.796980000E+00 3.149830000E+00 1.338430000E+00 3.600000000E+01 +4.877040000E+00 3.196710000E+00 1.291210000E+00 3.600000000E+01 +4.956430000E+00 3.241470000E+00 1.240850000E+00 3.600000000E+01 +5.034970000E+00 3.283910000E+00 1.187270000E+00 3.600000000E+01 +5.112690000E+00 3.324300000E+00 1.131000000E+00 3.600000000E+01 +5.189470000E+00 3.362550000E+00 1.072020000E+00 3.600000000E+01 +5.265190000E+00 3.398530000E+00 1.010300000E+00 3.600000000E+01 +5.339680000E+00 3.432050000E+00 9.457800000E-01 3.600000000E+01 +5.412760000E+00 3.462940000E+00 8.783800000E-01 3.600000000E+01 +5.484200000E+00 3.490940000E+00 8.080400000E-01 3.600000000E+01 +5.553750000E+00 3.515810000E+00 7.346800000E-01 3.600000000E+01 +5.621080000E+00 3.537230000E+00 6.582400000E-01 3.600000000E+01 +5.685880000E+00 3.554930000E+00 5.787300000E-01 3.600000000E+01 +5.747770000E+00 3.568580000E+00 4.961700000E-01 3.600000000E+01 +5.806370000E+00 3.577930000E+00 4.106700000E-01 3.600000000E+01 +5.861320000E+00 3.582720000E+00 3.224100000E-01 3.600000000E+01 +5.912160000E+00 3.582670000E+00 2.316100000E-01 3.600000000E+01 +5.958130000E+00 3.577200000E+00 1.384300000E-01 3.600000000E+01 +5.998740000E+00 3.566060000E+00 4.327000000E-02 3.600000000E+01 +6.033840000E+00 3.549430000E+00 -5.326000000E-02 3.600000000E+01 +6.063250000E+00 3.527420000E+00 -1.506200000E-01 3.600000000E+01 +6.086880000E+00 3.500230000E+00 -2.482300000E-01 3.600000000E+01 +6.104780000E+00 3.468150000E+00 -3.455700000E-01 3.600000000E+01 +6.117060000E+00 3.431530000E+00 -4.421800000E-01 3.600000000E+01 +6.123670000E+00 3.390540000E+00 -5.375700000E-01 3.600000000E+01 +6.123840000E+00 3.344850000E+00 -6.310500000E-01 3.600000000E+01 +6.116000000E+00 3.293690000E+00 -7.213900000E-01 0.000000000E+00 7 AAE23_SC +5.022430000E+00 4.798860000E+00 7.213900000E-01 3.600000000E+01 +5.073520000E+00 4.790510000E+00 6.310500000E-01 3.600000000E+01 +5.116910000E+00 4.776220000E+00 5.375700000E-01 3.600000000E+01 +5.153860000E+00 4.757270000E+00 4.421800000E-01 3.600000000E+01 +5.184890000E+00 4.734270000E+00 3.455700000E-01 3.600000000E+01 +5.209870000E+00 4.707340000E+00 2.482300000E-01 3.600000000E+01 +5.228420000E+00 4.676460000E+00 1.506200000E-01 3.600000000E+01 +5.240270000E+00 4.641690000E+00 5.326000000E-02 3.600000000E+01 +5.245240000E+00 4.603160000E+00 -4.327000000E-02 3.600000000E+01 +5.243280000E+00 4.561110000E+00 -1.384300000E-01 3.600000000E+01 +5.234280000E+00 4.515690000E+00 -2.316100000E-01 3.600000000E+01 +5.218620000E+00 4.467320000E+00 -3.224100000E-01 3.600000000E+01 +5.197080000E+00 4.416550000E+00 -4.106700000E-01 3.600000000E+01 +5.170080000E+00 4.363700000E+00 -4.961600000E-01 3.600000000E+01 +5.137970000E+00 4.309060000E+00 -5.787300000E-01 3.600000000E+01 +5.101120000E+00 4.252900000E+00 -6.582400000E-01 3.600000000E+01 +5.059930000E+00 4.195480000E+00 -7.346800000E-01 3.600000000E+01 +5.014800000E+00 4.137030000E+00 -8.080400000E-01 3.600000000E+01 +4.966090000E+00 4.077740000E+00 -8.783800000E-01 3.600000000E+01 +4.914130000E+00 4.017780000E+00 -9.457800000E-01 3.600000000E+01 +4.859220000E+00 3.957290000E+00 -1.010300000E+00 3.600000000E+01 +4.801610000E+00 3.896400000E+00 -1.072020000E+00 3.600000000E+01 +4.741510000E+00 3.835190000E+00 -1.131000000E+00 3.600000000E+01 +4.679070000E+00 3.773760000E+00 -1.187270000E+00 3.600000000E+01 +4.614440000E+00 3.712180000E+00 -1.240850000E+00 3.600000000E+01 +4.547340000E+00 3.650510000E+00 -1.291210000E+00 3.600000000E+01 +4.478010000E+00 3.588850000E+00 -1.338430000E+00 3.600000000E+01 +4.406640000E+00 3.527280000E+00 -1.382610000E+00 3.600000000E+01 +4.333290000E+00 3.465880000E+00 -1.423650000E+00 3.600000000E+01 +4.257970000E+00 3.404720000E+00 -1.461420000E+00 3.600000000E+01 +4.180100000E+00 3.344040000E+00 -1.494500000E+00 3.600000000E+01 +4.100010000E+00 3.284000000E+00 -1.523040000E+00 3.600000000E+01 +4.018000000E+00 3.224690000E+00 -1.547210000E+00 3.600000000E+01 +3.934160000E+00 3.166220000E+00 -1.566880000E+00 3.600000000E+01 +3.847760000E+00 3.109410000E+00 -1.579120000E+00 3.600000000E+01 +3.759660000E+00 3.054410000E+00 -1.584800000E+00 3.600000000E+01 +3.670320000E+00 3.001180000E+00 -1.584630000E+00 3.600000000E+01 +3.579670000E+00 2.950630000E+00 -1.576410000E+00 3.600000000E+01 +3.488500000E+00 2.904010000E+00 -1.558340000E+00 3.600000000E+01 +3.397470000E+00 2.860030000E+00 -1.534290000E+00 3.600000000E+01 +3.307210000E+00 2.820800000E+00 -1.500280000E+00 3.600000000E+01 +3.220160000E+00 2.788590000E+00 -1.454390000E+00 3.600000000E+01 +3.135010000E+00 2.760540000E+00 -1.401440000E+00 3.600000000E+01 +3.055420000E+00 2.740350000E+00 -1.337940000E+00 3.600000000E+01 +2.977660000E+00 2.722740000E+00 -1.270980000E+00 3.600000000E+01 +2.906790000E+00 2.712650000E+00 -1.196060000E+00 3.600000000E+01 +2.840250000E+00 2.707290000E+00 -1.116160000E+00 3.600000000E+01 +2.775460000E+00 2.703520000E+00 -1.034990000E+00 3.600000000E+01 +2.720760000E+00 2.708890000E+00 -9.465600000E-01 3.600000000E+01 +2.666050000E+00 2.714260000E+00 -8.581200000E-01 3.600000000E+01 +2.619400000E+00 2.725890000E+00 -7.663000000E-01 3.600000000E+01 +2.579520000E+00 2.742780000E+00 -6.716100000E-01 3.600000000E+01 +2.542300000E+00 2.761500000E+00 -5.764100000E-01 3.600000000E+01 +2.515590000E+00 2.787360000E+00 -4.791500000E-01 3.600000000E+01 +2.492250000E+00 2.815240000E+00 -3.818700000E-01 3.600000000E+01 +2.480870000E+00 2.850300000E+00 -2.844900000E-01 3.600000000E+01 +2.476740000E+00 2.889200000E+00 -1.882300000E-01 3.600000000E+01 +2.479370000E+00 2.931570000E+00 -9.328000000E-02 3.600000000E+01 +2.491590000E+00 2.978470000E+00 -1.130000000E-03 3.600000000E+01 +2.512780000E+00 3.029100000E+00 8.727000000E-02 3.600000000E+01 +2.541030000E+00 3.082380000E+00 1.720200000E-01 3.600000000E+01 +2.575860000E+00 3.137890000E+00 2.528300000E-01 3.600000000E+01 +2.616470000E+00 3.195130000E+00 3.296700000E-01 3.600000000E+01 +2.662090000E+00 3.253690000E+00 4.026200000E-01 3.600000000E+01 +2.711970000E+00 3.313230000E+00 4.719100000E-01 3.600000000E+01 +2.765420000E+00 3.373470000E+00 5.378800000E-01 3.600000000E+01 +2.821800000E+00 3.434190000E+00 6.009100000E-01 3.600000000E+01 +2.880560000E+00 3.495250000E+00 6.614000000E-01 3.600000000E+01 +2.941250000E+00 3.556530000E+00 7.197400000E-01 3.600000000E+01 +3.002530000E+00 3.617860000E+00 7.773900000E-01 3.600000000E+01 +3.064600000E+00 3.679270000E+00 8.341100000E-01 3.600000000E+01 +3.127670000E+00 3.740760000E+00 8.896400000E-01 3.600000000E+01 +3.191510000E+00 3.802290000E+00 9.442200000E-01 3.600000000E+01 +3.256190000E+00 3.863880000E+00 9.977300000E-01 3.600000000E+01 +3.321920000E+00 3.925520000E+00 1.049910000E+00 3.600000000E+01 +3.389060000E+00 3.987190000E+00 1.100210000E+00 3.600000000E+01 +3.457340000E+00 4.048870000E+00 1.148930000E+00 3.600000000E+01 +3.526260000E+00 4.110540000E+00 1.196770000E+00 3.600000000E+01 +3.596580000E+00 4.172170000E+00 1.242550000E+00 3.600000000E+01 +3.669470000E+00 4.233630000E+00 1.284380000E+00 3.600000000E+01 +3.745490000E+00 4.294660000E+00 1.320860000E+00 3.600000000E+01 +3.824700000E+00 4.354970000E+00 1.351240000E+00 3.600000000E+01 +3.907510000E+00 4.413940000E+00 1.373500000E+00 3.600000000E+01 +3.993420000E+00 4.471040000E+00 1.387100000E+00 3.600000000E+01 +4.082070000E+00 4.525320000E+00 1.390330000E+00 3.600000000E+01 +4.172770000E+00 4.575300000E+00 1.380740000E+00 3.600000000E+01 +4.264030000E+00 4.620920000E+00 1.360180000E+00 3.600000000E+01 +4.354710000E+00 4.661840000E+00 1.329530000E+00 3.600000000E+01 +4.443860000E+00 4.697860000E+00 1.289570000E+00 3.600000000E+01 +4.530710000E+00 4.728910000E+00 1.241260000E+00 3.600000000E+01 +4.614680000E+00 4.755060000E+00 1.185540000E+00 3.600000000E+01 +4.693960000E+00 4.774640000E+00 1.121050000E+00 3.600000000E+01 +4.767950000E+00 4.787910000E+00 1.049200000E+00 3.600000000E+01 +4.837850000E+00 4.796710000E+00 9.726500000E-01 3.600000000E+01 +4.903780000E+00 4.801520000E+00 8.923100000E-01 3.600000000E+01 +4.965440000E+00 4.802270000E+00 8.084600000E-01 3.600000000E+01 +5.022430000E+00 4.798860000E+00 7.213900000E-01 0.000000000E+00 7 AAE23_SC +3.752560000E+00 5.932580000E+00 7.060900000E-01 3.600000000E+01 +3.737550000E+00 5.970880000E+00 6.071600000E-01 3.600000000E+01 +3.720090000E+00 6.006630000E+00 5.077700000E-01 3.600000000E+01 +3.699450000E+00 6.039090000E+00 4.077700000E-01 3.600000000E+01 +3.674690000E+00 6.067050000E+00 3.074100000E-01 3.600000000E+01 +3.648630000E+00 6.093560000E+00 2.069400000E-01 3.600000000E+01 +3.617670000E+00 6.114450000E+00 1.065300000E-01 3.600000000E+01 +3.585710000E+00 6.134140000E+00 6.240000000E-03 3.600000000E+01 +3.549240000E+00 6.148350000E+00 -9.349000000E-02 3.600000000E+01 +3.511460000E+00 6.160870000E+00 -1.928800000E-01 3.600000000E+01 +3.469340000E+00 6.167810000E+00 -2.911500000E-01 3.600000000E+01 +3.426440000E+00 6.173680000E+00 -3.891000000E-01 3.600000000E+01 +3.379830000E+00 6.174460000E+00 -4.855600000E-01 3.600000000E+01 +3.333100000E+00 6.175080000E+00 -5.819600000E-01 3.600000000E+01 +3.282040000E+00 6.169400000E+00 -6.759700000E-01 3.600000000E+01 +3.230970000E+00 6.163730000E+00 -7.699800000E-01 3.600000000E+01 +3.174720000E+00 6.149850000E+00 -8.599400000E-01 3.600000000E+01 +3.117110000E+00 6.133820000E+00 -9.488300000E-01 3.600000000E+01 +3.057430000E+00 6.114180000E+00 -1.035480000E+00 3.600000000E+01 +2.995670000E+00 6.090880000E+00 -1.119870000E+00 3.600000000E+01 +2.933130000E+00 6.066050000E+00 -1.203110000E+00 3.600000000E+01 +2.866880000E+00 6.033950000E+00 -1.280960000E+00 3.600000000E+01 +2.800640000E+00 6.001860000E+00 -1.358800000E+00 3.600000000E+01 +2.730350000E+00 5.960250000E+00 -1.427910000E+00 3.600000000E+01 +2.659400000E+00 5.917070000E+00 -1.495580000E+00 3.600000000E+01 +2.586910000E+00 5.869200000E+00 -1.558010000E+00 3.600000000E+01 +2.513410000E+00 5.818250000E+00 -1.617000000E+00 3.600000000E+01 +2.439090000E+00 5.763440000E+00 -1.670760000E+00 3.600000000E+01 +2.363630000E+00 5.703160000E+00 -1.717120000E+00 3.600000000E+01 +2.288040000E+00 5.640430000E+00 -1.759350000E+00 3.600000000E+01 +2.212210000E+00 5.572810000E+00 -1.793360000E+00 3.600000000E+01 +2.136700000E+00 5.503120000E+00 -1.823030000E+00 3.600000000E+01 +2.061700000E+00 5.430000000E+00 -1.845540000E+00 3.600000000E+01 +1.987880000E+00 5.354210000E+00 -1.860860000E+00 3.600000000E+01 +1.915070000E+00 5.276170000E+00 -1.870100000E+00 3.600000000E+01 +1.845170000E+00 5.195150000E+00 -1.868120000E+00 3.600000000E+01 +1.777230000E+00 5.112970000E+00 -1.860050000E+00 3.600000000E+01 +1.712450000E+00 5.029360000E+00 -1.843010000E+00 3.600000000E+01 +1.653220000E+00 4.945170000E+00 -1.813600000E+00 3.600000000E+01 +1.599160000E+00 4.861580000E+00 -1.774710000E+00 3.600000000E+01 +1.551730000E+00 4.779630000E+00 -1.725230000E+00 3.600000000E+01 +1.512280000E+00 4.700700000E+00 -1.664860000E+00 3.600000000E+01 +1.481470000E+00 4.626110000E+00 -1.594630000E+00 3.600000000E+01 +1.459480000E+00 4.556910000E+00 -1.516010000E+00 3.600000000E+01 +1.446200000E+00 4.493820000E+00 -1.430550000E+00 3.600000000E+01 +1.441270000E+00 4.437300000E+00 -1.339760000E+00 3.600000000E+01 +1.443970000E+00 4.387320000E+00 -1.245100000E+00 3.600000000E+01 +1.453300000E+00 4.343480000E+00 -1.147850000E+00 3.600000000E+01 +1.468610000E+00 4.305520000E+00 -1.048900000E+00 3.600000000E+01 +1.489390000E+00 4.273240000E+00 -9.489300000E-01 3.600000000E+01 +1.515230000E+00 4.246480000E+00 -8.485000000E-01 3.600000000E+01 +1.545770000E+00 4.225120000E+00 -7.481100000E-01 3.600000000E+01 +1.578650000E+00 4.206510000E+00 -6.478600000E-01 3.600000000E+01 +1.612620000E+00 4.189230000E+00 -5.477400000E-01 3.600000000E+01 +1.649410000E+00 4.175430000E+00 -4.480900000E-01 3.600000000E+01 +1.689610000E+00 4.165980000E+00 -3.492500000E-01 3.600000000E+01 +1.732880000E+00 4.160590000E+00 -2.514000000E-01 3.600000000E+01 +1.776190000E+00 4.155260000E+00 -1.535700000E-01 3.600000000E+01 +1.821230000E+00 4.152300000E+00 -5.642000000E-02 3.600000000E+01 +1.868670000E+00 4.152680000E+00 3.963000000E-02 3.600000000E+01 +1.917360000E+00 4.154860000E+00 1.350400000E-01 3.600000000E+01 +1.965320000E+00 4.156000000E+00 2.308300000E-01 3.600000000E+01 +2.012640000E+00 4.156210000E+00 3.269400000E-01 3.600000000E+01 +2.063540000E+00 4.161660000E+00 4.210300000E-01 3.600000000E+01 +2.116980000E+00 4.170950000E+00 5.134100000E-01 3.600000000E+01 +2.171920000E+00 4.182630000E+00 6.046400000E-01 3.600000000E+01 +2.227920000E+00 4.196000000E+00 6.949900000E-01 3.600000000E+01 +2.284510000E+00 4.210340000E+00 7.848200000E-01 3.600000000E+01 +2.342340000E+00 4.226730000E+00 8.735000000E-01 3.600000000E+01 +2.402180000E+00 4.246600000E+00 9.600900000E-01 3.600000000E+01 +2.464190000E+00 4.270380000E+00 1.044140000E+00 3.600000000E+01 +2.527980000E+00 4.297520000E+00 1.125800000E+00 3.600000000E+01 +2.594400000E+00 4.330000000E+00 1.203290000E+00 3.600000000E+01 +2.664060000E+00 4.369900000E+00 1.274170000E+00 3.600000000E+01 +2.736160000E+00 4.416430000E+00 1.338190000E+00 3.600000000E+01 +2.810070000E+00 4.469100000E+00 1.394960000E+00 3.600000000E+01 +2.885130000E+00 4.526990000E+00 1.444770000E+00 3.600000000E+01 +2.960780000E+00 4.589460000E+00 1.487590000E+00 3.600000000E+01 +3.036580000E+00 4.656350000E+00 1.522840000E+00 3.600000000E+01 +3.112030000E+00 4.727130000E+00 1.550420000E+00 3.600000000E+01 +3.186650000E+00 4.801300000E+00 1.570270000E+00 3.600000000E+01 +3.259940000E+00 4.878450000E+00 1.582110000E+00 3.600000000E+01 +3.331320000E+00 4.958160000E+00 1.585460000E+00 3.600000000E+01 +3.400080000E+00 5.040000000E+00 1.579670000E+00 3.600000000E+01 +3.465310000E+00 5.123390000E+00 1.563950000E+00 3.600000000E+01 +3.525970000E+00 5.207510000E+00 1.537570000E+00 3.600000000E+01 +3.580930000E+00 5.291330000E+00 1.500110000E+00 3.600000000E+01 +3.629140000E+00 5.373620000E+00 1.451630000E+00 3.600000000E+01 +3.669900000E+00 5.453160000E+00 1.392860000E+00 3.600000000E+01 +3.702950000E+00 5.528950000E+00 1.325020000E+00 3.600000000E+01 +3.728480000E+00 5.600400000E+00 1.249630000E+00 3.600000000E+01 +3.747070000E+00 5.667270000E+00 1.168230000E+00 3.600000000E+01 +3.759450000E+00 5.729680000E+00 1.082140000E+00 3.600000000E+01 +3.765400000E+00 5.787080000E+00 9.918700000E-01 3.600000000E+01 +3.765160000E+00 5.839230000E+00 8.983500000E-01 3.600000000E+01 +3.760670000E+00 5.887560000E+00 8.029600000E-01 3.600000000E+01 +3.752560000E+00 5.932580000E+00 7.060900000E-01 0.000000000E+00 6 AAE14_SC +1.704398248500E+00 6.640964631245E+00 1.744954334000E-02 1.080000000000E+02 +1.700278170583E+00 6.640504147669E+00 -7.150080869000E-02 1.080000000000E+02 +1.694369594367E+00 6.635469175030E+00 -1.602254120000E-01 1.080000000000E+02 +1.685194019272E+00 6.626275756750E+00 -2.484589536000E-01 1.080000000000E+02 +1.671985353578E+00 6.613290359336E+00 -3.354886308000E-01 1.080000000000E+02 +1.654063457755E+00 6.596796474535E+00 -4.212413326000E-01 1.080000000000E+02 +1.630814637835E+00 6.577252101275E+00 -5.049593618000E-01 1.080000000000E+02 +1.602215676791E+00 6.554929604502E+00 -5.863142345000E-01 1.080000000000E+02 +1.568983261654E+00 6.529863385460E+00 -6.651770142000E-01 1.080000000000E+02 +1.532177262124E+00 6.502081533175E+00 -7.412825815000E-01 1.080000000000E+02 +1.491603793043E+00 6.471810997156E+00 -8.145657329000E-01 1.080000000000E+02 +1.448041434252E+00 6.439005442193E+00 -8.850071242000E-01 1.080000000000E+02 +1.404735552021E+00 6.402230513642E+00 -9.537419589000E-01 1.080000000000E+02 +1.366777804627E+00 6.359287989946E+00 -1.021917209000E+00 1.080000000000E+02 +1.337187368769E+00 6.309162853709E+00 -1.089263674000E+00 1.080000000000E+02 +1.316953093644E+00 6.252029384575E+00 -1.154539058000E+00 1.080000000000E+02 +1.302226648810E+00 6.189444858567E+00 -1.216246575000E+00 1.080000000000E+02 +1.285933583399E+00 6.123078679674E+00 -1.273441742000E+00 1.080000000000E+02 +1.267937012003E+00 6.052888719925E+00 -1.325285698000E+00 1.080000000000E+02 +1.250519358384E+00 5.978350529171E+00 -1.370749447000E+00 1.080000000000E+02 +1.234221156280E+00 5.899323743397E+00 -1.408608053000E+00 1.080000000000E+02 +1.218945756070E+00 5.816464654174E+00 -1.437348696000E+00 1.080000000000E+02 +1.202063229591E+00 5.730882678745E+00 -1.455639493000E+00 1.080000000000E+02 +1.180504494415E+00 5.644693010677E+00 -1.462072215000E+00 1.080000000000E+02 +1.153949032354E+00 5.559893010311E+00 -1.455667884000E+00 1.080000000000E+02 +1.122905062095E+00 5.478794195156E+00 -1.435958561000E+00 1.080000000000E+02 +1.088127523327E+00 5.403637201566E+00 -1.403042952000E+00 1.080000000000E+02 +1.050408628995E+00 5.336817601939E+00 -1.357785149000E+00 1.080000000000E+02 +1.010541053647E+00 5.280136868702E+00 -1.301808004000E+00 1.080000000000E+02 +9.690900544846E-01 5.234738445911E+00 -1.237341473000E+00 1.080000000000E+02 +9.265489124845E-01 5.200774499912E+00 -1.166812923000E+00 1.080000000000E+02 +8.843423572676E-01 5.176836737251E+00 -1.092107862000E+00 1.080000000000E+02 +8.475403418228E-01 5.158817266792E+00 -1.013024536000E+00 1.080000000000E+02 +8.254163297375E-01 5.142442050372E+00 -9.282726209000E-01 1.080000000000E+02 +8.177640595793E-01 5.131435851165E+00 -8.402099046000E-01 1.080000000000E+02 +8.242658484181E-01 5.127860689030E+00 -7.514880132000E-01 1.080000000000E+02 +8.446054238926E-01 5.131680739109E+00 -6.647899090000E-01 1.080000000000E+02 +8.795400593600E-01 5.140162780723E+00 -5.833000314000E-01 1.080000000000E+02 +9.293421495714E-01 5.148977748735E+00 -5.099892243000E-01 1.080000000000E+02 +9.906221891339E-01 5.155353292413E+00 -4.456338674000E-01 1.080000000000E+02 +1.058105853804E+00 5.159004746049E+00 -3.875539046000E-01 1.080000000000E+02 +1.127592690942E+00 5.160182643912E+00 -3.318667032000E-01 1.080000000000E+02 +1.193890338142E+00 5.161114211398E+00 -2.723890661000E-01 1.080000000000E+02 +1.260199579131E+00 5.157089949660E+00 -2.130101728000E-01 1.080000000000E+02 +1.322210318504E+00 5.149937816024E+00 -1.494783330000E-01 1.080000000000E+02 +1.382447878845E+00 5.136209051622E+00 -8.530081591000E-02 1.080000000000E+02 +1.436645988281E+00 5.113881443835E+00 -1.819661694000E-02 1.080000000000E+02 +1.487456112885E+00 5.080987865533E+00 4.718627597000E-02 1.080000000000E+02 +1.536677584149E+00 5.041448419176E+00 1.100117670000E-01 1.080000000000E+02 +1.590750143720E+00 5.001906728233E+00 1.687606404000E-01 1.080000000000E+02 +1.645158445285E+00 4.962921048430E+00 2.275175217000E-01 1.080000000000E+02 +1.696711977928E+00 4.923165231547E+00 2.882948801000E-01 1.080000000000E+02 +1.739106752881E+00 4.880528677107E+00 3.540587787000E-01 1.080000000000E+02 +1.766074153490E+00 4.835562068551E+00 4.260584823000E-01 1.080000000000E+02 +1.775296876348E+00 4.792114309780E+00 5.032871173000E-01 1.080000000000E+02 +1.768777981575E+00 4.754515708522E+00 5.837632627000E-01 1.080000000000E+02 +1.750099489422E+00 4.725009566652E+00 6.657541041000E-01 1.080000000000E+02 +1.721933408126E+00 4.704060990124E+00 7.475896770000E-01 1.080000000000E+02 +1.684555227442E+00 4.691236470507E+00 8.274301477000E-01 1.080000000000E+02 +1.641189161307E+00 4.685472931231E+00 9.050198505000E-01 1.080000000000E+02 +1.599914044749E+00 4.686799614178E+00 9.840199882000E-01 1.080000000000E+02 +1.567532928869E+00 4.697697663795E+00 1.066259509000E+00 1.080000000000E+02 +1.544783990752E+00 4.721026291592E+00 1.149164457000E+00 1.080000000000E+02 +1.530274638025E+00 4.758279865867E+00 1.228771473000E+00 1.080000000000E+02 +1.523157398639E+00 4.809241263106E+00 1.301455248000E+00 1.080000000000E+02 +1.523373071014E+00 4.872172616338E+00 1.364609021000E+00 1.080000000000E+02 +1.532675729255E+00 4.943992077475E+00 1.416487546000E+00 1.080000000000E+02 +1.552607361192E+00 5.020999334931E+00 1.456473280000E+00 1.080000000000E+02 +1.583823455332E+00 5.099462870099E+00 1.484801442000E+00 1.080000000000E+02 +1.624818892460E+00 5.176519618021E+00 1.502532507000E+00 1.080000000000E+02 +1.670818834450E+00 5.252301106239E+00 1.511502484000E+00 1.080000000000E+02 +1.717304114735E+00 5.328345612706E+00 1.512984118000E+00 1.080000000000E+02 +1.760041893790E+00 5.406216555916E+00 1.507450791000E+00 1.080000000000E+02 +1.795416622613E+00 5.486986613538E+00 1.494787468000E+00 1.080000000000E+02 +1.823889195330E+00 5.569029197569E+00 1.474786583000E+00 1.080000000000E+02 +1.846638082913E+00 5.650731429563E+00 1.447633049000E+00 1.080000000000E+02 +1.862696078041E+00 5.731563667493E+00 1.413793625000E+00 1.080000000000E+02 +1.870985343161E+00 5.810930135115E+00 1.374018251000E+00 1.080000000000E+02 +1.870916000278E+00 5.887975035048E+00 1.329400646000E+00 1.080000000000E+02 +1.862090373229E+00 5.962323962302E+00 1.280975246000E+00 1.080000000000E+02 +1.843848737838E+00 6.033156817329E+00 1.230287750000E+00 1.080000000000E+02 +1.817901430981E+00 6.100424578688E+00 1.177853833000E+00 1.080000000000E+02 +1.788791092123E+00 6.164287097243E+00 1.123012040000E+00 1.080000000000E+02 +1.759620413555E+00 6.225067685383E+00 1.064920566000E+00 1.080000000000E+02 +1.734650016007E+00 6.283075986944E+00 1.002061223000E+00 1.080000000000E+02 +1.719076247440E+00 6.337672911800E+00 9.334175927000E-01 1.080000000000E+02 +1.712038304433E+00 6.387915602088E+00 8.601609198000E-01 1.080000000000E+02 +1.709149014050E+00 6.433684028132E+00 7.837241475000E-01 1.080000000000E+02 +1.708363583031E+00 6.474974396118E+00 7.047985910000E-01 1.080000000000E+02 +1.708807751120E+00 6.511809672373E+00 6.236520547000E-01 1.080000000000E+02 +1.709554728645E+00 6.544124106609E+00 5.407768227000E-01 1.080000000000E+02 +1.709885825485E+00 6.572063978735E+00 4.560661339000E-01 1.080000000000E+02 +1.710175127342E+00 6.595278820788E+00 3.701617308000E-01 1.080000000000E+02 +1.710690269961E+00 6.613681667387E+00 2.829651087000E-01 1.080000000000E+02 +1.710153898756E+00 6.627407911405E+00 1.949310037000E-01 1.080000000000E+02 +1.707887801676E+00 6.636547991263E+00 1.063739981000E-01 1.080000000000E+02 +1.704398248500E+00 6.640964631245E+00 1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +7.417711470444E-01 6.744520877280E+00 2.786784824000E-03 1.080000000000E+02 +7.317053701194E-01 6.748186796258E+00 -8.489061568000E-02 1.080000000000E+02 +7.206733171683E-01 6.747699674675E+00 -1.724869752000E-01 1.080000000000E+02 +7.104851064653E-01 6.742969422925E+00 -2.600860194000E-01 1.080000000000E+02 +7.034463926586E-01 6.733812995661E+00 -3.477269332000E-01 1.080000000000E+02 +6.991933192668E-01 6.720068349765E+00 -4.348356053000E-01 1.080000000000E+02 +6.971770550130E-01 6.701507324445E+00 -5.212198625000E-01 1.080000000000E+02 +6.993868978048E-01 6.677900552825E+00 -6.062523787000E-01 1.080000000000E+02 +7.083515041791E-01 6.648944910078E+00 -6.892798267000E-01 1.080000000000E+02 +7.225239542171E-01 6.614645576280E+00 -7.694019289000E-01 1.080000000000E+02 +7.429611568025E-01 6.575079240030E+00 -8.457732406000E-01 1.080000000000E+02 +7.665335829005E-01 6.530540108509E+00 -9.182365063000E-01 1.080000000000E+02 +7.872940528185E-01 6.480807465701E+00 -9.881923803000E-01 1.080000000000E+02 +8.042560775660E-01 6.426081815842E+00 -1.055471471000E+00 1.080000000000E+02 +8.127388869786E-01 6.366564963480E+00 -1.120196685000E+00 1.080000000000E+02 +8.095221750016E-01 6.302899863357E+00 -1.181327921000E+00 1.080000000000E+02 +7.962597859182E-01 6.235604640317E+00 -1.237059622000E+00 1.080000000000E+02 +7.721245076563E-01 6.165574208148E+00 -1.285194785000E+00 1.080000000000E+02 +7.371783761260E-01 6.093855653782E+00 -1.323067807000E+00 1.080000000000E+02 +6.940723401576E-01 6.021001361594E+00 -1.348281183000E+00 1.080000000000E+02 +6.445500969746E-01 5.948580515853E+00 -1.358569067000E+00 1.080000000000E+02 +5.904063780094E-01 5.878977250888E+00 -1.353085167000E+00 1.080000000000E+02 +5.321273368141E-01 5.815696915993E+00 -1.333014261000E+00 1.080000000000E+02 +4.722422941885E-01 5.758863057864E+00 -1.301720477000E+00 1.080000000000E+02 +4.125227723631E-01 5.707163822311E+00 -1.262085734000E+00 1.080000000000E+02 +3.564865195509E-01 5.657116926292E+00 -1.215714425000E+00 1.080000000000E+02 +3.087509404511E-01 5.605120366703E+00 -1.162638692000E+00 1.080000000000E+02 +2.711953656708E-01 5.551979709661E+00 -1.102951579000E+00 1.080000000000E+02 +2.479833898419E-01 5.497771316036E+00 -1.037139043000E+00 1.080000000000E+02 +2.407263939130E-01 5.444807729680E+00 -9.667867241000E-01 1.080000000000E+02 +2.495791730670E-01 5.396064087833E+00 -8.936981911000E-01 1.080000000000E+02 +2.735463267325E-01 5.355629834842E+00 -8.188905247000E-01 1.080000000000E+02 +3.083971673848E-01 5.329159756988E+00 -7.421450537000E-01 1.080000000000E+02 +3.530379745611E-01 5.318050495993E+00 -6.667474988000E-01 1.080000000000E+02 +4.096133073977E-01 5.314764912797E+00 -5.989634359000E-01 1.080000000000E+02 +4.753587298470E-01 5.311465208956E+00 -5.400717519000E-01 1.080000000000E+02 +5.403926874576E-01 5.308491952305E+00 -4.803836822000E-01 1.080000000000E+02 +6.069266929209E-01 5.300736917493E+00 -4.228264178000E-01 1.080000000000E+02 +6.737860255295E-01 5.286015429580E+00 -3.670458051000E-01 1.080000000000E+02 +7.388562794258E-01 5.264488611845E+00 -3.112409570000E-01 1.080000000000E+02 +8.005852265022E-01 5.238598573483E+00 -2.536123470000E-01 1.080000000000E+02 +8.604896894232E-01 5.211434114127E+00 -1.946452353000E-01 1.080000000000E+02 +9.212710749746E-01 5.184732113098E+00 -1.364003779000E-01 1.080000000000E+02 +9.833266561209E-01 5.157595684581E+00 -7.966775233000E-02 1.080000000000E+02 +1.046076543329E+00 5.128178344956E+00 -2.494784873000E-02 1.080000000000E+02 +1.106633910140E+00 5.093416962312E+00 2.916971350000E-02 1.080000000000E+02 +1.160011701698E+00 5.050487198398E+00 8.494149535000E-02 1.080000000000E+02 +1.200956279828E+00 4.999575303426E+00 1.443669380000E-01 1.080000000000E+02 +1.228671141814E+00 4.945253022400E+00 2.083126740000E-01 1.080000000000E+02 +1.242742424231E+00 4.891678223714E+00 2.770763044000E-01 1.080000000000E+02 +1.245751473121E+00 4.841524527875E+00 3.497702850000E-01 1.080000000000E+02 +1.233037527423E+00 4.795109124628E+00 4.238156204000E-01 1.080000000000E+02 +1.204505334810E+00 4.752930391915E+00 4.959805589000E-01 1.080000000000E+02 +1.164272523475E+00 4.715164694556E+00 5.649597706000E-01 1.080000000000E+02 +1.117438801657E+00 4.681672703804E+00 6.319745517000E-01 1.080000000000E+02 +1.071440060822E+00 4.653068118382E+00 7.017224202000E-01 1.080000000000E+02 +1.031923821855E+00 4.631595952158E+00 7.777589224000E-01 1.080000000000E+02 +9.999844867241E-01 4.619895730915E+00 8.592609358000E-01 1.080000000000E+02 +9.749206794522E-01 4.619935745772E+00 9.439925506000E-01 1.080000000000E+02 +9.557181507490E-01 4.632869649798E+00 1.029225643000E+00 1.080000000000E+02 +9.416649183739E-01 4.659057162530E+00 1.112414355000E+00 1.080000000000E+02 +9.332153489859E-01 4.698069760520E+00 1.191204722000E+00 1.080000000000E+02 +9.302788740969E-01 4.748514175570E+00 1.263647540000E+00 1.080000000000E+02 +9.314956366583E-01 4.808509348005E+00 1.328492129000E+00 1.080000000000E+02 +9.362214771549E-01 4.876210809349E+00 1.385061074000E+00 1.080000000000E+02 +9.467792601915E-01 4.949672512646E+00 1.432913650000E+00 1.080000000000E+02 +9.639928053385E-01 5.026996201361E+00 1.472011314000E+00 1.080000000000E+02 +9.825831991483E-01 5.107628643352E+00 1.502926011000E+00 1.080000000000E+02 +9.973721283714E-01 5.191537340863E+00 1.525941209000E+00 1.080000000000E+02 +1.006993516280E+00 5.278124891882E+00 1.540955846000E+00 1.080000000000E+02 +1.010978554463E+00 5.366016052971E+00 1.547836060000E+00 1.080000000000E+02 +1.009463122209E+00 5.454353706812E+00 1.546702180000E+00 1.080000000000E+02 +1.002438445388E+00 5.542010960708E+00 1.537810757000E+00 1.080000000000E+02 +9.889793631280E-01 5.627755900940E+00 1.521653119000E+00 1.080000000000E+02 +9.694329974984E-01 5.710826726705E+00 1.498846663000E+00 1.080000000000E+02 +9.471146383857E-01 5.791289590837E+00 1.469852265000E+00 1.080000000000E+02 +9.246796310412E-01 5.869221520505E+00 1.435050927000E+00 1.080000000000E+02 +9.037119297223E-01 5.944916496363E+00 1.394624322000E+00 1.080000000000E+02 +8.855534905562E-01 6.018236704046E+00 1.348880339000E+00 1.080000000000E+02 +8.703366464578E-01 6.088972714236E+00 1.298134958000E+00 1.080000000000E+02 +8.581684355821E-01 6.156763697050E+00 1.242822431000E+00 1.080000000000E+02 +8.500577367212E-01 6.221464980023E+00 1.183240350000E+00 1.080000000000E+02 +8.465463482519E-01 6.282861548692E+00 1.119713595000E+00 1.080000000000E+02 +8.453067093919E-01 6.340479694970E+00 1.052910239000E+00 1.080000000000E+02 +8.431828647534E-01 6.394467537130E+00 9.829305340000E-01 1.080000000000E+02 +8.399083760868E-01 6.444601062140E+00 9.103747398000E-01 1.080000000000E+02 +8.360092594944E-01 6.491049645935E+00 8.352590367000E-01 1.080000000000E+02 +8.306462438994E-01 6.533639274696E+00 7.581530132000E-01 1.080000000000E+02 +8.230846874093E-01 6.572502239016E+00 6.790841041000E-01 1.080000000000E+02 +8.145711842331E-01 6.607530462463E+00 5.984352213000E-01 1.080000000000E+02 +8.066497838806E-01 6.638747540333E+00 5.162774167000E-01 1.080000000000E+02 +7.991053975181E-01 6.666187465459E+00 4.326343739000E-01 1.080000000000E+02 +7.906775770776E-01 6.689763587759E+00 3.478877549000E-01 1.080000000000E+02 +7.800061421224E-01 6.709395062267E+00 2.624374443000E-01 1.080000000000E+02 +7.665002742798E-01 6.725065347294E+00 1.765219348000E-01 1.080000000000E+02 +7.528308415311E-01 6.736770952410E+00 9.012406132000E-02 1.080000000000E+02 +7.417711470444E-01 6.744520877280E+00 2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +-5.750693853712E-02 6.709889967593E+00 3.632685538000E-02 1.080000000000E+02 +-3.343668901282E-02 6.719096880839E+00 -4.805479793000E-02 1.080000000000E+02 +-1.005470672386E-02 6.723647758770E+00 -1.330022602000E-01 1.080000000000E+02 +1.673072419145E-02 6.724078484640E+00 -2.170477619000E-01 1.080000000000E+02 +4.670404159877E-02 6.720663898439E+00 -2.999547317000E-01 1.080000000000E+02 +8.091258818786E-02 6.713778290553E+00 -3.810313384000E-01 1.080000000000E+02 +1.161737441310E-01 6.703319209250E+00 -4.611599500000E-01 1.080000000000E+02 +1.477021840256E-01 6.688603045180E+00 -5.422183342000E-01 1.080000000000E+02 +1.736005277346E-01 6.669038598679E+00 -6.243033587000E-01 1.080000000000E+02 +1.919148515388E-01 6.643976323317E+00 -7.068846032000E-01 1.080000000000E+02 +2.036642623669E-01 6.613048586515E+00 -7.885880029000E-01 1.080000000000E+02 +2.083846312353E-01 6.575630966647E+00 -8.684143517000E-01 1.080000000000E+02 +2.022979217216E-01 6.531339924423E+00 -9.444199619000E-01 1.080000000000E+02 +1.841704256493E-01 6.480268204903E+00 -1.014026757000E+00 1.080000000000E+02 +1.546755360785E-01 6.422909757807E+00 -1.074292285000E+00 1.080000000000E+02 +1.157424389519E-01 6.360133140096E+00 -1.122466283000E+00 1.080000000000E+02 +6.943825892509E-02 6.293290466321E+00 -1.156570420000E+00 1.080000000000E+02 +1.713066218774E-02 6.224804402078E+00 -1.175727956000E+00 1.080000000000E+02 +-4.156336168126E-02 6.159119147747E+00 -1.180212576000E+00 1.080000000000E+02 +-1.078919328483E-01 6.101547136664E+00 -1.172009822000E+00 1.080000000000E+02 +-1.778119646166E-01 6.050359544652E+00 -1.155518699000E+00 1.080000000000E+02 +-2.419038601450E-01 5.993663223081E+00 -1.133893710000E+00 1.080000000000E+02 +-2.921036357449E-01 5.926530278685E+00 -1.106430447000E+00 1.080000000000E+02 +-3.277961260081E-01 5.854409547938E+00 -1.070335916000E+00 1.080000000000E+02 +-3.508286650414E-01 5.783844482807E+00 -1.022604995000E+00 1.080000000000E+02 +-3.649586718227E-01 5.721675578267E+00 -9.616664656000E-01 1.080000000000E+02 +-3.660646652041E-01 5.668372758318E+00 -8.913395217000E-01 1.080000000000E+02 +-3.496846348330E-01 5.617781646298E+00 -8.209661657000E-01 1.080000000000E+02 +-3.173703046824E-01 5.564222537764E+00 -7.587395914000E-01 1.080000000000E+02 +-2.699455036227E-01 5.509345284322E+00 -7.085053980000E-01 1.080000000000E+02 +-2.088885318525E-01 5.459981769013E+00 -6.683070249000E-01 1.080000000000E+02 +-1.394612262091E-01 5.420382663521E+00 -6.309463669000E-01 1.080000000000E+02 +-6.640101136889E-02 5.391600331946E+00 -5.907387262000E-01 1.080000000000E+02 +8.236057058759E-03 5.372258649050E+00 -5.478583852000E-01 1.080000000000E+02 +7.975014465889E-02 5.355149282649E+00 -4.991121880000E-01 1.080000000000E+02 +1.469608835286E-01 5.333859357005E+00 -4.461358974000E-01 1.080000000000E+02 +2.102033346713E-01 5.304156997907E+00 -3.922509070000E-01 1.080000000000E+02 +2.704954351026E-01 5.266025137141E+00 -3.403860995000E-01 1.080000000000E+02 +3.305477672465E-01 5.223530784291E+00 -2.916382842000E-01 1.080000000000E+02 +3.947933605240E-01 5.183688073067E+00 -2.462074493000E-01 1.080000000000E+02 +4.646710359097E-01 5.151214194078E+00 -2.031942363000E-01 1.080000000000E+02 +5.300312676513E-01 5.116708762695E+00 -1.550619236000E-01 1.080000000000E+02 +5.857971849492E-01 5.076679355925E+00 -9.962429365000E-02 1.080000000000E+02 +6.279350982004E-01 5.029055408740E+00 -3.845435998000E-02 1.080000000000E+02 +6.572373331621E-01 4.974660966675E+00 2.448555749000E-02 1.080000000000E+02 +6.725134873488E-01 4.913754433509E+00 8.649636904000E-02 1.080000000000E+02 +6.734219313679E-01 4.848714959429E+00 1.460500498000E-01 1.080000000000E+02 +6.622473063899E-01 4.782810621566E+00 2.036424630000E-01 1.080000000000E+02 +6.425557746681E-01 4.718697907960E+00 2.609630366000E-01 1.080000000000E+02 +6.148038836932E-01 4.657988054157E+00 3.185973837000E-01 1.080000000000E+02 +5.790394057630E-01 4.601704952567E+00 3.764466502000E-01 1.080000000000E+02 +5.368102309130E-01 4.550674007001E+00 4.346658470000E-01 1.080000000000E+02 +4.958732320289E-01 4.506099420823E+00 4.988404496000E-01 1.080000000000E+02 +4.577751249130E-01 4.470143987195E+00 5.697936167000E-01 1.080000000000E+02 +4.208805313734E-01 4.444106569680E+00 6.456312705000E-01 1.080000000000E+02 +3.859095541975E-01 4.429200636647E+00 7.252260042000E-01 1.080000000000E+02 +3.536614460878E-01 4.426134448142E+00 8.072828216000E-01 1.080000000000E+02 +3.235638669017E-01 4.434584162034E+00 8.897856590000E-01 1.080000000000E+02 +2.951624739686E-01 4.453851950821E+00 9.710448039000E-01 1.080000000000E+02 +2.698788864032E-01 4.483779066348E+00 1.050138721000E+00 1.080000000000E+02 +2.471034000762E-01 4.523221655393E+00 1.125601149000E+00 1.080000000000E+02 +2.287404305049E-01 4.572000212576E+00 1.196814028000E+00 1.080000000000E+02 +2.154486347807E-01 4.629152101905E+00 1.262691804000E+00 1.080000000000E+02 +2.012584736398E-01 4.692416291692E+00 1.322504398000E+00 1.080000000000E+02 +1.815131044888E-01 4.760092673195E+00 1.375655668000E+00 1.080000000000E+02 +1.590825415503E-01 4.831927123589E+00 1.421583532000E+00 1.080000000000E+02 +1.373963211693E-01 4.908311232626E+00 1.460188986000E+00 1.080000000000E+02 +1.190104206511E-01 4.988804600166E+00 1.491069996000E+00 1.080000000000E+02 +1.063503173409E-01 5.073047899802E+00 1.513978101000E+00 1.080000000000E+02 +9.817626358073E-02 5.159619099425E+00 1.528680731000E+00 1.080000000000E+02 +9.226195351378E-02 5.247483538487E+00 1.535219663000E+00 1.080000000000E+02 +8.784065691108E-02 5.335506312479E+00 1.533750385000E+00 1.080000000000E+02 +8.430784220913E-02 5.423179770736E+00 1.524583142000E+00 1.080000000000E+02 +8.059967733971E-02 5.509862746511E+00 1.508093490000E+00 1.080000000000E+02 +7.565272414578E-02 5.594690598720E+00 1.484797470000E+00 1.080000000000E+02 +6.885189201710E-02 5.677504957651E+00 1.455093589000E+00 1.080000000000E+02 +5.969425813633E-02 5.757778143512E+00 1.419493916000E+00 1.080000000000E+02 +4.802893562064E-02 5.835017206222E+00 1.378577601000E+00 1.080000000000E+02 +3.356343008381E-02 5.909047428229E+00 1.332770951000E+00 1.080000000000E+02 +1.653127018635E-02 5.979599280522E+00 1.282612075000E+00 1.080000000000E+02 +-2.735689831346E-03 6.046558747161E+00 1.228575236000E+00 1.080000000000E+02 +-2.341863556584E-02 6.110113289599E+00 1.170998922000E+00 1.080000000000E+02 +-4.458672358480E-02 6.170479542238E+00 1.110182121000E+00 1.080000000000E+02 +-6.511677533821E-02 6.227926730655E+00 1.046417130000E+00 1.080000000000E+02 +-8.377240898085E-02 6.282757825278E+00 9.799657947000E-01 1.080000000000E+02 +-9.944467321980E-02 6.335387736469E+00 9.108702606000E-01 1.080000000000E+02 +-1.112341459033E-01 6.385876882583E+00 8.394336353000E-01 1.080000000000E+02 +-1.203170967395E-01 6.433743134890E+00 7.659096737000E-01 1.080000000000E+02 +-1.281584526258E-01 6.478529478812E+00 6.903510399000E-01 1.080000000000E+02 +-1.339028890655E-01 6.520289626398E+00 6.127886991000E-01 1.080000000000E+02 +-1.363452082510E-01 6.558911633087E+00 5.335701480000E-01 1.080000000000E+02 +-1.347589738484E-01 6.594269602920E+00 4.527156872000E-01 1.080000000000E+02 +-1.284939430860E-01 6.625996956139E+00 3.706549346000E-01 1.080000000000E+02 +-1.162362164521E-01 6.653830738574E+00 2.879184587000E-01 1.080000000000E+02 +-9.969148527330E-02 6.677262240821E+00 2.044325232000E-01 1.080000000000E+02 +-7.926825814379E-02 6.696017708483E+00 1.206362437000E-01 1.080000000000E+02 +-5.750693853712E-02 6.709889967593E+00 3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +-6.174537047519E-01 6.624371228274E+00 3.187537464000E-02 1.080000000000E+02 +-5.808510820260E-01 6.646319875049E+00 -4.635841915000E-02 1.080000000000E+02 +-5.475857834759E-01 6.662237853808E+00 -1.274648788000E-01 1.080000000000E+02 +-5.213358954334E-01 6.671358970530E+00 -2.120822207000E-01 1.080000000000E+02 +-5.056978960894E-01 6.673099648835E+00 -2.997983967000E-01 1.080000000000E+02 +-5.017318357254E-01 6.667465876329E+00 -3.886351210000E-01 1.080000000000E+02 +-5.102753988998E-01 6.654697674252E+00 -4.764366174000E-01 1.080000000000E+02 +-5.322655189065E-01 6.635140915120E+00 -5.605003417000E-01 1.080000000000E+02 +-5.682385792406E-01 6.609238399765E+00 -6.378051764000E-01 1.080000000000E+02 +-6.155782488455E-01 6.577411453558E+00 -7.062104980000E-01 1.080000000000E+02 +-6.712710452262E-01 6.539509994668E+00 -7.645271884000E-01 1.080000000000E+02 +-7.333813162992E-01 6.495416134846E+00 -8.108473046000E-01 1.080000000000E+02 +-7.998878414080E-01 6.445726621452E+00 -8.432354714000E-01 1.080000000000E+02 +-8.687859673451E-01 6.392068771124E+00 -8.607369806000E-01 1.080000000000E+02 +-9.384074971066E-01 6.336513934767E+00 -8.640060786000E-01 1.080000000000E+02 +-1.005782948708E+00 6.278751851746E+00 -8.562220560000E-01 1.080000000000E+02 +-1.063825100204E+00 6.212455111524E+00 -8.427262700000E-01 1.080000000000E+02 +-1.107518843248E+00 6.137036094228E+00 -8.243174216000E-01 1.080000000000E+02 +-1.136995267996E+00 6.056208132375E+00 -8.012208021000E-01 1.080000000000E+02 +-1.152237113243E+00 5.971717150592E+00 -7.773689488000E-01 1.080000000000E+02 +-1.153111629297E+00 5.884766692590E+00 -7.578816060000E-01 1.080000000000E+02 +-1.138557042664E+00 5.797745797199E+00 -7.452820520000E-01 1.080000000000E+02 +-1.107560928944E+00 5.714691041203E+00 -7.366388673000E-01 1.080000000000E+02 +-1.062455957307E+00 5.638467641726E+00 -7.270540685000E-01 1.080000000000E+02 +-1.005029781276E+00 5.571525530269E+00 -7.142960837000E-01 1.080000000000E+02 +-9.381071096230E-01 5.514947085216E+00 -6.982493624000E-01 1.080000000000E+02 +-8.635087013100E-01 5.469770295839E+00 -6.800217467000E-01 1.080000000000E+02 +-7.845316887524E-01 5.433096278630E+00 -6.610368381000E-01 1.080000000000E+02 +-7.035604426016E-01 5.401051792741E+00 -6.421364412000E-01 1.080000000000E+02 +-6.223498652455E-01 5.369750555626E+00 -6.230907784000E-01 1.080000000000E+02 +-5.419618729757E-01 5.337220580567E+00 -6.026804297000E-01 1.080000000000E+02 +-4.642285886459E-01 5.301125457619E+00 -5.783904634000E-01 1.080000000000E+02 +-3.890803284431E-01 5.264149350628E+00 -5.479092097000E-01 1.080000000000E+02 +-3.174576096363E-01 5.227154063080E+00 -5.099632237000E-01 1.080000000000E+02 +-2.443035026732E-01 5.198492186743E+00 -4.679474510000E-01 1.080000000000E+02 +-1.737368061964E-01 5.168405956369E+00 -4.226801226000E-01 1.080000000000E+02 +-1.078903475184E-01 5.131115239000E+00 -3.756353333000E-01 1.080000000000E+02 +-4.994868521871E-02 5.082679496703E+00 -3.283193574000E-01 1.080000000000E+02 +-3.029457181578E-03 5.022678808154E+00 -2.820781068000E-01 1.080000000000E+02 +2.950028277475E-02 4.952601924891E+00 -2.376983871000E-01 1.080000000000E+02 +4.663075398666E-02 4.876036554192E+00 -1.954128437000E-01 1.080000000000E+02 +4.719324978169E-02 4.796161734496E+00 -1.560456650000E-01 1.080000000000E+02 +2.968898896559E-02 4.715674749104E+00 -1.219181286000E-01 1.080000000000E+02 +-1.865010663360E-03 4.637451242299E+00 -9.346268448000E-02 1.080000000000E+02 +-4.018456777687E-02 4.561629549898E+00 -6.642283384000E-02 1.080000000000E+02 +-7.998318207819E-02 4.488143599661E+00 -3.558837129000E-02 1.080000000000E+02 +-1.181110553832E-01 4.417834096447E+00 3.754172340000E-03 1.080000000000E+02 +-1.531752088092E-01 4.353074031569E+00 5.388091285000E-02 1.080000000000E+02 +-1.861932064073E-01 4.295767688898E+00 1.135748529000E-01 1.080000000000E+02 +-2.182473283357E-01 4.246772818682E+00 1.807565333000E-01 1.080000000000E+02 +-2.489122805677E-01 4.206835663552E+00 2.542191153000E-01 1.080000000000E+02 +-2.776213462059E-01 4.176438422873E+00 3.329023539000E-01 1.080000000000E+02 +-3.040627486641E-01 4.155795641977E+00 4.155171011000E-01 1.080000000000E+02 +-3.281481378723E-01 4.144875519734E+00 5.006187195000E-01 1.080000000000E+02 +-3.496954123804E-01 4.143595377099E+00 5.870384289000E-01 1.080000000000E+02 +-3.684720680771E-01 4.151826769843E+00 6.737108263000E-01 1.080000000000E+02 +-3.845968802080E-01 4.169246042721E+00 7.596450919000E-01 1.080000000000E+02 +-3.993090285108E-01 4.194987499123E+00 8.436327263000E-01 1.080000000000E+02 +-4.148449657797E-01 4.228059989664E+00 9.249046690000E-01 1.080000000000E+02 +-4.320931431427E-01 4.268043161301E+00 1.002637062000E+00 1.080000000000E+02 +-4.503818528637E-01 4.314996868408E+00 1.076114245000E+00 1.080000000000E+02 +-4.697430170692E-01 4.368591508576E+00 1.144593485000E+00 1.080000000000E+02 +-4.903607534158E-01 4.428366578662E+00 1.207380380000E+00 1.080000000000E+02 +-5.108470076704E-01 4.494077409348E+00 1.263842748000E+00 1.080000000000E+02 +-5.288198196776E-01 4.565765809752E+00 1.313751841000E+00 1.080000000000E+02 +-5.443091372798E-01 4.642321355215E+00 1.356669215000E+00 1.080000000000E+02 +-5.598970694973E-01 4.722411702799E+00 1.392276244000E+00 1.080000000000E+02 +-5.785760454947E-01 4.805055921806E+00 1.420151472000E+00 1.080000000000E+02 +-6.022939022379E-01 4.888643501978E+00 1.439465232000E+00 1.080000000000E+02 +-6.307770228265E-01 4.972507985264E+00 1.449884186000E+00 1.080000000000E+02 +-6.623993585745E-01 5.055804263445E+00 1.451432017000E+00 1.080000000000E+02 +-6.976375397059E-01 5.137201088444E+00 1.443978096000E+00 1.080000000000E+02 +-7.370484680737E-01 5.215413404279E+00 1.427519630000E+00 1.080000000000E+02 +-7.792688539356E-01 5.289922768892E+00 1.402784195000E+00 1.080000000000E+02 +-8.217101406208E-01 5.361487754445E+00 1.371062779000E+00 1.080000000000E+02 +-8.620848830457E-01 5.431503036831E+00 1.333595471000E+00 1.080000000000E+02 +-8.972447582441E-01 5.501978214497E+00 1.291888617000E+00 1.080000000000E+02 +-9.248266544540E-01 5.574059097695E+00 1.247327499000E+00 1.080000000000E+02 +-9.430793072984E-01 5.648018096678E+00 1.201173169000E+00 1.080000000000E+02 +-9.512948924687E-01 5.723343100197E+00 1.154170635000E+00 1.080000000000E+02 +-9.503877187960E-01 5.798491175725E+00 1.106391465000E+00 1.080000000000E+02 +-9.426288255099E-01 5.872216680903E+00 1.056863518000E+00 1.080000000000E+02 +-9.307727517871E-01 5.943356830383E+00 1.004521395000E+00 1.080000000000E+02 +-9.187142304640E-01 6.011066100948E+00 9.479798854000E-01 1.080000000000E+02 +-9.064590749322E-01 6.075473214114E+00 8.876176364000E-01 1.080000000000E+02 +-8.949925319206E-01 6.136449739009E+00 8.236903164000E-01 1.080000000000E+02 +-8.819357482480E-01 6.194569646718E+00 7.574711850000E-01 1.080000000000E+02 +-8.661487255067E-01 6.250202492691E+00 6.895838911000E-01 1.080000000000E+02 +-8.471270459121E-01 6.303329775747E+00 6.207042323000E-01 1.080000000000E+02 +-8.255097895224E-01 6.354060152520E+00 5.506192747000E-01 1.080000000000E+02 +-8.019995915586E-01 6.402173367144E+00 4.794354850000E-01 1.080000000000E+02 +-7.766815202804E-01 6.447587551233E+00 4.071715453000E-01 1.080000000000E+02 +-7.495605045925E-01 6.490167574138E+00 3.337124203000E-01 1.080000000000E+02 +-7.202897748382E-01 6.529568751067E+00 2.593013285000E-01 1.080000000000E+02 +-6.886047632324E-01 6.565391437062E+00 1.840910744000E-01 1.080000000000E+02 +-6.540750141809E-01 6.597162912483E+00 1.084250821000E-01 1.080000000000E+02 +-6.174537047519E-01 6.624371228274E+00 3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +-1.352379061587E+00 6.487680520715E+00 -3.206635964000E-02 1.080000000000E+02 +-1.414107789131E+00 6.490515932498E+00 -9.558959151000E-02 1.080000000000E+02 +-1.483429070114E+00 6.483603354757E+00 -1.502609002000E-01 1.080000000000E+02 +-1.556332340991E+00 6.466121640402E+00 -1.975103298000E-01 1.080000000000E+02 +-1.628836192470E+00 6.436494407685E+00 -2.389271858000E-01 1.080000000000E+02 +-1.698480130861E+00 6.395142266347E+00 -2.748207179000E-01 1.080000000000E+02 +-1.764311227277E+00 6.346033888823E+00 -3.080563152000E-01 1.080000000000E+02 +-1.822101048451E+00 6.289111964387E+00 -3.436690988000E-01 1.080000000000E+02 +-1.870784041293E+00 6.222701310769E+00 -3.763048784000E-01 1.080000000000E+02 +-1.914372763305E+00 6.151182473591E+00 -4.052293645000E-01 1.080000000000E+02 +-1.947230817756E+00 6.076251274918E+00 -4.392283960000E-01 1.080000000000E+02 +-1.964464762243E+00 5.999534351135E+00 -4.800337212000E-01 1.080000000000E+02 +-1.965925290331E+00 5.923093568958E+00 -5.247345144000E-01 1.080000000000E+02 +-1.951542539519E+00 5.848523507967E+00 -5.704365727000E-01 1.080000000000E+02 +-1.922180173663E+00 5.777451385662E+00 -6.144560156000E-01 1.080000000000E+02 +-1.878638622182E+00 5.711680000579E+00 -6.547457037000E-01 1.080000000000E+02 +-1.822206029066E+00 5.653098233507E+00 -6.898657429000E-01 1.080000000000E+02 +-1.755350315457E+00 5.602974459726E+00 -7.191623664000E-01 1.080000000000E+02 +-1.680606437902E+00 5.561468162557E+00 -7.426294678000E-01 1.080000000000E+02 +-1.603108456971E+00 5.523375926694E+00 -7.624802322000E-01 1.080000000000E+02 +-1.523621479400E+00 5.487514992757E+00 -7.779139702000E-01 1.080000000000E+02 +-1.442920069619E+00 5.452231750892E+00 -7.877001548000E-01 1.080000000000E+02 +-1.362975587242E+00 5.414234286975E+00 -7.913832776000E-01 1.080000000000E+02 +-1.286177895859E+00 5.370097535849E+00 -7.895526386000E-01 1.080000000000E+02 +-1.211062641888E+00 5.323938915135E+00 -7.811847600000E-01 1.080000000000E+02 +-1.135433219026E+00 5.280312921066E+00 -7.661370968000E-01 1.080000000000E+02 +-1.060418440350E+00 5.237119267759E+00 -7.471733717000E-01 1.080000000000E+02 +-9.874897008306E-01 5.191130965128E+00 -7.269319722000E-01 1.080000000000E+02 +-9.177531652870E-01 5.140181283609E+00 -7.069563165000E-01 1.080000000000E+02 +-8.537232764939E-01 5.081812752577E+00 -6.885508517000E-01 1.080000000000E+02 +-7.985351288313E-01 5.014424460275E+00 -6.723087025000E-01 1.080000000000E+02 +-7.537320536331E-01 4.939497880818E+00 -6.572772207000E-01 1.080000000000E+02 +-7.206637010816E-01 4.858635005061E+00 -6.427120602000E-01 1.080000000000E+02 +-7.008383353394E-01 4.773318601100E+00 -6.291917806000E-01 1.080000000000E+02 +-6.964071739629E-01 4.685362842702E+00 -6.193379278000E-01 1.080000000000E+02 +-7.071690718074E-01 4.597538488163E+00 -6.153164653000E-01 1.080000000000E+02 +-7.235943664614E-01 4.510612933900E+00 -6.108406342000E-01 1.080000000000E+02 +-7.374051367578E-01 4.424125997673E+00 -5.976498684000E-01 1.080000000000E+02 +-7.474983801702E-01 4.339619626201E+00 -5.730609127000E-01 1.080000000000E+02 +-7.563108813883E-01 4.258544183217E+00 -5.383970067000E-01 1.080000000000E+02 +-7.652792856142E-01 4.181944016525E+00 -4.947621310000E-01 1.080000000000E+02 +-7.741306426997E-01 4.111159013653E+00 -4.421942386000E-01 1.080000000000E+02 +-7.824885479160E-01 4.047486168546E+00 -3.812203306000E-01 1.080000000000E+02 +-7.893137138628E-01 3.992263229810E+00 -3.122472237000E-01 1.080000000000E+02 +-7.979794983357E-01 3.943807694794E+00 -2.386307155000E-01 1.080000000000E+02 +-8.125405919624E-01 3.899665426807E+00 -1.632283249000E-01 1.080000000000E+02 +-8.290301885895E-01 3.862475649117E+00 -8.452815995000E-02 1.080000000000E+02 +-8.475008191921E-01 3.832196652282E+00 -3.268188411000E-03 1.080000000000E+02 +-8.692573552013E-01 3.808055234563E+00 7.911508161000E-02 1.080000000000E+02 +-8.929379381044E-01 3.790842894217E+00 1.627636593000E-01 1.080000000000E+02 +-9.196059335781E-01 3.779967502465E+00 2.465256910000E-01 1.080000000000E+02 +-9.464329152433E-01 3.777012992708E+00 3.309221835000E-01 1.080000000000E+02 +-9.734024780205E-01 3.781877516687E+00 4.151413601000E-01 1.080000000000E+02 +-1.000754462050E+00 3.794375128228E+00 4.985211599000E-01 1.080000000000E+02 +-1.027589608902E+00 3.814746650942E+00 5.804104256000E-01 1.080000000000E+02 +-1.052465415391E+00 3.843370073933E+00 6.604511422000E-01 1.080000000000E+02 +-1.072604291232E+00 3.880706515326E+00 7.382277411000E-01 1.080000000000E+02 +-1.086876961193E+00 3.926197564314E+00 8.130003965000E-01 1.080000000000E+02 +-1.099716615618E+00 3.977826054922E+00 8.837344519000E-01 1.080000000000E+02 +-1.117903289342E+00 4.034134736199E+00 9.496690099000E-01 1.080000000000E+02 +-1.143981455190E+00 4.094434547458E+00 1.009152163000E+00 1.080000000000E+02 +-1.176425711356E+00 4.158686453078E+00 1.060859533000E+00 1.080000000000E+02 +-1.213578041008E+00 4.226681188549E+00 1.103835896000E+00 1.080000000000E+02 +-1.253995206918E+00 4.297927852622E+00 1.137456428000E+00 1.080000000000E+02 +-1.296574059879E+00 4.371847138134E+00 1.161466271000E+00 1.080000000000E+02 +-1.341061922435E+00 4.447129753148E+00 1.175425951000E+00 1.080000000000E+02 +-1.387342902738E+00 4.522567157972E+00 1.179281333000E+00 1.080000000000E+02 +-1.435590538879E+00 4.596691266579E+00 1.173138038000E+00 1.080000000000E+02 +-1.485322684477E+00 4.668372514737E+00 1.157882812000E+00 1.080000000000E+02 +-1.534660888288E+00 4.738593706964E+00 1.135668523000E+00 1.080000000000E+02 +-1.581520402298E+00 4.808750725011E+00 1.108680995000E+00 1.080000000000E+02 +-1.622710108992E+00 4.881435685555E+00 1.079331268000E+00 1.080000000000E+02 +-1.654233052250E+00 4.958772229618E+00 1.049719473000E+00 1.080000000000E+02 +-1.676171899044E+00 5.039087342535E+00 1.019495947000E+00 1.080000000000E+02 +-1.688292944320E+00 5.121255159737E+00 9.885700701000E-01 1.080000000000E+02 +-1.691013425966E+00 5.203958236488E+00 9.570750472000E-01 1.080000000000E+02 +-1.684089106366E+00 5.286656284629E+00 9.259972860000E-01 1.080000000000E+02 +-1.666841443616E+00 5.368662334491E+00 8.971800023000E-01 1.080000000000E+02 +-1.639976040295E+00 5.449264299253E+00 8.719921484000E-01 1.080000000000E+02 +-1.604863003224E+00 5.527862373647E+00 8.511651264000E-01 1.080000000000E+02 +-1.564014418871E+00 5.604569324274E+00 8.338806698000E-01 1.080000000000E+02 +-1.522875588708E+00 5.680974703035E+00 8.161032666000E-01 1.080000000000E+02 +-1.484640888733E+00 5.757955257480E+00 7.945068161000E-01 1.080000000000E+02 +-1.448613634539E+00 5.834566619628E+00 7.685448264000E-01 1.080000000000E+02 +-1.413014296325E+00 5.909833381674E+00 7.382924668000E-01 1.080000000000E+02 +-1.377666806528E+00 5.982954041437E+00 7.029154360000E-01 1.080000000000E+02 +-1.343083461934E+00 6.053257337459E+00 6.614534371000E-01 1.080000000000E+02 +-1.311016657151E+00 6.120056079992E+00 6.129080743000E-01 1.080000000000E+02 +-1.283561764862E+00 6.182827110610E+00 5.567854442000E-01 1.080000000000E+02 +-1.260631407608E+00 6.241237638239E+00 4.941808118000E-01 1.080000000000E+02 +-1.242625657027E+00 6.295042725736E+00 4.262021665000E-01 1.080000000000E+02 +-1.232090135749E+00 6.343992956435E+00 3.530417735000E-01 1.080000000000E+02 +-1.229665841573E+00 6.387677909104E+00 2.760107546000E-01 1.080000000000E+02 +-1.238704954920E+00 6.425063397799E+00 1.962732381000E-01 1.080000000000E+02 +-1.262835618385E+00 6.454613430437E+00 1.162295333000E-01 1.080000000000E+02 +-1.301196042135E+00 6.475609955362E+00 3.922229480000E-02 1.080000000000E+02 +-1.352379061587E+00 6.487680520715E+00 -3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +4.907460575322E+00 4.453735327424E+00 3.206635964000E-02 1.080000000000E+02 +4.858957742460E+00 4.474054658924E+00 -3.922229480000E-02 1.080000000000E+02 +4.815582060035E+00 4.479615804788E+00 -1.162295333000E-01 1.080000000000E+02 +4.778690869817E+00 4.469892974313E+00 -1.962732381000E-01 1.080000000000E+02 +4.749403434601E+00 4.444960536135E+00 -2.760107546000E-01 1.080000000000E+02 +4.725687358862E+00 4.408193702663E+00 -3.530417735000E-01 1.080000000000E+02 +4.705438550920E+00 4.362399510116E+00 -4.262021665000E-01 1.080000000000E+02 +4.688379672207E+00 4.308286765299E+00 -4.941808118000E-01 1.080000000000E+02 +4.672597874194E+00 4.247553529974E+00 -5.567854442000E-01 1.080000000000E+02 +4.657913462566E+00 4.180633118658E+00 -6.129080743000E-01 1.080000000000E+02 +4.644592736858E+00 4.107743405806E+00 -6.614534371000E-01 1.080000000000E+02 +4.631248009768E+00 4.030539264637E+00 -7.029154360000E-01 1.080000000000E+02 +4.616865484276E+00 3.950606675040E+00 -7.382924668000E-01 1.080000000000E+02 +4.601425261161E+00 3.868789819440E+00 -7.685448264000E-01 1.080000000000E+02 +4.585540893236E+00 3.785633636804E+00 -7.945068161000E-01 1.080000000000E+02 +4.571225380675E+00 3.700881267251E+00 -8.161032666000E-01 1.080000000000E+02 +4.559597438573E+00 3.614887219705E+00 -8.338806698000E-01 1.080000000000E+02 +4.547557423184E+00 3.528819797601E+00 -8.511651264000E-01 1.080000000000E+02 +4.529765677911E+00 3.444593694338E+00 -8.719921484000E-01 1.080000000000E+02 +4.504123599565E+00 3.363594247196E+00 -8.971800023000E-01 1.080000000000E+02 +4.469875305135E+00 3.287112037415E+00 -9.259972860000E-01 1.080000000000E+02 +4.426868504276E+00 3.216137898125E+00 -9.570750472000E-01 1.080000000000E+02 +4.376055939559E+00 3.150828762537E+00 -9.885700701000E-01 1.080000000000E+02 +4.317952776776E+00 3.091478173685E+00 -1.019495947000E+00 1.080000000000E+02 +4.252995837974E+00 3.039397213028E+00 -1.049719473000E+00 1.080000000000E+02 +4.182035961102E+00 2.995359355751E+00 -1.079331268000E+00 1.080000000000E+02 +4.105989640522E+00 2.960766689577E+00 -1.108680995000E+00 1.080000000000E+02 +4.026842236787E+00 2.931551800966E+00 -1.135668523000E+00 1.080000000000E+02 +3.945651810243E+00 2.903741931664E+00 -1.157882812000E+00 1.080000000000E+02 +3.863284478754E+00 2.874982405474E+00 -1.173138038000E+00 1.080000000000E+02 +3.780682263299E+00 2.843373990899E+00 -1.179281333000E+00 1.080000000000E+02 +3.698899169690E+00 2.809547126069E+00 -1.175425951000E+00 1.080000000000E+02 +3.618657721980E+00 2.774791520658E+00 -1.161466271000E+00 1.080000000000E+02 +3.540762040450E+00 2.740016784297E+00 -1.137456428000E+00 1.080000000000E+02 +3.466186127947E+00 2.706133636331E+00 -1.103835896000E+00 1.080000000000E+02 +3.396162959134E+00 2.672962331265E+00 -1.060859533000E+00 1.080000000000E+02 +3.332148681971E+00 2.640051702992E+00 -1.009152163000E+00 1.080000000000E+02 +3.275607662844E+00 2.606596492219E+00 -9.496690099000E-01 1.080000000000E+02 +3.227796922300E+00 2.571731670738E+00 -8.837344519000E-01 1.080000000000E+02 +3.187062958290E+00 2.537510303958E+00 -8.130003965000E-01 1.080000000000E+02 +3.148777158031E+00 2.509096537149E+00 -7.382277411000E-01 1.080000000000E+02 +3.110538655603E+00 2.490728055769E+00 -6.604511422000E-01 1.080000000000E+02 +3.073589279501E+00 2.482192852326E+00 -5.804104256000E-01 1.080000000000E+02 +3.039905109033E+00 2.481485247812E+00 -4.985211599000E-01 1.080000000000E+02 +3.010430977370E+00 2.487451560519E+00 -4.151413601000E-01 1.080000000000E+02 +2.985752847298E+00 2.499368389211E+00 -3.309221835000E-01 1.080000000000E+02 +2.965785980487E+00 2.517527142002E+00 -2.465256910000E-01 1.080000000000E+02 +2.950603513827E+00 2.542000573197E+00 -1.627636593000E-01 1.080000000000E+02 +2.941562679634E+00 2.569844746446E+00 -7.911508161000E-02 1.080000000000E+02 +2.938151241569E+00 2.602163734656E+00 3.268188411000E-03 1.080000000000E+02 +2.941005735309E+00 2.637516721937E+00 8.452815995000E-02 1.080000000000E+02 +2.949524974269E+00 2.677296225819E+00 1.632283249000E-01 1.080000000000E+02 +2.963690976194E+00 2.721566866881E+00 2.386307155000E-01 1.080000000000E+02 +2.985161658160E+00 2.765861838494E+00 3.122472237000E-01 1.080000000000E+02 +3.012099211897E+00 2.814549866298E+00 3.812203306000E-01 1.080000000000E+02 +3.042763483865E+00 2.870974933497E+00 4.421942386000E-01 1.080000000000E+02 +3.077208966331E+00 2.933443900925E+00 4.947621310000E-01 1.080000000000E+02 +3.114977823205E+00 3.000686233291E+00 5.383970067000E-01 1.080000000000E+02 +3.155503309665E+00 3.071457502743E+00 5.730609127000E-01 1.080000000000E+02 +3.197009303092E+00 3.145757253022E+00 5.976498684000E-01 1.080000000000E+02 +3.236671900847E+00 3.223844421324E+00 6.108406342000E-01 1.080000000000E+02 +3.274477117178E+00 3.303823217931E+00 6.153164653000E-01 1.080000000000E+02 +3.317392419320E+00 3.381200298113E+00 6.193379278000E-01 1.080000000000E+02 +3.372676401819E+00 3.449753430103E+00 6.291917806000E-01 1.080000000000E+02 +3.438863183651E+00 3.507122793201E+00 6.427120602000E-01 1.080000000000E+02 +3.513146048669E+00 3.553105143955E+00 6.572772207000E-01 1.080000000000E+02 +3.593433236314E+00 3.587387433207E+00 6.723087025000E-01 1.080000000000E+02 +3.677691230054E+00 3.609466927604E+00 6.885508517000E-01 1.080000000000E+02 +3.763800659974E+00 3.619052236808E+00 7.069563165000E-01 1.080000000000E+02 +3.850166173763E+00 3.619281287876E+00 7.269319722000E-01 1.080000000000E+02 +3.936198009477E+00 3.613620168689E+00 7.471733717000E-01 1.080000000000E+02 +4.022274832662E+00 3.604471987653E+00 7.661370968000E-01 1.080000000000E+02 +4.109103036962E+00 3.595312298854E+00 7.811847600000E-01 1.080000000000E+02 +4.197003910484E+00 3.588503768942E+00 7.895526386000E-01 1.080000000000E+02 +4.285077479337E+00 3.579070600275E+00 7.913832776000E-01 1.080000000000E+02 +4.372088273101E+00 3.562821006583E+00 7.877001548000E-01 1.080000000000E+02 +4.458116054306E+00 3.543930650361E+00 7.779139702000E-01 1.080000000000E+02 +4.543500898094E+00 3.526221482184E+00 7.624802322000E-01 1.080000000000E+02 +4.628588136164E+00 3.511486578077E+00 7.426294678000E-01 1.080000000000E+02 +4.713453992684E+00 3.501132528935E+00 7.191623664000E-01 1.080000000000E+02 +4.797003416183E+00 3.502386711255E+00 6.898657429000E-01 1.080000000000E+02 +4.877091841788E+00 3.516610110394E+00 6.547457037000E-01 1.080000000000E+02 +4.950977147073E+00 3.544227196848E+00 6.144560156000E-01 1.080000000000E+02 +5.016506945385E+00 3.584466985996E+00 5.704365727000E-01 1.080000000000E+02 +5.071974017332E+00 3.636341463795E+00 5.247345144000E-01 1.080000000000E+02 +5.115723189724E+00 3.699041832510E+00 4.800337212000E-01 1.080000000000E+02 +5.146873712156E+00 3.771236986014E+00 4.392283960000E-01 1.080000000000E+02 +5.164334441219E+00 3.851171078976E+00 4.052293645000E-01 1.080000000000E+02 +5.171108142103E+00 3.934651841635E+00 3.763048784000E-01 1.080000000000E+02 +5.170757976348E+00 4.016994334249E+00 3.436690988000E-01 1.080000000000E+02 +5.157462896632E+00 4.097013143090E+00 3.080563152000E-01 1.080000000000E+02 +5.133069600946E+00 4.175437202689E+00 2.748207179000E-01 1.080000000000E+02 +5.101032650061E+00 4.249827467682E+00 2.389271858000E-01 1.080000000000E+02 +5.059790252514E+00 4.316413097081E+00 1.975103298000E-01 1.080000000000E+02 +5.011085761312E+00 4.373407568550E+00 1.502609002000E-01 1.080000000000E+02 +4.959066778177E+00 4.419745988049E+00 9.558959151000E-02 1.080000000000E+02 +4.907460575322E+00 4.453735327424E+00 3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +4.393238254074E+00 4.996298719096E+00 -3.187537464000E-02 1.080000000000E+02 +4.406872868997E+00 4.952761263631E+00 -1.084250821000E-01 1.080000000000E+02 +4.416133218095E+00 4.906761522821E+00 -1.840910744000E-01 1.080000000000E+02 +4.420710884426E+00 4.859156378526E+00 -2.593013285000E-01 1.080000000000E+02 +4.421231971513E+00 4.810075253518E+00 -3.337124203000E-01 1.080000000000E+02 +4.418145424603E+00 4.759685958319E+00 -4.071715453000E-01 1.080000000000E+02 +4.411934386879E+00 4.708063522691E+00 -4.794354850000E-01 1.080000000000E+02 +4.402674298577E+00 4.655320166765E+00 -5.506192747000E-01 1.080000000000E+02 +4.390344459058E+00 4.601572125324E+00 -6.207042323000E-01 1.080000000000E+02 +4.374505887636E+00 4.547410587727E+00 -6.895838911000E-01 1.080000000000E+02 +4.354577690919E+00 4.493123290744E+00 -7.574711850000E-01 1.080000000000E+02 +4.330978826186E+00 4.438428712811E+00 -8.236903164000E-01 1.080000000000E+02 +4.304414352279E+00 4.382357803036E+00 -8.876176364000E-01 1.080000000000E+02 +4.276471430112E+00 4.323047954240E+00 -9.479798854000E-01 1.080000000000E+02 +4.246428468108E+00 4.261182182678E+00 -1.004521395000E+00 1.080000000000E+02 +4.214205102526E+00 4.196659767482E+00 -1.056863518000E+00 1.080000000000E+02 +4.177147414390E+00 4.132454017827E+00 -1.106391465000E+00 1.080000000000E+02 +4.133710402775E+00 4.071124724323E+00 -1.154170635000E+00 1.080000000000E+02 +4.082788928556E+00 4.015014516178E+00 -1.201173169000E+00 1.080000000000E+02 +4.024550213336E+00 3.965909069271E+00 -1.247327499000E+00 1.080000000000E+02 +3.959867910449E+00 3.923806641616E+00 -1.291888617000E+00 1.080000000000E+02 +3.889998703809E+00 3.887457481317E+00 -1.333595471000E+00 1.080000000000E+02 +3.816180900622E+00 3.854545606164E+00 -1.371062779000E+00 1.080000000000E+02 +3.739780335342E+00 3.821594679051E+00 -1.402784195000E+00 1.080000000000E+02 +3.661827819993E+00 3.786131856994E+00 -1.427519630000E+00 1.080000000000E+02 +3.583971663384E+00 3.746021926788E+00 -1.443978096000E+00 1.080000000000E+02 +3.507619522681E+00 3.700882995263E+00 -1.451432017000E+00 1.080000000000E+02 +3.433076191772E+00 3.652082033241E+00 -1.449884186000E+00 1.080000000000E+02 +3.360738556697E+00 3.600976199260E+00 -1.439465232000E+00 1.080000000000E+02 +3.292418860622E+00 3.547293432791E+00 -1.420151472000E+00 1.080000000000E+02 +3.228730198483E+00 3.491412081747E+00 -1.392276244000E+00 1.080000000000E+02 +3.169043371250E+00 3.435779986137E+00 -1.356669215000E+00 1.080000000000E+02 +3.111514029475E+00 3.382949641299E+00 -1.313751841000E+00 1.080000000000E+02 +3.054836334607E+00 3.335516660913E+00 -1.263842748000E+00 1.080000000000E+02 +2.999638749570E+00 3.294397000299E+00 -1.207380380000E+00 1.080000000000E+02 +2.947823745829E+00 3.258156754120E+00 -1.144593485000E+00 1.080000000000E+02 +2.900658095863E+00 3.226177986204E+00 -1.076114245000E+00 1.080000000000E+02 +2.858263522316E+00 3.198941473062E+00 -1.002637062000E+00 1.080000000000E+02 +2.820807935079E+00 3.176732632002E+00 -9.249046690000E-01 1.080000000000E+02 +2.788799575608E+00 3.159108219915E+00 -8.436327263000E-01 1.080000000000E+02 +2.761766749162E+00 3.146930528028E+00 -7.596450919000E-01 1.080000000000E+02 +2.738482710414E+00 3.142315967007E+00 -6.737108263000E-01 1.080000000000E+02 +2.718453785597E+00 3.146693271695E+00 -5.870384289000E-01 1.080000000000E+02 +2.701774123299E+00 3.160394099025E+00 -5.006187195000E-01 1.080000000000E+02 +2.688707320921E+00 3.183385700073E+00 -4.155171011000E-01 1.080000000000E+02 +2.679449299154E+00 3.215627927043E+00 -3.329023539000E-01 1.080000000000E+02 +2.674090226942E+00 3.257094576724E+00 -2.542191153000E-01 1.080000000000E+02 +2.672756230258E+00 3.307428820615E+00 -1.807565333000E-01 1.080000000000E+02 +2.675622363030E+00 3.365907443402E+00 -1.135748529000E-01 1.080000000000E+02 +2.682594064937E+00 3.431676740557E+00 -5.388091285000E-02 1.080000000000E+02 +2.692291579995E+00 3.504678925868E+00 -3.754172340000E-03 1.080000000000E+02 +2.702772371617E+00 3.583971510464E+00 3.558837129000E-02 1.080000000000E+02 +2.713768574094E+00 3.666815931601E+00 6.642283384000E-02 1.080000000000E+02 +2.727334273770E+00 3.750680639842E+00 9.346268448000E-02 1.080000000000E+02 +2.747785175512E+00 3.832511761839E+00 1.219181286000E-01 1.080000000000E+02 +2.780932994053E+00 3.907915847207E+00 1.560456650000E-01 1.080000000000E+02 +2.828337303757E+00 3.972205307031E+00 1.954128437000E-01 1.080000000000E+02 +2.887200141823E+00 4.024078954765E+00 2.376983871000E-01 1.080000000000E+02 +2.954707412779E+00 4.061651842830E+00 2.820781068000E-01 1.080000000000E+02 +3.027933385480E+00 4.082614989251E+00 3.283193574000E-01 1.080000000000E+02 +3.103278989969E+00 4.087743073311E+00 3.756353333000E-01 1.080000000000E+02 +3.178468827775E+00 4.079208320068E+00 4.226801226000E-01 1.080000000000E+02 +3.253242726973E+00 4.062070528246E+00 4.679474510000E-01 1.080000000000E+02 +3.329272670929E+00 4.042259568076E+00 5.099632237000E-01 1.080000000000E+02 +3.408961952052E+00 4.030090606570E+00 5.479092097000E-01 1.080000000000E+02 +3.491492182030E+00 4.015833866428E+00 5.783904634000E-01 1.080000000000E+02 +3.575595911030E+00 3.999344956166E+00 6.026804297000E-01 1.080000000000E+02 +3.659751802517E+00 3.978411382498E+00 6.230907784000E-01 1.080000000000E+02 +3.743850945276E+00 3.956000235569E+00 6.421364412000E-01 1.080000000000E+02 +3.828193335690E+00 3.934331064882E+00 6.610368381000E-01 1.080000000000E+02 +3.913643527472E+00 3.917579444805E+00 6.800217467000E-01 1.080000000000E+02 +4.000549158092E+00 3.910280390911E+00 6.982493624000E-01 1.080000000000E+02 +4.087946712368E+00 3.916717155033E+00 7.142960837000E-01 1.080000000000E+02 +4.173753050571E+00 3.937120201474E+00 7.270540685000E-01 1.080000000000E+02 +4.255046729248E+00 3.972274189887E+00 7.366388673000E-01 1.080000000000E+02 +4.328941472715E+00 4.021247840428E+00 7.452820520000E-01 1.080000000000E+02 +4.391865979598E+00 4.083094252289E+00 7.578816060000E-01 1.080000000000E+02 +4.442266678143E+00 4.153952678121E+00 7.773689488000E-01 1.080000000000E+02 +4.479598319356E+00 4.231266250108E+00 8.012208021000E-01 1.080000000000E+02 +4.503260874752E+00 4.313983252626E+00 8.243174216000E-01 1.080000000000E+02 +4.512242080191E+00 4.400681057096E+00 8.427262700000E-01 1.080000000000E+02 +4.504253239418E+00 4.488432567268E+00 8.562220560000E-01 1.080000000000E+02 +4.483697054610E+00 4.574765370880E+00 8.640060786000E-01 1.080000000000E+02 +4.460026367363E+00 4.660632686049E+00 8.607369806000E-01 1.080000000000E+02 +4.435825905691E+00 4.744540101182E+00 8.432354714000E-01 1.080000000000E+02 +4.411227759808E+00 4.823831316600E+00 8.108473046000E-01 1.080000000000E+02 +4.386897215505E+00 4.896011499897E+00 7.645271884000E-01 1.080000000000E+02 +4.364118715345E+00 4.959409828622E+00 7.062104980000E-01 1.080000000000E+02 +4.344527527732E+00 5.012983928624E+00 6.378051764000E-01 1.080000000000E+02 +4.330649827105E+00 5.055083938088E+00 5.605003417000E-01 1.080000000000E+02 +4.324354620912E+00 5.083831156816E+00 4.764366174000E-01 1.080000000000E+02 +4.324947693990E+00 5.099182629720E+00 3.886351210000E-01 1.080000000000E+02 +4.331467752619E+00 5.101409255628E+00 2.997983967000E-01 1.080000000000E+02 +4.343096014810E+00 5.090809231908E+00 2.120822207000E-01 1.080000000000E+02 +4.358971362443E+00 5.068000796406E+00 1.274648788000E-01 1.080000000000E+02 +4.376527201132E+00 5.035570029173E+00 4.635841915000E-02 1.080000000000E+02 +4.393238254074E+00 4.996298719096E+00 -3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +3.990498458027E+00 5.394613283792E+00 -3.632685538000E-02 1.080000000000E+02 +3.999949826089E+00 5.370599407687E+00 -1.206362437000E-01 1.080000000000E+02 +4.005448376624E+00 5.343421443899E+00 -2.044325232000E-01 1.080000000000E+02 +4.005060653856E+00 5.314740211388E+00 -2.879184587000E-01 1.080000000000E+02 +3.998617076184E+00 5.285017297438E+00 -3.706549346000E-01 1.080000000000E+02 +3.985036722224E+00 5.255666836810E+00 -4.527156872000E-01 1.080000000000E+02 +3.965537119594E+00 5.226129273140E+00 -5.335701480000E-01 1.080000000000E+02 +3.940859795922E+00 5.196318972570E+00 -6.127886991000E-01 1.080000000000E+02 +3.911666450335E+00 5.165910798508E+00 -6.903510399000E-01 1.080000000000E+02 +3.878997907702E+00 5.134286918507E+00 -7.659096737000E-01 1.080000000000E+02 +3.843514568928E+00 5.100901131482E+00 -8.394336353000E-01 1.080000000000E+02 +3.804299909686E+00 5.066984232420E+00 -9.108702606000E-01 1.080000000000E+02 +3.760685695949E+00 5.033617665644E+00 -9.799657947000E-01 1.080000000000E+02 +3.713364062505E+00 5.000223884601E+00 -1.046417130000E+00 1.080000000000E+02 +3.662988291603E+00 4.965815394542E+00 -1.110182121000E+00 1.080000000000E+02 +3.610380555620E+00 4.929420360228E+00 -1.170998922000E+00 1.080000000000E+02 +3.556291278266E+00 4.890160785802E+00 -1.228575236000E+00 1.080000000000E+02 +3.501346193190E+00 4.847314274311E+00 -1.282612075000E+00 1.080000000000E+02 +3.446097548083E+00 4.800247879225E+00 -1.332770951000E+00 1.080000000000E+02 +3.390880835551E+00 4.748858782345E+00 -1.378577601000E+00 1.080000000000E+02 +3.336043409430E+00 4.693227772521E+00 -1.419493916000E+00 1.080000000000E+02 +3.281451333188E+00 4.633668123108E+00 -1.455093589000E+00 1.080000000000E+02 +3.227272285562E+00 4.570667328183E+00 -1.484797470000E+00 1.080000000000E+02 +3.173409555846E+00 4.504947900280E+00 -1.508093490000E+00 1.080000000000E+02 +3.119458612663E+00 4.436999504379E+00 -1.524583142000E+00 1.080000000000E+02 +3.065067339751E+00 4.368146723075E+00 -1.533750385000E+00 1.080000000000E+02 +3.009751947244E+00 4.299533575962E+00 -1.535219663000E+00 1.080000000000E+02 +2.953321748408E+00 4.231926095795E+00 -1.528680731000E+00 1.080000000000E+02 +2.895823525591E+00 4.166693112328E+00 -1.513978101000E+00 1.080000000000E+02 +2.836064317732E+00 4.105980273278E+00 -1.491069996000E+00 1.080000000000E+02 +2.773876997409E+00 4.051666732179E+00 -1.460188986000E+00 1.080000000000E+02 +2.711435023775E+00 4.002617530385E+00 -1.421583532000E+00 1.080000000000E+02 +2.651065086616E+00 3.957686593331E+00 -1.375655668000E+00 1.080000000000E+02 +2.595311568437E+00 3.914541287365E+00 -1.322504398000E+00 1.080000000000E+02 +2.546645729166E+00 3.871700250138E+00 -1.262691804000E+00 1.080000000000E+02 +2.502299402851E+00 3.833276121914E+00 -1.196814028000E+00 1.080000000000E+02 +2.458772131860E+00 3.804606922894E+00 -1.125601149000E+00 1.080000000000E+02 +2.417162604214E+00 3.786084293031E+00 -1.050138721000E+00 1.080000000000E+02 +2.379117035044E+00 3.776734067873E+00 -9.710448039000E-01 1.080000000000E+02 +2.344814503404E+00 3.777840019211E+00 -8.897856590000E-01 1.080000000000E+02 +2.315498433141E+00 3.788694970250E+00 -8.072828216000E-01 1.080000000000E+02 +2.291211426028E+00 3.810130531219E+00 -7.252260042000E-01 1.080000000000E+02 +2.271680798791E+00 3.842745109003E+00 -6.456312705000E-01 1.080000000000E+02 +2.257136855641E+00 3.885495920234E+00 -5.697936167000E-01 1.080000000000E+02 +2.247448913156E+00 3.936977982582E+00 -4.988404496000E-01 1.080000000000E+02 +2.240530469743E+00 3.997101744535E+00 -4.346658470000E-01 1.080000000000E+02 +2.236361586845E+00 4.063208332930E+00 -3.764466502000E-01 1.080000000000E+02 +2.240509893472E+00 4.129764151296E+00 -3.185973837000E-01 1.080000000000E+02 +2.253742498782E+00 4.195191606987E+00 -2.609630366000E-01 1.080000000000E+02 +2.275496222516E+00 4.258634273791E+00 -2.036424630000E-01 1.080000000000E+02 +2.305193358861E+00 4.318520282886E+00 -1.460500498000E-01 1.080000000000E+02 +2.344157549192E+00 4.370604352725E+00 -8.649636904000E-02 1.080000000000E+02 +2.392316179501E+00 4.410899674982E+00 -2.448555749000E-02 1.080000000000E+02 +2.447994436410E+00 4.437682281443E+00 3.845435998000E-02 1.080000000000E+02 +2.510077378150E+00 4.451442820084E+00 9.962429365000E-02 1.080000000000E+02 +2.578721647908E+00 4.451048906667E+00 1.550619236000E-01 1.080000000000E+02 +2.651880969834E+00 4.440546606750E+00 2.031942363000E-01 1.080000000000E+02 +2.727500863903E+00 4.425745459669E+00 2.462074493000E-01 1.080000000000E+02 +2.802895598747E+00 4.420216277898E+00 2.916382842000E-01 1.080000000000E+02 +2.876456509914E+00 4.419297056319E+00 3.403860995000E-01 1.080000000000E+02 +2.947647189190E+00 4.414707572242E+00 3.922509070000E-01 1.080000000000E+02 +3.016270015567E+00 4.401564305425E+00 4.461358974000E-01 1.080000000000E+02 +3.083158549833E+00 4.379282735976E+00 4.991121880000E-01 1.080000000000E+02 +3.151071295285E+00 4.351089578136E+00 5.478583852000E-01 1.080000000000E+02 +3.222822708014E+00 4.322866760202E+00 5.907387262000E-01 1.080000000000E+02 +3.298847493459E+00 4.303208438772E+00 6.309463669000E-01 1.080000000000E+02 +3.378291133810E+00 4.294436441713E+00 6.683070249000E-01 1.080000000000E+02 +3.456702407898E+00 4.298483976944E+00 7.085053980000E-01 1.080000000000E+02 +3.527325918169E+00 4.315005008927E+00 7.587395914000E-01 1.080000000000E+02 +3.584950014545E+00 4.339341351235E+00 8.209661657000E-01 1.080000000000E+02 +3.627938447026E+00 4.370642480339E+00 8.913395217000E-01 1.080000000000E+02 +3.658374291056E+00 4.414415454125E+00 9.616664656000E-01 1.080000000000E+02 +3.683484840680E+00 4.473016564020E+00 1.022604995000E+00 1.080000000000E+02 +3.706328229789E+00 4.543643087686E+00 1.070335916000E+00 1.080000000000E+02 +3.719843900512E+00 4.622969503902E+00 1.106430447000E+00 1.080000000000E+02 +3.718691183597E+00 4.706787884567E+00 1.133893710000E+00 1.080000000000E+02 +3.700165012591E+00 4.790328443219E+00 1.155518699000E+00 1.080000000000E+02 +3.673685830329E+00 4.872838038571E+00 1.172009822000E+00 1.080000000000E+02 +3.653864868101E+00 4.958401729875E+00 1.180212576000E+00 1.080000000000E+02 +3.644989229112E+00 5.046041698537E+00 1.175727956000E+00 1.080000000000E+02 +3.642926592966E+00 5.132193722332E+00 1.156570420000E+00 1.080000000000E+02 +3.644754862283E+00 5.213487495506E+00 1.122466283000E+00 1.080000000000E+02 +3.650156495143E+00 5.287159146400E+00 1.074292285000E+00 1.080000000000E+02 +3.660009077530E+00 5.350899765979E+00 1.014026757000E+00 1.080000000000E+02 +3.675362828685E+00 5.402872729855E+00 9.444199619000E-01 1.080000000000E+02 +3.696472198677E+00 5.442282613800E+00 8.684143517000E-01 1.080000000000E+02 +3.722284582446E+00 5.469779540956E+00 7.885880029000E-01 1.080000000000E+02 +3.749968923058E+00 5.487894475219E+00 7.068846032000E-01 1.080000000000E+02 +3.779516758103E+00 5.497405392466E+00 6.243033587000E-01 1.080000000000E+02 +3.811968651412E+00 5.498010697680E+00 5.422183342000E-01 1.080000000000E+02 +3.846125639304E+00 5.491384372507E+00 4.611599500000E-01 1.080000000000E+02 +3.880800207445E+00 5.479119959584E+00 3.810313384000E-01 1.080000000000E+02 +3.912522761757E+00 5.464583254194E+00 2.999547317000E-01 1.080000000000E+02 +3.938778728329E+00 5.449727838524E+00 2.170477619000E-01 1.080000000000E+02 +3.960195422827E+00 5.433635292707E+00 1.330022602000E-01 1.080000000000E+02 +3.976436904929E+00 5.416209970763E+00 4.805479793000E-02 1.080000000000E+02 +3.990498458027E+00 5.394613283792E+00 -3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +3.364224441548E+00 5.892434149445E+00 -2.786784824000E-03 1.080000000000E+02 +3.350721669211E+00 5.892665053834E+00 -9.012406132000E-02 1.080000000000E+02 +3.332782483757E+00 5.891229711343E+00 -1.765219348000E-01 1.080000000000E+02 +3.312645244710E+00 5.886490734386E+00 -2.624374443000E-01 1.080000000000E+02 +3.292472781281E+00 5.876881049972E+00 -3.478877549000E-01 1.080000000000E+02 +3.271796834325E+00 5.862761314934E+00 -4.326343739000E-01 1.080000000000E+02 +3.249564514232E+00 5.844996428224E+00 -5.162774167000E-01 1.080000000000E+02 +3.224807028736E+00 5.824397364017E+00 -5.984352213000E-01 1.080000000000E+02 +3.197330386829E+00 5.801063047578E+00 -6.790841041000E-01 1.080000000000E+02 +3.168369881837E+00 5.774066820381E+00 -7.581530132000E-01 1.080000000000E+02 +3.138997555393E+00 5.742763388403E+00 -8.352590367000E-01 1.080000000000E+02 +3.108541311262E+00 5.707477537979E+00 -9.103747398000E-01 1.080000000000E+02 +3.076424447637E+00 5.668843360405E+00 -9.829305340000E-01 1.080000000000E+02 +3.042972963806E+00 5.626414643165E+00 -1.052910239000E+00 1.080000000000E+02 +3.008102978255E+00 5.580529225082E+00 -1.119713595000E+00 1.080000000000E+02 +2.969174207704E+00 5.532922299989E+00 -1.183240350000E+00 1.080000000000E+02 +2.924582054554E+00 5.485345211682E+00 -1.242822431000E+00 1.080000000000E+02 +2.874891225227E+00 5.437653449420E+00 -1.298134958000E+00 1.080000000000E+02 +2.821002956156E+00 5.389371051610E+00 -1.348880339000E+00 1.080000000000E+02 +2.763215933508E+00 5.340727020309E+00 -1.394624322000E+00 1.080000000000E+02 +2.701760316326E+00 5.291813004061E+00 -1.435050927000E+00 1.080000000000E+02 +2.637802775173E+00 5.241951715007E+00 -1.469852265000E+00 1.080000000000E+02 +2.572451958471E+00 5.189974292850E+00 -1.498846663000E+00 1.080000000000E+02 +2.507810810218E+00 5.134257648522E+00 -1.521653119000E+00 1.080000000000E+02 +2.446522572614E+00 5.072799584755E+00 -1.537810757000E+00 1.080000000000E+02 +2.389315848589E+00 5.006012378111E+00 -1.546702180000E+00 1.080000000000E+02 +2.336166267992E+00 4.935436463640E+00 -1.547836060000E+00 1.080000000000E+02 +2.287729103310E+00 4.861988673990E+00 -1.540955846000E+00 1.080000000000E+02 +2.244618084117E+00 4.786282563795E+00 -1.525941209000E+00 1.080000000000E+02 +2.207262284251E+00 4.709706287038E+00 -1.502926011000E+00 1.080000000000E+02 +2.174907668516E+00 4.633546111853E+00 -1.472011314000E+00 1.080000000000E+02 +2.143383995194E+00 4.560872065638E+00 -1.432913650000E+00 1.080000000000E+02 +2.108745715287E+00 4.495234590069E+00 -1.385061074000E+00 1.080000000000E+02 +2.072775080025E+00 4.437685177950E+00 -1.328492129000E+00 1.080000000000E+02 +2.038495184050E+00 4.388432868780E+00 -1.263647540000E+00 1.080000000000E+02 +2.006469042734E+00 4.349348496367E+00 -1.191204722000E+00 1.080000000000E+02 +1.976702167752E+00 4.322753173872E+00 -1.112414355000E+00 1.080000000000E+02 +1.949940230156E+00 4.309827313769E+00 -1.029225643000E+00 1.080000000000E+02 +1.926802700059E+00 4.310650528787E+00 -9.439925506000E-01 1.080000000000E+02 +1.906502133890E+00 4.325350292368E+00 -8.592609358000E-01 1.080000000000E+02 +1.887539886475E+00 4.353589440350E+00 -7.777589224000E-01 1.080000000000E+02 +1.868191600238E+00 4.394187850221E+00 -7.017224202000E-01 1.080000000000E+02 +1.847791190642E+00 4.444366827432E+00 -6.319745517000E-01 1.080000000000E+02 +1.829588012015E+00 4.498990588121E+00 -5.649597706000E-01 1.080000000000E+02 +1.819237103864E+00 4.553191932250E+00 -4.959805589000E-01 1.080000000000E+02 +1.820946112202E+00 4.604086045849E+00 -4.238156204000E-01 1.080000000000E+02 +1.837942603574E+00 4.649109965656E+00 -3.497702850000E-01 1.080000000000E+02 +1.869856578025E+00 4.687916483359E+00 -2.770763044000E-01 1.080000000000E+02 +1.912730961196E+00 4.722988513681E+00 -2.083126740000E-01 1.080000000000E+02 +1.967082591197E+00 4.750645775060E+00 -1.443669380000E-01 1.080000000000E+02 +2.030132711763E+00 4.767767744122E+00 -8.494149535000E-02 1.080000000000E+02 +2.098549734368E+00 4.771123974015E+00 -2.916971350000E-02 1.080000000000E+02 +2.167973901320E+00 4.763651796193E+00 2.494784873000E-02 1.080000000000E+02 +2.236030704860E+00 4.750567465595E+00 7.966775233000E-02 1.080000000000E+02 +2.302185117086E+00 4.736045942012E+00 1.364003779000E-01 1.080000000000E+02 +2.367053333350E+00 4.721921912587E+00 1.946452353000E-01 1.080000000000E+02 +2.431483930488E+00 4.708687461997E+00 2.536123470000E-01 1.080000000000E+02 +2.496641480448E+00 4.693349578286E+00 3.112409570000E-01 1.080000000000E+02 +2.561937567672E+00 4.672517804066E+00 3.670458051000E-01 1.080000000000E+02 +2.624680977472E+00 4.645128808284E+00 4.228264178000E-01 1.080000000000E+02 +2.683066413689E+00 4.612295056051E+00 4.803836822000E-01 1.080000000000E+02 +2.737427627018E+00 4.576474470029E+00 5.400717519000E-01 1.080000000000E+02 +2.792556308336E+00 4.540499796791E+00 5.989634359000E-01 1.080000000000E+02 +2.840257931412E+00 4.509903743149E+00 6.667474988000E-01 1.080000000000E+02 +2.882902962837E+00 4.492652115980E+00 7.421450537000E-01 1.080000000000E+02 +2.926656606582E+00 4.493582048640E+00 8.188905247000E-01 1.080000000000E+02 +2.969813098800E+00 4.512206507002E+00 8.936981911000E-01 1.080000000000E+02 +3.005625941404E+00 4.546437408595E+00 9.667867241000E-01 1.080000000000E+02 +3.030886123337E+00 4.593551405222E+00 1.037139043000E+00 1.080000000000E+02 +3.043970134743E+00 4.651050573972E+00 1.102951579000E+00 1.080000000000E+02 +3.044822331018E+00 4.716116881608E+00 1.162638692000E+00 1.080000000000E+02 +3.036766247186E+00 4.786241251369E+00 1.215714425000E+00 1.080000000000E+02 +3.020848793763E+00 4.859667323762E+00 1.262085734000E+00 1.080000000000E+02 +3.002922733923E+00 4.936595138123E+00 1.301720477000E+00 1.080000000000E+02 +2.987880820370E+00 5.017774240093E+00 1.333014261000E+00 1.080000000000E+02 +2.977927333238E+00 5.103224667365E+00 1.353085167000E+00 1.080000000000E+02 +2.975035917115E+00 5.191359771099E+00 1.358569067000E+00 1.080000000000E+02 +2.977539485865E+00 5.279057910253E+00 1.348281183000E+00 1.080000000000E+02 +2.985488648720E+00 5.363335362973E+00 1.323067807000E+00 1.080000000000E+02 +2.999371742997E+00 5.441897713006E+00 1.285194785000E+00 1.080000000000E+02 +3.021008747960E+00 5.512739883376E+00 1.237059622000E+00 1.080000000000E+02 +3.049834389458E+00 5.574978299169E+00 1.181327921000E+00 1.080000000000E+02 +3.084653421741E+00 5.628375182978E+00 1.120196685000E+00 1.080000000000E+02 +3.126499286797E+00 5.671539257720E+00 1.055471471000E+00 1.080000000000E+02 +3.172388782985E+00 5.705843210488E+00 9.881923803000E-01 1.080000000000E+02 +3.218416469961E+00 5.733875065647E+00 9.182365063000E-01 1.080000000000E+02 +3.263666407930E+00 5.756052455541E+00 8.457732406000E-01 1.080000000000E+02 +3.303456961074E+00 5.776049607694E+00 7.694019289000E-01 1.080000000000E+02 +3.335083356577E+00 5.795467994512E+00 6.892798267000E-01 1.080000000000E+02 +3.359355575259E+00 5.813624338157E+00 6.062523787000E-01 1.080000000000E+02 +3.375019087845E+00 5.831423704577E+00 5.212198625000E-01 1.080000000000E+02 +3.384297792749E+00 5.847625019888E+00 4.348356053000E-01 1.080000000000E+02 +3.388935884253E+00 5.861244565816E+00 3.477269332000E-01 1.080000000000E+02 +3.388623458074E+00 5.872789523251E+00 2.600860194000E-01 1.080000000000E+02 +3.383161394691E+00 5.882604857303E+00 1.724869752000E-01 1.080000000000E+02 +3.374522599253E+00 5.889483424968E+00 8.489061568000E-02 1.080000000000E+02 +3.364224441548E+00 5.892434149445E+00 -2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +2.524573923022E+00 6.374473400221E+00 -1.744954334000E-02 1.080000000000E+02 +2.519154779354E+00 6.372951371312E+00 -1.063739981000E-01 1.080000000000E+02 +2.511949064160E+00 6.366888869821E+00 -1.949310037000E-01 1.080000000000E+02 +2.503447046937E+00 6.356099376225E+00 -2.829651087000E-01 1.080000000000E+02 +2.493046884239E+00 6.340908367348E+00 -3.701617308000E-01 1.080000000000E+02 +2.479635592564E+00 6.321957118240E+00 -4.560661339000E-01 1.080000000000E+02 +2.463480810749E+00 6.299158673030E+00 -5.407768227000E-01 1.080000000000E+02 +2.445091180381E+00 6.272576684196E+00 -6.236520547000E-01 1.080000000000E+02 +2.423799287766E+00 6.242515244261E+00 -7.047985910000E-01 1.080000000000E+02 +2.398893991360E+00 6.209572299627E+00 -7.837241475000E-01 1.080000000000E+02 +2.369654500489E+00 6.174243147428E+00 -8.601609198000E-01 1.080000000000E+02 +2.334428772604E+00 6.137732756248E+00 -9.334175927000E-01 1.080000000000E+02 +2.289738061916E+00 6.102716947685E+00 -1.002061223000E+00 1.080000000000E+02 +2.235440161775E+00 6.070464477330E+00 -1.064920566000E+00 1.080000000000E+02 +2.176114653742E+00 6.038438043258E+00 -1.123012040000E+00 1.080000000000E+02 +2.115026448313E+00 6.003882808313E+00 -1.177853833000E+00 1.080000000000E+02 +2.054495638026E+00 5.964713490508E+00 -1.230287750000E+00 1.080000000000E+02 +1.998103337427E+00 5.918130671291E+00 -1.280975246000E+00 1.080000000000E+02 +1.947262052195E+00 5.863168699051E+00 -1.329400646000E+00 1.080000000000E+02 +1.901920096679E+00 5.800878824399E+00 -1.374018251000E+00 1.080000000000E+02 +1.861975813837E+00 5.731797695519E+00 -1.413793625000E+00 1.080000000000E+02 +1.827455007426E+00 5.656964388623E+00 -1.447633049000E+00 1.080000000000E+02 +1.797835877038E+00 5.577494433834E+00 -1.474786583000E+00 1.080000000000E+02 +1.772647251286E+00 5.494384830753E+00 -1.494787468000E+00 1.080000000000E+02 +1.753790559379E+00 5.408247737594E+00 -1.507450791000E+00 1.080000000000E+02 +1.742594756935E+00 5.320128184925E+00 -1.512984118000E+00 1.080000000000E+02 +1.735504299255E+00 5.231283524664E+00 -1.511502484000E+00 1.080000000000E+02 +1.728175792893E+00 5.142936925328E+00 -1.502532507000E+00 1.080000000000E+02 +1.716048978204E+00 5.056500193373E+00 -1.484801442000E+00 1.080000000000E+02 +1.695183620047E+00 4.974673500214E+00 -1.456473280000E+00 1.080000000000E+02 +1.666044918758E+00 4.900657800935E+00 -1.416487546000E+00 1.080000000000E+02 +1.631356507283E+00 4.837086671028E+00 -1.364609021000E+00 1.080000000000E+02 +1.594540868563E+00 4.786047367742E+00 -1.301455248000E+00 1.080000000000E+02 +1.558828543214E+00 4.749002139667E+00 -1.228771473000E+00 1.080000000000E+02 +1.525193128726E+00 4.727391748530E+00 -1.149164457000E+00 1.080000000000E+02 +1.493076627810E+00 4.721889982518E+00 -1.066259509000E+00 1.080000000000E+02 +1.460474041922E+00 4.732106417539E+00 -9.840199882000E-01 1.080000000000E+02 +1.426301966512E+00 4.755294013289E+00 -9.050198505000E-01 1.080000000000E+02 +1.394605805416E+00 4.785446748635E+00 -8.274301477000E-01 1.080000000000E+02 +1.371904285523E+00 4.817792346313E+00 -7.475896770000E-01 1.080000000000E+02 +1.361430711430E+00 4.851295707933E+00 -6.657541041000E-01 1.080000000000E+02 +1.363662768892E+00 4.886145620366E+00 -5.837632627000E-01 1.080000000000E+02 +1.380488775562E+00 4.920395237958E+00 -5.032871173000E-01 1.080000000000E+02 +1.413488066939E+00 4.950124232689E+00 -4.260584823000E-01 1.080000000000E+02 +1.461735861681E+00 4.970651942819E+00 -3.540587787000E-01 1.080000000000E+02 +1.521095093000E+00 4.980226616451E+00 -2.882948801000E-01 1.080000000000E+02 +1.586170659884E+00 4.982087341744E+00 -2.275175217000E-01 1.080000000000E+02 +1.653103108124E+00 4.981647021979E+00 -1.687606404000E-01 1.080000000000E+02 +1.720090750533E+00 4.981853868869E+00 -1.100117670000E-01 1.080000000000E+02 +1.783152460726E+00 4.984910298015E+00 -4.718627597000E-02 1.080000000000E+02 +1.843593075239E+00 4.981656319958E+00 1.819661694000E-02 1.080000000000E+02 +1.900564105412E+00 4.967862884673E+00 8.530081591000E-02 1.080000000000E+02 +1.957366880675E+00 4.943562938783E+00 1.494783330000E-01 1.080000000000E+02 +2.011738541335E+00 4.912900138354E+00 2.130101728000E-01 1.080000000000E+02 +2.067749245880E+00 4.877180240546E+00 2.723890661000E-01 1.080000000000E+02 +2.120837607522E+00 4.837457807332E+00 3.318667032000E-01 1.080000000000E+02 +2.176361288659E+00 4.795661529844E+00 3.875539046000E-01 1.080000000000E+02 +2.228810449623E+00 4.753041538935E+00 4.456338674000E-01 1.080000000000E+02 +2.274639592496E+00 4.711864112237E+00 5.099892243000E-01 1.080000000000E+02 +2.309749021636E+00 4.675459719151E+00 5.833000314000E-01 1.080000000000E+02 +2.333026116451E+00 4.648063539816E+00 6.647899090000E-01 1.080000000000E+02 +2.347235809569E+00 4.633017751881E+00 7.514880132000E-01 1.080000000000E+02 +2.354597294811E+00 4.632088463213E+00 8.402099046000E-01 1.080000000000E+02 +2.354875759785E+00 4.645490556960E+00 9.282726209000E-01 1.080000000000E+02 +2.346602168739E+00 4.671742553356E+00 1.013024536000E+00 1.080000000000E+02 +2.327420291807E+00 4.707952293120E+00 1.092107862000E+00 1.080000000000E+02 +2.307344735227E+00 4.752126740626E+00 1.166812923000E+00 1.080000000000E+02 +2.292891734957E+00 4.804609206019E+00 1.237341473000E+00 1.080000000000E+02 +2.286041695595E+00 4.865701587576E+00 1.301808004000E+00 1.080000000000E+02 +2.287104248699E+00 4.934990836852E+00 1.357785149000E+00 1.080000000000E+02 +2.295864597401E+00 5.011219638329E+00 1.403042952000E+00 1.080000000000E+02 +2.311905149954E+00 5.092464647788E+00 1.435958561000E+00 1.080000000000E+02 +2.334458737968E+00 5.176322155363E+00 1.455667884000E+00 1.080000000000E+02 +2.362819107477E+00 5.260535705749E+00 1.462072215000E+00 1.080000000000E+02 +2.396038740132E+00 5.342936518550E+00 1.455639493000E+00 1.080000000000E+02 +2.432684312322E+00 5.422097091171E+00 1.437348696000E+00 1.080000000000E+02 +2.469029604620E+00 5.498110157456E+00 1.408608053000E+00 1.080000000000E+02 +2.502294861354E+00 5.571624012994E+00 1.370749447000E+00 1.080000000000E+02 +2.532016132832E+00 5.642164515971E+00 1.325285698000E+00 1.080000000000E+02 +2.558713223932E+00 5.709527505501E+00 1.273441742000E+00 1.080000000000E+02 +2.584540918328E+00 5.772795695640E+00 1.216246575000E+00 1.080000000000E+02 +2.609413235600E+00 5.832083627858E+00 1.154539058000E+00 1.080000000000E+02 +2.626625573724E+00 5.890198983843E+00 1.089263674000E+00 1.080000000000E+02 +2.632149224093E+00 5.948143892711E+00 1.021917209000E+00 1.080000000000E+02 +2.626681743508E+00 6.005196128291E+00 9.537419589000E-01 1.080000000000E+02 +2.613262309483E+00 6.060402229368E+00 8.850071242000E-01 1.080000000000E+02 +2.597302242307E+00 6.112547792896E+00 8.145657329000E-01 1.080000000000E+02 +2.582270190950E+00 6.160885657725E+00 7.412825815000E-01 1.080000000000E+02 +2.568823274890E+00 6.204995672078E+00 6.651770142000E-01 1.080000000000E+02 +2.556671240163E+00 6.244808192783E+00 5.863142345000E-01 1.080000000000E+02 +2.546655029055E+00 6.279677519562E+00 5.049593618000E-01 1.080000000000E+02 +2.539334233008E+00 6.309154563156E+00 4.212413326000E-01 1.080000000000E+02 +2.534529976955E+00 6.333032622321E+00 3.354886308000E-01 1.080000000000E+02 +2.531476567031E+00 6.351301888405E+00 2.484589536000E-01 1.080000000000E+02 +2.529457126529E+00 6.364132787753E+00 1.602254120000E-01 1.080000000000E+02 +2.527636470621E+00 6.371679140144E+00 7.150080869000E-02 1.080000000000E+02 +2.524573923022E+00 6.374473400221E+00 -1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +4.512083520E-01 7.005260820E+00 -7.060900000E-01 3.600000000E+01 +4.181710140E-01 6.973610860E+00 -8.029600000E-01 3.600000000E+01 +3.861347513E-01 6.937145886E+00 -8.983500000E-01 3.600000000E+01 +3.552888761E-01 6.895089395E+00 -9.918700000E-01 3.600000000E+01 +3.263653745E-01 6.845163711E+00 -1.082130000E+00 3.600000000E+01 +2.996992464E-01 6.787396678E+00 -1.168230000E+00 3.600000000E+01 +2.754252588E-01 6.722364870E+00 -1.249630000E+00 3.600000000E+01 +2.540912449E-01 6.649553816E+00 -1.325010000E+00 3.600000000E+01 +2.362675984E-01 6.568809729E+00 -1.392860000E+00 3.600000000E+01 +2.224954307E-01 6.480503551E+00 -1.451630000E+00 3.600000000E+01 +2.131374922E-01 6.385589908E+00 -1.500110000E+00 3.600000000E+01 +2.083253986E-01 6.285477055E+00 -1.537570000E+00 3.600000000E+01 +2.079584620E-01 6.181764386E+00 -1.563950000E+00 3.600000000E+01 +2.117184516E-01 6.075964258E+00 -1.579670000E+00 3.600000000E+01 +2.192384141E-01 5.969341997E+00 -1.585460000E+00 3.600000000E+01 +2.301376257E-01 5.862894021E+00 -1.582110000E+00 3.600000000E+01 +2.440812657E-01 5.757402055E+00 -1.570270000E+00 3.600000000E+01 +2.608555407E-01 5.653534898E+00 -1.550420000E+00 3.600000000E+01 +2.802880295E-01 5.551926878E+00 -1.522840000E+00 3.600000000E+01 +3.022945164E-01 5.453257265E+00 -1.487590000E+00 3.600000000E+01 +3.267715243E-01 5.358243131E+00 -1.444770000E+00 3.600000000E+01 +3.534755583E-01 5.267300060E+00 -1.394960000E+00 3.600000000E+01 +3.823150219E-01 5.181246410E+00 -1.338190000E+00 3.600000000E+01 +4.133002942E-01 5.101214389E+00 -1.274170000E+00 3.600000000E+01 +4.462040209E-01 5.027992861E+00 -1.203290000E+00 3.600000000E+01 +4.808344892E-01 4.962674552E+00 -1.125800000E+00 3.600000000E+01 +5.164892703E-01 4.903227051E+00 -1.044140000E+00 3.600000000E+01 +5.526815882E-01 4.847537363E+00 -9.600900000E-01 3.600000000E+01 +5.894156723E-01 4.796298077E+00 -8.735000000E-01 3.600000000E+01 +6.265686359E-01 4.749033907E+00 -7.848200000E-01 3.600000000E+01 +6.639247084E-01 4.704174679E+00 -6.949900000E-01 3.600000000E+01 +7.013639143E-01 4.660445047E+00 -6.046400000E-01 3.600000000E+01 +7.389556166E-01 4.618705704E+00 -5.134200000E-01 3.600000000E+01 +7.767221056E-01 4.579769546E+00 -4.210300000E-01 3.600000000E+01 +8.146939207E-01 4.545445680E+00 -3.269400000E-01 3.600000000E+01 +8.528547687E-01 4.517463799E+00 -2.308300000E-01 3.600000000E+01 +8.909926368E-01 4.488343290E+00 -1.350400000E-01 3.600000000E+01 +9.291020649E-01 4.457970268E+00 -3.963000000E-02 3.600000000E+01 +9.672455721E-01 4.429773214E+00 5.642000000E-02 3.600000000E+01 +1.005430626E+00 4.405684392E+00 1.535700000E-01 3.600000000E+01 +1.043609047E+00 4.384552335E+00 2.514000000E-01 3.600000000E+01 +1.081774386E+00 4.363477101E+00 3.492500000E-01 3.600000000E+01 +1.119847343E+00 4.347489417E+00 4.480900000E-01 3.600000000E+01 +1.157729692E+00 4.337031270E+00 5.477400000E-01 3.600000000E+01 +1.195372531E+00 4.331046055E+00 6.478600000E-01 3.600000000E+01 +1.232907541E+00 4.326767702E+00 7.481100000E-01 3.600000000E+01 +1.270174810E+00 4.326098741E+00 8.485000000E-01 3.600000000E+01 +1.306806033E+00 4.332565580E+00 9.489300000E-01 3.600000000E+01 +1.342583876E+00 4.346470157E+00 1.048900000E+00 3.600000000E+01 +1.377290526E+00 4.368177653E+00 1.147850000E+00 3.600000000E+01 +1.410606162E+00 4.398159996E+00 1.245100000E+00 3.600000000E+01 +1.442165784E+00 4.437008939E+00 1.339760000E+00 3.600000000E+01 +1.471402746E+00 4.485634106E+00 1.430550000E+00 3.600000000E+01 +1.497734983E+00 4.544476972E+00 1.516010000E+00 3.600000000E+01 +1.520619703E+00 4.613387948E+00 1.594630000E+00 3.600000000E+01 +1.539539107E+00 4.691841311E+00 1.664860000E+00 3.600000000E+01 +1.554016558E+00 4.778887896E+00 1.725230000E+00 3.600000000E+01 +1.563819634E+00 4.873068085E+00 1.774710000E+00 3.600000000E+01 +1.569219043E+00 4.972464377E+00 1.813600000E+00 3.600000000E+01 +1.570781011E+00 5.075389202E+00 1.843010000E+00 3.600000000E+01 +1.567521271E+00 5.181110905E+00 1.860050000E+00 3.600000000E+01 +1.560859870E+00 5.287527805E+00 1.868120000E+00 3.600000000E+01 +1.551923104E+00 5.394158285E+00 1.870100000E+00 3.600000000E+01 +1.538902647E+00 5.500096829E+00 1.860860000E+00 3.600000000E+01 +1.523725336E+00 5.604801487E+00 1.845540000E+00 3.600000000E+01 +1.506029317E+00 5.708032335E+00 1.823030000E+00 3.600000000E+01 +1.485894788E+00 5.808806484E+00 1.793360000E+00 3.600000000E+01 +1.464294824E+00 5.908080033E+00 1.759350000E+00 3.600000000E+01 +1.440018948E+00 6.003260138E+00 1.717120000E+00 3.600000000E+01 +1.414392515E+00 6.096387099E+00 1.670760000E+00 3.600000000E+01 +1.386496334E+00 6.184405416E+00 1.617000000E+00 3.600000000E+01 +1.356979853E+00 6.268828468E+00 1.558010000E+00 3.600000000E+01 +1.326471667E+00 6.350167008E+00 1.495580000E+00 3.600000000E+01 +1.294446448E+00 6.426804238E+00 1.427910000E+00 3.600000000E+01 +1.262038558E+00 6.501778319E+00 1.358800000E+00 3.600000000E+01 +1.227303744E+00 6.566678403E+00 1.280960000E+00 3.600000000E+01 +1.192581531E+00 6.631584908E+00 1.203110000E+00 3.600000000E+01 +1.156576482E+00 6.688433445E+00 1.119870000E+00 3.600000000E+01 +1.120305981E+00 6.743591262E+00 1.035480000E+00 3.600000000E+01 +1.083577147E+00 6.794555461E+00 9.488300000E-01 3.600000000E+01 +1.046386412E+00 6.841379776E+00 8.599400000E-01 3.600000000E+01 +1.009037751E+00 6.885679321E+00 7.699800000E-01 3.600000000E+01 +9.710637750E-01 6.920287783E+00 6.759700000E-01 3.600000000E+01 +9.330897995E-01 6.954896246E+00 5.819600000E-01 3.600000000E+01 +8.949209423E-01 6.981850296E+00 4.855600000E-01 3.600000000E+01 +8.567471051E-01 7.008627217E+00 3.891000000E-01 3.600000000E+01 +8.185927473E-01 7.029089034E+00 2.911500000E-01 3.600000000E+01 +7.804420515E-01 7.048235334E+00 1.928800000E-01 3.600000000E+01 +7.425158380E-01 7.060305957E+00 9.349000000E-02 3.600000000E+01 +7.046532611E-01 7.070242464E+00 -6.240000000E-03 3.600000000E+01 +6.672365197E-01 7.073104974E+00 -1.065300000E-01 3.600000000E+01 +6.299012052E-01 7.074405892E+00 -2.069400000E-01 3.600000000E+01 +5.932326297E-01 7.068277143E+00 -3.074100000E-01 3.600000000E+01 +5.567653385E-01 7.060211390E+00 -4.077700000E-01 3.600000000E+01 +5.209986866E-01 7.046082369E+00 -5.077700000E-01 3.600000000E+01 +4.858609978E-01 7.027416962E+00 -6.071600000E-01 3.600000000E+01 +4.512083520E-01 7.005260820E+00 -7.060900000E-01 0.000000000E+00 6 AAE14_SC +-1.242537400E+00 6.834467838E+00 -7.213900000E-01 3.600000000E+01 +-1.194422591E+00 6.803724877E+00 -8.084600000E-01 3.600000000E+01 +-1.144980646E+00 6.766872807E+00 -8.923100000E-01 3.600000000E+01 +-1.094463849E+00 6.724235437E+00 -9.726500000E-01 3.600000000E+01 +-1.043095236E+00 6.676032440E+00 -1.049200000E+00 3.600000000E+01 +-9.910326435E-01 6.621810398E+00 -1.121050000E+00 3.600000000E+01 +-9.384047770E-01 6.559361002E+00 -1.185540000E+00 3.600000000E+01 +-8.858390938E-01 6.488856581E+00 -1.241260000E+00 3.600000000E+01 +-8.338312561E-01 6.412687284E+00 -1.289570000E+00 3.600000000E+01 +-7.828736833E-01 6.331149800E+00 -1.329530000E+00 3.600000000E+01 +-7.335646115E-01 6.244732915E+00 -1.360190000E+00 3.600000000E+01 +-6.865422392E-01 6.154190754E+00 -1.380740000E+00 3.600000000E+01 +-6.425503416E-01 6.060437920E+00 -1.390330000E+00 3.600000000E+01 +-6.027314172E-01 5.964423937E+00 -1.387100000E+00 3.600000000E+01 +-5.667938509E-01 5.867725878E+00 -1.373500000E+00 3.600000000E+01 +-5.344638179E-01 5.771348294E+00 -1.351240000E+00 3.600000000E+01 +-5.058288643E-01 5.675992565E+00 -1.320860000E+00 3.600000000E+01 +-4.801985596E-01 5.581939059E+00 -1.284380000E+00 3.600000000E+01 +-4.573560813E-01 5.489369677E+00 -1.242550000E+00 3.600000000E+01 +-4.366839629E-01 5.398178423E+00 -1.196770000E+00 3.600000000E+01 +-4.171847647E-01 5.307778345E+00 -1.148930000E+00 3.600000000E+01 +-3.981910669E-01 5.217731777E+00 -1.100210000E+00 3.600000000E+01 +-3.801261047E-01 5.128386529E+00 -1.049910000E+00 3.600000000E+01 +-3.631743893E-01 5.039886669E+00 -9.977300000E-01 3.600000000E+01 +-3.470498835E-01 4.952044627E+00 -9.442200000E-01 3.600000000E+01 +-3.315744968E-01 4.864728936E+00 -8.896400000E-01 3.600000000E+01 +-3.166911656E-01 4.777921053E+00 -8.341100000E-01 3.600000000E+01 +-3.025779807E-01 4.691752448E+00 -7.773900000E-01 3.600000000E+01 +-2.890506711E-01 4.606110672E+00 -7.197400000E-01 3.600000000E+01 +-2.759722785E-01 4.520867110E+00 -6.614000000E-01 3.600000000E+01 +-2.643174416E-01 4.436937773E+00 -6.009100000E-01 3.600000000E+01 +-2.543955090E-01 4.354665012E+00 -5.378800000E-01 3.600000000E+01 +-2.465674328E-01 4.274523603E+00 -4.719100000E-01 3.600000000E+01 +-2.412008253E-01 4.197032548E+00 -4.026100000E-01 3.600000000E+01 +-2.387179922E-01 4.122833764E+00 -3.296700000E-01 3.600000000E+01 +-2.395134278E-01 4.052654762E+00 -2.528300000E-01 3.600000000E+01 +-2.439661754E-01 3.987270608E+00 -1.720200000E-01 3.600000000E+01 +-2.524212865E-01 3.927560984E+00 -8.727000000E-02 3.600000000E+01 +-2.650416716E-01 3.874157127E+00 1.130000000E-03 3.600000000E+01 +-2.827214460E-01 3.829031891E+00 9.328000000E-02 3.600000000E+01 +-3.054968232E-01 3.793206448E+00 1.882300000E-01 3.600000000E+01 +-3.317042616E-01 3.764163530E+00 2.844900000E-01 3.600000000E+01 +-3.615126122E-01 3.742483732E+00 3.818700000E-01 3.600000000E+01 +-3.967882020E-01 3.733652245E+00 4.791500000E-01 3.600000000E+01 +-4.335964069E-01 3.728420549E+00 5.764100000E-01 3.600000000E+01 +-4.747046312E-01 3.735163723E+00 6.716100000E-01 3.600000000E+01 +-5.169015336E-01 3.744931345E+00 7.663000000E-01 3.600000000E+01 +-5.614854175E-01 3.762950440E+00 8.581300000E-01 3.600000000E+01 +-6.088917308E-01 3.790760939E+00 9.465600000E-01 3.600000000E+01 +-6.563011342E-01 3.818561927E+00 1.034990000E+00 3.600000000E+01 +-7.065061200E-01 3.859699539E+00 1.116160000E+00 3.600000000E+01 +-7.571808464E-01 3.903145277E+00 1.196060000E+00 3.600000000E+01 +-8.085933247E-01 3.952960749E+00 1.270980000E+00 3.600000000E+01 +-8.611484936E-01 4.012915588E+00 1.337940000E+00 3.600000000E+01 +-9.136644243E-01 4.076033094E+00 1.401440000E+00 3.600000000E+01 +-9.660700210E-01 4.148777687E+00 1.454390000E+00 3.600000000E+01 +-1.017564140E+00 4.226010277E+00 1.500280000E+00 3.600000000E+01 +-1.067518608E+00 4.310796805E+00 1.534290000E+00 3.600000000E+01 +-1.115320484E+00 4.399878358E+00 1.558340000E+00 3.600000000E+01 +-1.161671958E+00 4.491190906E+00 1.576410000E+00 3.600000000E+01 +-1.205303445E+00 4.585373396E+00 1.584630000E+00 3.600000000E+01 +-1.246298528E+00 4.680938881E+00 1.584800000E+00 3.600000000E+01 +-1.285240381E+00 4.777225161E+00 1.579120000E+00 3.600000000E+01 +-1.321753801E+00 4.873963122E+00 1.566880000E+00 3.600000000E+01 +-1.355214391E+00 4.970550327E+00 1.547210000E+00 3.600000000E+01 +-1.386692284E+00 5.066735151E+00 1.523040000E+00 3.600000000E+01 +-1.416196029E+00 5.162394197E+00 1.494500000E+00 3.600000000E+01 +-1.443530645E+00 5.257253818E+00 1.461420000E+00 3.600000000E+01 +-1.468504001E+00 5.350999236E+00 1.423650000E+00 3.600000000E+01 +-1.491768754E+00 5.443789941E+00 1.382610000E+00 3.600000000E+01 +-1.513318005E+00 5.535550087E+00 1.338430000E+00 3.600000000E+01 +-1.533163634E+00 5.626178388E+00 1.291210000E+00 3.600000000E+01 +-1.551200064E+00 5.715514366E+00 1.240850000E+00 3.600000000E+01 +-1.567292708E+00 5.803325026E+00 1.187270000E+00 3.600000000E+01 +-1.581689080E+00 5.889722335E+00 1.131000000E+00 3.600000000E+01 +-1.594340667E+00 5.974564354E+00 1.072020000E+00 3.600000000E+01 +-1.605160914E+00 6.057696785E+00 1.010300000E+00 3.600000000E+01 +-1.614021652E+00 6.138899234E+00 9.457800000E-01 3.600000000E+01 +-1.620816826E+00 6.217947980E+00 8.783800000E-01 3.600000000E+01 +-1.625370234E+00 6.294543933E+00 8.080400000E-01 3.600000000E+01 +-1.627530878E+00 6.368375166E+00 7.346800000E-01 3.600000000E+01 +-1.627096394E+00 6.439028946E+00 6.582400000E-01 3.600000000E+01 +-1.623905793E+00 6.506127009E+00 5.787300000E-01 3.600000000E+01 +-1.617762653E+00 6.569205978E+00 4.961700000E-01 3.600000000E+01 +-1.608546636E+00 6.627827199E+00 4.106700000E-01 3.600000000E+01 +-1.596121713E+00 6.681567946E+00 3.224100000E-01 3.600000000E+01 +-1.580363736E+00 6.729904209E+00 2.316100000E-01 3.600000000E+01 +-1.560955945E+00 6.771933954E+00 1.384300000E-01 3.600000000E+01 +-1.537811996E+00 6.807113910E+00 4.327000000E-02 3.600000000E+01 +-1.511149429E+00 6.835357041E+00 -5.326000000E-02 3.600000000E+01 +-1.481128486E+00 6.856526149E+00 -1.506200000E-01 3.600000000E+01 +-1.447967187E+00 6.870597442E+00 -2.482300000E-01 3.600000000E+01 +-1.411925890E+00 6.877708089E+00 -3.455700000E-01 3.600000000E+01 +-1.373303472E+00 6.878070860E+00 -4.421800000E-01 3.600000000E+01 +-1.332277063E+00 6.871690737E+00 -5.375700000E-01 3.600000000E+01 +-1.288770758E+00 6.857733430E+00 -6.310500000E-01 3.600000000E+01 +-1.242537400E+00 6.834467838E+00 -7.213900000E-01 0.000000000E+00 7 AAE23_SC +-3.011970851E+00 6.259544073E+00 7.213900000E-01 3.600000000E+01 +-2.988241851E+00 6.305553258E+00 6.310500000E-01 3.600000000E+01 +-2.961243006E+00 6.342403748E+00 5.375700000E-01 3.600000000E+01 +-2.931802307E+00 6.371689414E+00 4.421800000E-01 3.600000000E+01 +-2.900339209E+00 6.394093307E+00 3.455700000E-01 3.600000000E+01 +-2.867008013E+00 6.409528871E+00 2.482300000E-01 3.600000000E+01 +-2.831907122E+00 6.417628524E+00 1.506200000E-01 3.600000000E+01 +-2.795177036E+00 6.418154023E+00 5.326000000E-02 3.600000000E+01 +-2.756997014E+00 6.410974349E+00 -4.327000000E-02 3.600000000E+01 +-2.717610761E+00 6.396116114E+00 -1.384300000E-01 3.600000000E+01 +-2.677194927E+00 6.373521053E+00 -2.316100000E-01 3.600000000E+01 +-2.636031529E+00 6.343680356E+00 -3.224100000E-01 3.600000000E+01 +-2.594402616E+00 6.307505806E+00 -4.106700000E-01 3.600000000E+01 +-2.552482738E+00 6.265495732E+00 -4.961600000E-01 3.600000000E+01 +-2.510439546E+00 6.218072619E+00 -5.787300000E-01 3.600000000E+01 +-2.468415488E+00 6.165671792E+00 -6.582400000E-01 3.600000000E+01 +-2.426534233E+00 6.108754018E+00 -7.346800000E-01 3.600000000E+01 +-2.384890916E+00 6.047770794E+00 -8.080400000E-01 3.600000000E+01 +-2.343554993E+00 5.983123214E+00 -8.783800000E-01 3.600000000E+01 +-2.302586167E+00 5.915177658E+00 -9.457800000E-01 3.600000000E+01 +-2.262024882E+00 5.844262707E+00 -1.010300000E+00 3.600000000E+01 +-2.221917520E+00 5.770656296E+00 -1.072020000E+00 3.600000000E+01 +-2.182275272E+00 5.694582869E+00 -1.131000000E+00 3.600000000E+01 +-2.143146891E+00 5.616215986E+00 -1.187270000E+00 3.600000000E+01 +-2.104552599E+00 5.535719937E+00 -1.240850000E+00 3.600000000E+01 +-2.066635984E+00 5.452846967E+00 -1.291210000E+00 3.600000000E+01 +-2.029417988E+00 5.367856231E+00 -1.338430000E+00 3.600000000E+01 +-1.992915981E+00 5.280953151E+00 -1.382610000E+00 3.600000000E+01 +-1.957187507E+00 5.192219512E+00 -1.423650000E+00 3.600000000E+01 +-1.922296051E+00 5.101686456E+00 -1.461420000E+00 3.600000000E+01 +-1.888649095E+00 5.008876534E+00 -1.494500000E+00 3.600000000E+01 +-1.856296832E+00 4.914153037E+00 -1.523040000E+00 3.600000000E+01 +-1.825232154E+00 4.817829094E+00 -1.547210000E+00 3.600000000E+01 +-1.795531864E+00 4.720024292E+00 -1.566880000E+00 3.600000000E+01 +-1.768201412E+00 4.620297754E+00 -1.579120000E+00 3.600000000E+01 +-1.743117701E+00 4.519513740E+00 -1.584800000E+00 3.600000000E+01 +-1.720100541E+00 4.418097376E+00 -1.584630000E+00 3.600000000E+01 +-1.700037024E+00 4.316263294E+00 -1.576410000E+00 3.600000000E+01 +-1.683871849E+00 4.215149099E+00 -1.558340000E+00 3.600000000E+01 +-1.670174200E+00 4.114983857E+00 -1.534290000E+00 3.600000000E+01 +-1.660756127E+00 4.017018759E+00 -1.500280000E+00 3.600000000E+01 +-1.657022526E+00 3.924275852E+00 -1.454390000E+00 3.600000000E+01 +-1.656658188E+00 3.834625463E+00 -1.401440000E+00 3.600000000E+01 +-1.662051019E+00 3.752691822E+00 -1.337940000E+00 3.600000000E+01 +-1.669332076E+00 3.673295878E+00 -1.270980000E+00 3.600000000E+01 +-1.681635950E+00 3.602776521E+00 -1.196060000E+00 3.600000000E+01 +-1.697100278E+00 3.537836889E+00 -1.116160000E+00 3.600000000E+01 +-1.713536006E+00 3.475052943E+00 -1.034990000E+00 3.600000000E+01 +-1.735546409E+00 3.424689573E+00 -9.465600000E-01 3.600000000E+01 +-1.757559902E+00 3.374316692E+00 -8.581200000E-01 3.600000000E+01 +-1.783036332E+00 3.333543774E+00 -7.663000000E-01 3.600000000E+01 +-1.811423274E+00 3.300834937E+00 -6.716100000E-01 3.600000000E+01 +-1.840728665E+00 3.271221411E+00 -5.764100000E-01 3.600000000E+01 +-1.873576830E+00 3.253809871E+00 -4.791500000E-01 3.600000000E+01 +-1.907304743E+00 3.240227606E+00 -3.818700000E-01 3.600000000E+01 +-1.944165398E+00 3.240238719E+00 -2.844900000E-01 3.600000000E+01 +-1.982437736E+00 3.248331616E+00 -1.882300000E-01 3.600000000E+01 +-2.021921286E+00 3.263925945E+00 -9.328000000E-02 3.600000000E+01 +-2.062749649E+00 3.290040753E+00 -1.130000000E-03 3.600000000E+01 +-2.104353570E+00 3.325839171E+00 8.727000000E-02 3.600000000E+01 +-2.146296131E+00 3.369170943E+00 1.720200000E-01 3.600000000E+01 +-2.188326217E+00 3.419449775E+00 2.528300000E-01 3.600000000E+01 +-2.230215512E+00 3.475760312E+00 3.296700000E-01 3.600000000E+01 +-2.271812026E+00 3.537243546E+00 4.026200000E-01 3.600000000E+01 +-2.313024163E+00 3.603081117E+00 4.719100000E-01 3.600000000E+01 +-2.353798849E+00 3.672530271E+00 5.378800000E-01 3.600000000E+01 +-2.394124623E+00 3.744914350E+00 6.009100000E-01 3.600000000E+01 +-2.434038295E+00 3.819667008E+00 6.614000000E-01 3.600000000E+01 +-2.473564797E+00 3.896323190E+00 7.197400000E-01 3.600000000E+01 +-2.512956532E+00 3.973555945E+00 7.773900000E-01 3.600000000E+01 +-2.552180228E+00 4.051564757E+00 8.341100000E-01 3.600000000E+01 +-2.591170991E+00 4.130549346E+00 8.896400000E-01 3.600000000E+01 +-2.629961854E+00 4.210278610E+00 9.442200000E-01 3.600000000E+01 +-2.668550205E+00 4.290825302E+00 9.977300000E-01 3.600000000E+01 +-2.706861642E+00 4.372386054E+00 1.049910000E+00 3.600000000E+01 +-2.744765896E+00 4.455297067E+00 1.100210000E+00 3.600000000E+01 +-2.782327382E+00 4.539295374E+00 1.148930000E+00 3.600000000E+01 +-2.819681586E+00 4.623899267E+00 1.196770000E+00 3.600000000E+01 +-2.856565124E+00 4.709822279E+00 1.242550000E+00 3.600000000E+01 +-2.892492809E+00 4.798136973E+00 1.284380000E+00 3.600000000E+01 +-2.927044316E+00 4.889295596E+00 1.320860000E+00 3.600000000E+01 +-2.959925298E+00 4.983265598E+00 1.351240000E+00 3.600000000E+01 +-2.990419404E+00 5.080245320E+00 1.373500000E+00 3.600000000E+01 +-3.018177081E+00 5.179595456E+00 1.387100000E+00 3.600000000E+01 +-3.042406072E+00 5.280680058E+00 1.390330000E+00 3.600000000E+01 +-3.061912035E+00 5.382385554E+00 1.380740000E+00 3.600000000E+01 +-3.077098343E+00 5.483276327E+00 1.360180000E+00 3.600000000E+01 +-3.087993914E+00 5.582163107E+00 1.329530000E+00 3.600000000E+01 +-3.094702105E+00 5.678080588E+00 1.289570000E+00 3.600000000E+01 +-3.097394284E+00 5.770274824E+00 1.241260000E+00 3.600000000E+01 +-3.096316255E+00 5.858215834E+00 1.185540000E+00 3.600000000E+01 +-3.090439074E+00 5.939666147E+00 1.121050000E+00 3.600000000E+01 +-3.080195427E+00 6.014135474E+00 1.049200000E+00 3.600000000E+01 +-3.066964436E+00 6.083333674E+00 9.726500000E-01 3.600000000E+01 +-3.051165527E+00 6.147523202E+00 8.923100000E-01 3.600000000E+01 +-3.032824832E+00 6.206397110E+00 8.084600000E-01 3.600000000E+01 +-3.011970851E+00 6.259544073E+00 7.213900000E-01 0.000000000E+00 7 AAE23_SC +-4.482614055E+00 5.402164681E+00 7.060900000E-01 3.600000000E+01 +-4.523677865E+00 5.399724674E+00 6.071600000E-01 3.600000000E+01 +-4.563073572E+00 5.394166585E+00 5.077700000E-01 3.600000000E+01 +-4.600322977E+00 5.384567470E+00 4.077700000E-01 3.600000000E+01 +-4.634565778E+00 5.369659426E+00 3.074100000E-01 3.600000000E+01 +-4.667831269E+00 5.353066933E+00 2.069400000E-01 3.600000000E+01 +-4.697266006E+00 5.330077589E+00 1.065300000E-01 3.600000000E+01 +-4.725868492E+00 5.305766367E+00 6.240000000E-03 3.600000000E+01 +-4.750652855E+00 5.275472467E+00 -9.349000000E-02 3.600000000E+01 +-4.774234744E+00 5.243410445E+00 -1.928800000E-01 3.600000000E+01 +-4.793850873E+00 5.205496522E+00 -2.911500000E-01 3.600000000E+01 +-4.812690403E+00 5.166510128E+00 -3.891000000E-01 3.600000000E+01 +-4.827835510E+00 5.122422417E+00 -4.855600000E-01 3.600000000E+01 +-4.842865529E+00 5.078171136E+00 -5.819600000E-01 3.600000000E+01 +-4.853241935E+00 5.027854974E+00 -6.759700000E-01 3.600000000E+01 +-4.863630943E+00 4.977532391E+00 -7.699800000E-01 3.600000000E+01 +-4.867812484E+00 4.919746306E+00 -8.599400000E-01 3.600000000E+01 +-4.870369517E+00 4.860002398E+00 -9.488300000E-01 3.600000000E+01 +-4.870132902E+00 4.797174251E+00 -1.035480000E+00 3.600000000E+01 +-4.867058174E+00 4.731236905E+00 -1.119870000E+00 3.600000000E+01 +-4.862769364E+00 4.664084938E+00 -1.203110000E+00 3.600000000E+01 +-4.852712826E+00 4.591157999E+00 -1.280960000E+00 3.600000000E+01 +-4.842662708E+00 4.518243660E+00 -1.358800000E+00 3.600000000E+01 +-4.824810051E+00 4.438535700E+00 -1.427910000E+00 3.600000000E+01 +-4.805668186E+00 4.357714886E+00 -1.495580000E+00 3.600000000E+01 +-4.782541753E+00 4.273980156E+00 -1.558010000E+00 3.600000000E+01 +-4.756798172E+00 4.188333086E+00 -1.617000000E+00 3.600000000E+01 +-4.727636907E+00 4.100713344E+00 -1.670760000E+00 3.600000000E+01 +-4.693625643E+00 4.010319075E+00 -1.717120000E+00 3.600000000E+01 +-4.657324462E+00 3.919044077E+00 -1.759350000E+00 3.600000000E+01 +-4.616446779E+00 3.826029732E+00 -1.793360000E+00 3.600000000E+01 +-4.573501524E+00 3.732680060E+00 -1.823030000E+00 3.600000000E+01 +-4.527136546E+00 3.638755499E+00 -1.845540000E+00 3.600000000E+01 +-4.477867607E+00 3.545128109E+00 -1.860860000E+00 3.600000000E+01 +-4.426146684E+00 3.451765998E+00 -1.870100000E+00 3.600000000E+01 +-4.370692373E+00 3.360250590E+00 -1.868120000E+00 3.600000000E+01 +-4.313529163E+00 3.270240794E+00 -1.860050000E+00 3.600000000E+01 +-4.254029449E+00 3.182794442E+00 -1.843010000E+00 3.600000000E+01 +-4.192263077E+00 3.100447224E+00 -1.813600000E+00 3.600000000E+01 +-4.129469722E+00 3.023202378E+00 -1.774710000E+00 3.600000000E+01 +-4.066187316E+00 2.952769825E+00 -1.725230000E+00 3.600000000E+01 +-4.003311146E+00 2.890859934E+00 -1.664860000E+00 3.600000000E+01 +-3.941892654E+00 2.838508305E+00 -1.594630000E+00 3.600000000E+01 +-3.882874827E+00 2.796210596E+00 -1.516010000E+00 3.600000000E+01 +-3.826976417E+00 2.764084684E+00 -1.430550000E+00 3.600000000E+01 +-3.774746156E+00 2.741930334E+00 -1.339760000E+00 3.600000000E+01 +-3.726378006E+00 2.729053518E+00 -1.245100000E+00 3.600000000E+01 +-3.681800559E+00 2.724379570E+00 -1.147850000E+00 3.600000000E+01 +-3.640967404E+00 2.727209960E+00 -1.048900000E+00 3.600000000E+01 +-3.603845926E+00 2.736997846E+00 -9.489300000E-01 3.600000000E+01 +-3.570410655E+00 2.753303851E+00 -8.485000000E-01 3.600000000E+01 +-3.540658709E+00 2.775748514E+00 -7.481100000E-01 3.600000000E+01 +-3.512799068E+00 2.801268446E+00 -6.478600000E-01 3.600000000E+01 +-3.485867504E+00 2.828236023E+00 -5.477400000E-01 3.600000000E+01 +-3.461374189E+00 2.858960957E+00 -4.480900000E-01 3.600000000E+01 +-3.439964222E+00 2.894273219E+00 -3.492500000E-01 3.600000000E+01 +-3.421466862E+00 2.933759833E+00 -2.514000000E-01 3.600000000E+01 +-3.403014205E+00 2.973303030E+00 -1.535700000E-01 3.600000000E+01 +-3.386280952E+00 3.015223925E+00 -5.642000000E-02 3.600000000E+01 +-3.371982587E+00 3.060459473E+00 3.963000000E-02 3.600000000E+01 +-3.359009853E+00 3.107440071E+00 1.350400000E-01 3.600000000E+01 +-3.345273602E+00 3.153405021E+00 2.308300000E-01 3.600000000E+01 +-3.330850640E+00 3.198473909E+00 3.269400000E-01 3.600000000E+01 +-3.320304933E+00 3.248566828E+00 4.210300000E-01 3.600000000E+01 +-3.312626380E+00 3.302262057E+00 5.134100000E-01 3.600000000E+01 +-3.306757326E+00 3.358122420E+00 6.046400000E-01 3.600000000E+01 +-3.302168000E+00 3.415513142E+00 6.949900000E-01 3.600000000E+01 +-3.298318879E+00 3.473764734E+00 7.848200000E-01 3.600000000E+01 +-3.296036243E+00 3.533829121E+00 8.735000000E-01 3.600000000E+01 +-3.296442159E+00 3.596880511E+00 9.600900000E-01 3.600000000E+01 +-3.299896139E+00 3.663203949E+00 1.044140000E+00 3.600000000E+01 +-3.305995618E+00 3.732258566E+00 1.125800000E+00 3.600000000E+01 +-3.316361025E+00 3.805464612E+00 1.203290000E+00 3.600000000E+01 +-3.332782057E+00 3.884044987E+00 1.274170000E+00 3.600000000E+01 +-3.354754591E+00 3.966994722E+00 1.338190000E+00 3.600000000E+01 +-3.382007292E+00 4.053563234E+00 1.394960000E+00 3.600000000E+01 +-3.413869138E+00 4.142838530E+00 1.444770000E+00 3.600000000E+01 +-3.449904503E+00 4.234090247E+00 1.487590000E+00 3.600000000E+01 +-3.490097185E+00 4.326850478E+00 1.522840000E+00 3.600000000E+01 +-3.534097633E+00 4.420479915E+00 1.550420000E+00 3.600000000E+01 +-3.581578647E+00 4.514367543E+00 1.570270000E+00 3.600000000E+01 +-3.632304801E+00 4.607911136E+00 1.582110000E+00 3.600000000E+01 +-3.686055883E+00 4.700429295E+00 1.585460000E+00 3.600000000E+01 +-3.742642340E+00 4.791113892E+00 1.579670000E+00 3.600000000E+01 +-3.801793764E+00 4.878920235E+00 1.563950000E+00 3.600000000E+01 +-3.863051668E+00 4.962605833E+00 1.537570000E+00 3.600000000E+01 +-3.925785651E+00 5.040777704E+00 1.500110000E+00 3.600000000E+01 +-3.989150382E+00 5.112057147E+00 1.451630000E+00 3.600000000E+01 +-4.052201885E+00 5.175401422E+00 1.392860000E+00 3.600000000E+01 +-4.114069446E+00 5.230254238E+00 1.325020000E+00 3.600000000E+01 +-4.174133231E+00 5.276613975E+00 1.249630000E+00 3.600000000E+01 +-4.231985754E+00 5.314958082E+00 1.168230000E+00 3.600000000E+01 +-4.287515561E+00 5.346017913E+00 1.082140000E+00 3.600000000E+01 +-4.340267554E+00 5.369414274E+00 9.918700000E-01 3.600000000E+01 +-4.389939315E+00 5.385301257E+00 8.983500000E-01 3.600000000E+01 +-4.437291363E+00 5.395965805E+00 8.029600000E-01 3.600000000E+01 +-4.482614055E+00 5.402164681E+00 7.060900000E-01 0.000000000E+00 6 AAE14_SC +-5.789244663062E+00 3.673149990695E+00 1.744954334000E-02 1.080000000000E+02 +-5.790079891250E+00 3.669089266494E+00 -7.150080869000E-02 1.080000000000E+02 +-5.787117198177E+00 3.661913984471E+00 -1.602254120000E-01 1.080000000000E+02 +-5.781209146452E+00 3.650346571501E+00 -2.484589536000E-01 1.080000000000E+02 +-5.772941001797E+00 3.633771675442E+00 -3.354886308000E-01 1.080000000000E+02 +-5.762792555558E+00 3.611630048928E+00 -4.212413326000E-01 1.080000000000E+02 +-5.751389032467E+00 3.583479563765E+00 -5.049593618000E-01 1.080000000000E+02 +-5.738996641435E+00 3.549382304645E+00 -5.863142345000E-01 1.080000000000E+02 +-5.725426631518E+00 3.510030512008E+00 -6.651770142000E-01 1.080000000000E+02 +-5.710378199217E+00 3.466440861825E+00 -7.412825815000E-01 1.080000000000E+02 +-5.694127100151E+00 3.418499089608E+00 -8.145657329000E-01 1.080000000000E+02 +-5.676388672514E+00 3.366931350421E+00 -8.850071242000E-01 1.080000000000E+02 +-5.654795890646E+00 3.314380931042E+00 -9.537419589000E-01 1.080000000000E+02 +-5.625684712672E+00 3.265010998436E+00 -1.021917209000E+00 1.080000000000E+02 +-5.587156822774E+00 3.221379302650E+00 -1.089263674000E+00 1.080000000000E+02 +-5.539072399539E+00 3.184480150531E+00 -1.154539058000E+00 1.080000000000E+02 +-5.484101699980E+00 3.151134787088E+00 -1.216246575000E+00 1.080000000000E+02 +-5.426018547185E+00 3.115130883929E+00 -1.273441742000E+00 1.080000000000E+02 +-5.364825174988E+00 3.076325237034E+00 -1.325285698000E+00 1.080000000000E+02 +-5.299317493929E+00 3.036726496389E+00 -1.370749447000E+00 1.080000000000E+02 +-5.229194975785E+00 2.996805365259E+00 -1.408608053000E+00 1.080000000000E+02 +-5.155111657306E+00 2.956672729642E+00 -1.437348696000E+00 1.080000000000E+02 +-5.078935349486E+00 2.914170208002E+00 -1.455639493000E+00 1.080000000000E+02 +-5.003626119580E+00 2.867032560257E+00 -1.462072215000E+00 1.080000000000E+02 +-4.931182615720E+00 2.815572173785E+00 -1.455667884000E+00 1.080000000000E+02 +-4.863646173486E+00 2.760986691472E+00 -1.435958561000E+00 1.080000000000E+02 +-4.802914475489E+00 2.704686498341E+00 -1.403042952000E+00 1.080000000000E+02 +-4.751021039205E+00 2.648165306257E+00 -1.357785149000E+00 1.080000000000E+02 +-4.709434216819E+00 2.592733679109E+00 -1.301808004000E+00 1.080000000000E+02 +-4.679066814169E+00 2.539282552089E+00 -1.237341473000E+00 1.080000000000E+02 +-4.659911117845E+00 2.488328085269E+00 -1.166812923000E+00 1.080000000000E+02 +-4.650187495517E+00 2.440790090430E+00 -1.092107862000E+00 1.080000000000E+02 +-4.644422408917E+00 2.400220971227E+00 -1.013024536000E+00 1.080000000000E+02 +-4.635685348353E+00 2.374119565207E+00 -9.282726209000E-01 1.080000000000E+02 +-4.627582512402E+00 2.363440721210E+00 -8.402099046000E-01 1.080000000000E+02 +-4.622173167912E+00 2.368519503995E+00 -7.514880132000E-01 1.080000000000E+02 +-4.619520976952E+00 2.389044050183E+00 -6.647899090000E-01 1.080000000000E+02 +-4.616792481848E+00 2.424889957894E+00 -5.833000314000E-01 1.080000000000E+02 +-4.609786322387E+00 2.474978535235E+00 -5.099892243000E-01 1.080000000000E+02 +-4.596913251105E+00 2.535229467525E+00 -4.456338674000E-01 1.080000000000E+02 +-4.579532390654E+00 2.600538607780E+00 -3.875539046000E-01 1.080000000000E+02 +-4.559180024532E+00 2.666988507495E+00 -3.318667032000E-01 1.080000000000E+02 +-4.539578898188E+00 2.730329187064E+00 -2.723890661000E-01 1.080000000000E+02 +-4.515260915489E+00 2.792149457530E+00 -2.130101728000E-01 1.080000000000E+02 +-4.489296459889E+00 2.848915044451E+00 -1.494783330000E-01 1.080000000000E+02 +-4.457625199199E+00 2.901961947227E+00 -8.530081591000E-02 1.080000000000E+02 +-4.419642245441E+00 2.946607802128E+00 -1.819661694000E-02 1.080000000000E+02 +-4.372657401463E+00 2.984766427525E+00 4.718627597000E-02 1.080000000000E+02 +-4.319842882246E+00 3.019360467640E+00 1.100117670000E-01 1.080000000000E+02 +-4.265527159572E+00 3.058567473285E+00 1.687606404000E-01 1.080000000000E+02 +-4.211636484935E+00 3.098265605432E+00 2.275175217000E-01 1.080000000000E+02 +-4.157895538522E+00 3.135010705548E+00 2.882948801000E-01 1.080000000000E+02 +-4.104245059655E+00 3.162155112620E+00 3.540587787000E-01 1.080000000000E+02 +-4.053145888490E+00 3.173907188474E+00 4.260584823000E-01 1.080000000000E+02 +-4.008974636295E+00 3.169252423319E+00 5.032871173000E-01 1.080000000000E+02 +-3.975230690834E+00 3.151433979212E+00 5.837632627000E-01 1.080000000000E+02 +-3.952940653843E+00 3.124551778260E+00 6.657541041000E-01 1.080000000000E+02 +-3.941721171414E+00 3.091290776949E+00 7.475896770000E-01 1.080000000000E+02 +-3.941074821514E+00 3.051779020136E+00 8.274301477000E-01 1.080000000000E+02 +-3.948994221344E+00 3.008754408769E+00 9.050198505000E-01 1.080000000000E+02 +-3.963010684267E+00 2.969909407782E+00 9.840199882000E-01 1.080000000000E+02 +-3.983381660474E+00 2.942480819057E+00 1.066259509000E+00 1.080000000000E+02 +-4.012598312439E+00 2.928054235666E+00 1.149164457000E+00 1.080000000000E+02 +-4.052512203578E+00 2.925767008760E+00 1.228771473000E+00 1.080000000000E+02 +-4.103178720425E+00 2.934746049668E+00 1.301455248000E+00 1.080000000000E+02 +-4.162963347567E+00 2.954398023914E+00 1.364609021000E+00 1.080000000000E+02 +-4.228393034589E+00 2.985438811670E+00 1.416487546000E+00 1.080000000000E+02 +-4.295472075600E+00 3.028191471348E+00 1.456473280000E+00 1.080000000000E+02 +-4.360449028426E+00 3.082126306899E+00 1.484801442000E+00 1.080000000000E+02 +-4.421066063897E+00 3.144927129157E+00 1.502532507000E+00 1.080000000000E+02 +-4.478923778266E+00 3.212093441455E+00 1.511502484000E+00 1.080000000000E+02 +-4.536881660074E+00 3.279802615009E+00 1.512984118000E+00 1.080000000000E+02 +-4.597734628014E+00 3.344512103091E+00 1.507450791000E+00 1.080000000000E+02 +-4.663620125258E+00 3.403114789892E+00 1.494787468000E+00 1.080000000000E+02 +-4.732848750572E+00 3.455546368438E+00 1.474786583000E+00 1.080000000000E+02 +-4.803522397840E+00 3.502429224377E+00 1.447633049000E+00 1.080000000000E+02 +-4.875436231060E+00 3.542679820495E+00 1.413793625000E+00 1.080000000000E+02 +-4.948356703474E+00 3.575088967382E+00 1.374018251000E+00 1.080000000000E+02 +-5.021652185732E+00 3.598831201791E+00 1.329400646000E+00 1.080000000000E+02 +-5.095089486220E+00 3.613412613711E+00 1.280975246000E+00 1.080000000000E+02 +-5.168092509902E+00 3.617952343467E+00 1.230287750000E+00 1.080000000000E+02 +-5.240086111456E+00 3.614061869634E+00 1.177853833000E+00 1.080000000000E+02 +-5.309818565295E+00 3.606110895709E+00 1.123012040000E+00 1.080000000000E+02 +-5.376638575125E+00 3.597150166436E+00 1.064920566000E+00 1.080000000000E+02 +-5.439524025522E+00 3.591327458130E+00 1.002061223000E+00 1.080000000000E+02 +-5.496261345829E+00 3.593387301672E+00 9.334175927000E-01 1.080000000000E+02 +-5.546219827819E+00 3.602219665256E+00 8.601609198000E-01 1.080000000000E+02 +-5.590641027479E+00 3.613615008263E+00 7.837241475000E-01 1.080000000000E+02 +-5.630153212544E+00 3.625627444386E+00 7.047985910000E-01 1.080000000000E+02 +-5.665048386568E+00 3.637432599697E+00 6.236520547000E-01 1.080000000000E+02 +-5.695550411069E+00 3.648128726882E+00 5.407768227000E-01 1.080000000000E+02 +-5.722020493968E+00 3.657077513997E+00 4.560661339000E-01 1.080000000000E+02 +-5.744009721588E+00 3.664526437129E+00 3.701617308000E-01 1.080000000000E+02 +-5.761352680941E+00 3.670703159217E+00 2.829651087000E-01 1.080000000000E+02 +-5.774572862576E+00 3.674434682558E+00 1.949310037000E-01 1.080000000000E+02 +-5.783965857593E+00 3.675103936170E+00 1.063739981000E-01 1.080000000000E+02 +-5.789244663062E+00 3.673149990695E+00 1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +-6.185200639253E+00 2.789637852993E+00 2.786784824000E-03 1.080000000000E+02 +-6.191797631515E+00 2.781197561520E+00 -8.489061568000E-02 1.080000000000E+02 +-6.194743443205E+00 2.770554926826E+00 -1.724869752000E-01 1.080000000000E+02 +-6.193393036704E+00 2.759403634469E+00 -2.600860194000E-01 1.080000000000E+02 +-6.186859839074E+00 2.749879928204E+00 -3.477269332000E-01 1.080000000000E+02 +-6.175102175986E+00 2.741587685877E+00 -4.348356053000E-01 1.080000000000E+02 +-6.158072651825E+00 2.733934432363E+00 -5.212198625000E-01 1.080000000000E+02 +-6.134938398870E+00 2.728741224138E+00 -6.062523787000E-01 1.080000000000E+02 +-6.104629730435E+00 2.728319285754E+00 -6.892798267000E-01 1.080000000000E+02 +-6.067629597608E+00 2.731199009675E+00 -7.694019289000E-01 1.080000000000E+02 +-6.023684332775E+00 2.738409274062E+00 -8.457732406000E-01 1.080000000000E+02 +-5.974040821249E+00 2.747064634953E+00 -9.182365063000E-01 1.080000000000E+02 +-5.920326929217E+00 2.751440783347E+00 -9.881923803000E-01 1.080000000000E+02 +-5.863038189406E+00 2.750661471678E+00 -1.055471471000E+00 1.080000000000E+02 +-5.803812966868E+00 2.740337384015E+00 -1.120196685000E+00 1.080000000000E+02 +-5.744257877202E+00 2.717604511241E+00 -1.181327921000E+00 1.080000000000E+02 +-5.684354620428E+00 2.684195862123E+00 -1.237059622000E+00 1.080000000000E+02 +-5.625209932722E+00 2.639601254795E+00 -1.285194785000E+00 1.080000000000E+02 +-5.567800482783E+00 2.584203256573E+00 -1.323067807000E+00 1.080000000000E+02 +-5.511832431131E+00 2.520693765774E+00 -1.348281183000E+00 1.080000000000E+02 +-5.458259328618E+00 2.451216041613E+00 -1.358569067000E+00 1.080000000000E+02 +-5.408794019215E+00 2.378213713136E+00 -1.353085167000E+00 1.080000000000E+02 +-5.366620058506E+00 2.303232352352E+00 -1.333014261000E+00 1.080000000000E+02 +-5.331073343266E+00 2.228715664316E+00 -1.301720477000E+00 1.080000000000E+02 +-5.300358795546E+00 2.155943081552E+00 -1.262085734000E+00 1.080000000000E+02 +-5.270077523386E+00 2.087184096781E+00 -1.215714425000E+00 1.080000000000E+02 +-5.235376961743E+00 2.025717042657E+00 -1.162638692000E+00 1.080000000000E+02 +-5.196442504424E+00 1.973578202421E+00 -1.102951579000E+00 1.080000000000E+02 +-5.152060153432E+00 1.934750986684E+00 -1.037139043000E+00 1.080000000000E+02 +-5.103931324573E+00 1.911482525150E+00 -9.667867241000E-01 1.080000000000E+02 +-5.054837707161E+00 1.904839404754E+00 -8.936981911000E-01 1.080000000000E+02 +-5.008976189582E+00 1.915138651095E+00 -8.188905247000E-01 1.080000000000E+02 +-4.973032147522E+00 1.940104066297E+00 -7.421450537000E-01 1.080000000000E+02 +-4.948671844402E+00 1.979127046412E+00 -6.667474988000E-01 1.080000000000E+02 +-4.928064329784E+00 2.031918084324E+00 -5.989634359000E-01 1.080000000000E+02 +-4.904609672106E+00 2.093426032197E+00 -5.400717519000E-01 1.080000000000E+02 +-4.881685338879E+00 2.154358214530E+00 -4.803836822000E-01 1.080000000000E+02 +-4.853749724095E+00 2.215239376432E+00 -4.228264178000E-01 1.080000000000E+02 +-4.819088087078E+00 2.274277190437E+00 -3.670458051000E-01 1.080000000000E+02 +-4.778507052514E+00 2.329510526907E+00 -3.112409570000E-01 1.080000000000E+02 +-4.734808869131E+00 2.380217782429E+00 -2.536123470000E-01 1.080000000000E+02 +-4.690462435968E+00 2.428796032661E+00 -1.946452353000E-01 1.080000000000E+02 +-4.646284842814E+00 2.478351193358E+00 -1.364003779000E-01 1.080000000000E+02 +-4.601300336474E+00 2.528983940601E+00 -7.966775233000E-02 1.080000000000E+02 +-4.553932002388E+00 2.579572171854E+00 -2.494784873000E-02 1.080000000000E+02 +-4.502158707430E+00 2.626423792184E+00 2.916971350000E-02 1.080000000000E+02 +-4.444835431003E+00 2.663923062056E+00 8.494149535000E-02 1.080000000000E+02 +-4.383762771064E+00 2.687131029132E+00 1.443669380000E-01 1.080000000000E+02 +-4.323534848363E+00 2.696702921211E+00 2.083126740000E-01 1.080000000000E+02 +-4.268233921564E+00 2.693529982783E+00 2.770763044000E-01 1.080000000000E+02 +-4.219605075076E+00 2.680893413993E+00 3.497702850000E-01 1.080000000000E+02 +-4.179390228648E+00 2.654458584685E+00 4.238156204000E-01 1.080000000000E+02 +-4.148092802457E+00 2.614288911766E+00 4.959805589000E-01 1.080000000000E+02 +-4.124608112325E+00 2.564354992089E+00 5.649597706000E-01 1.080000000000E+02 +-4.107227752228E+00 2.509463881454E+00 6.319745517000E-01 1.080000000000E+02 +-4.094237567504E+00 2.456877176228E+00 7.017224202000E-01 1.080000000000E+02 +-4.086027513293E+00 2.412659735390E+00 7.777589224000E-01 1.080000000000E+02 +-4.084769738982E+00 2.378668055386E+00 8.592609358000E-01 1.080000000000E+02 +-4.092552937763E+00 2.354843323428E+00 9.439925506000E-01 1.080000000000E+02 +-4.110787719172E+00 2.340577429523E+00 1.029225643000E+00 1.080000000000E+02 +-4.140036211432E+00 2.335304397772E+00 1.112414355000E+00 1.080000000000E+02 +-4.179750457504E+00 2.339323935519E+00 1.191204722000E+00 1.080000000000E+02 +-4.228633367792E+00 2.352119363463E+00 1.263647540000E+00 1.080000000000E+02 +-4.285316167173E+00 2.371816101289E+00 1.328492129000E+00 1.080000000000E+02 +-4.348243718121E+00 2.397231544787E+00 1.385061074000E+00 1.080000000000E+02 +-4.414847415358E+00 2.429973507896E+00 1.432913650000E+00 1.080000000000E+02 +-4.483067335390E+00 2.470238896058E+00 1.472011314000E+00 1.080000000000E+02 +-4.554008597152E+00 2.512836206104E+00 1.502926011000E+00 1.080000000000E+02 +-4.629240480235E+00 2.552830527118E+00 1.525941209000E+00 1.080000000000E+02 +-4.708616962488E+00 2.588738035550E+00 1.540955846000E+00 1.080000000000E+02 +-4.790974979445E+00 2.619687894514E+00 1.547836060000E+00 1.080000000000E+02 +-4.875457375085E+00 2.645544469074E+00 1.546702180000E+00 1.080000000000E+02 +-4.960995122121E+00 2.665951185542E+00 1.537810757000E+00 1.080000000000E+02 +-5.046702491415E+00 2.679647481369E+00 1.521653119000E+00 1.080000000000E+02 +-5.131747700730E+00 2.686728079865E+00 1.498846663000E+00 1.080000000000E+02 +-5.215169184235E+00 2.690366451431E+00 1.469852265000E+00 1.080000000000E+02 +-5.296219652312E+00 2.693111782174E+00 1.435050927000E+00 1.080000000000E+02 +-5.374689228393E+00 2.696561347132E+00 1.394624322000E+00 1.080000000000E+02 +-5.450032155980E+00 2.701948835443E+00 1.348880339000E+00 1.080000000000E+02 +-5.522008362834E+00 2.709335385968E+00 1.298134958000E+00 1.080000000000E+02 +-5.590241602738E+00 2.718711295478E+00 1.242822431000E+00 1.080000000000E+02 +-5.654282523306E+00 2.730991358472E+00 1.183240350000E+00 1.080000000000E+02 +-5.713759208728E+00 2.746624412702E+00 1.119713595000E+00 1.080000000000E+02 +-5.768940391677E+00 2.763250432470E+00 1.052910239000E+00 1.080000000000E+02 +-5.820942184851E+00 2.777913696904E+00 9.829305340000E-01 1.080000000000E+02 +-5.869633873143E+00 2.790291584336E+00 9.103747398000E-01 1.080000000000E+02 +-5.915013994723E+00 2.800936705851E+00 8.352590367000E-01 1.080000000000E+02 +-5.957176401643E+00 2.808997093993E+00 7.581530132000E-01 1.080000000000E+02 +-5.996473926561E+00 2.813814942847E+00 6.790841041000E-01 1.080000000000E+02 +-6.032418563888E+00 2.816542436502E+00 5.984352213000E-01 1.080000000000E+02 +-6.064555616544E+00 2.818655344655E+00 5.162774167000E-01 1.080000000000E+02 +-6.092983879740E+00 2.819959610032E+00 4.326343739000E-01 1.080000000000E+02 +-6.118010444224E+00 2.819229698936E+00 3.478877549000E-01 1.080000000000E+02 +-6.139978740735E+00 2.815147020432E+00 2.624374443000E-01 1.080000000000E+02 +-6.159055610109E+00 2.807144561192E+00 1.765219348000E-01 1.080000000000E+02 +-6.174412389155E+00 2.797761389012E+00 9.012406132000E-02 1.080000000000E+02 +-6.185200639253E+00 2.789637852993E+00 2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +-6.399255198605E+00 2.018777681744E+00 3.632685538000E-02 1.080000000000E+02 +-6.400573377281E+00 2.044514942062E+00 -4.805479793000E-02 1.080000000000E+02 +-6.397676089502E+00 2.068158827302E+00 -1.330022602000E-01 1.080000000000E+02 +-6.389808580793E+00 2.093766387529E+00 -2.170477619000E-01 1.080000000000E+02 +-6.377298851880E+00 2.121217541200E+00 -2.999547317000E-01 1.080000000000E+02 +-6.360179227382E+00 2.151624032493E+00 -3.810313384000E-01 1.080000000000E+02 +-6.339335753527E+00 2.181927350756E+00 -4.611599500000E-01 1.080000000000E+02 +-6.315597026060E+00 2.207365134177E+00 -5.422183342000E-01 1.080000000000E+02 +-6.288987103395E+00 2.225950176269E+00 -6.243033587000E-01 1.080000000000E+02 +-6.259492025803E+00 2.235623464260E+00 -7.068846032000E-01 1.080000000000E+02 +-6.226447232564E+00 2.237240621721E+00 -7.885880029000E-01 1.080000000000E+02 +-6.189402287163E+00 2.230167278864E+00 -8.684143517000E-01 1.080000000000E+02 +-6.149159899523E+00 2.210691789373E+00 -9.444199619000E-01 1.080000000000E+02 +-6.106189512226E+00 2.177669486845E+00 -1.014026757000E+00 1.080000000000E+02 +-6.060752809475E+00 2.131893444998E+00 -1.074292285000E+00 1.080000000000E+02 +-6.013079686787E+00 2.075466827554E+00 -1.122466283000E+00 1.080000000000E+02 +-5.963817304865E+00 2.010773413262E+00 -1.156570420000E+00 1.080000000000E+02 +-5.914847123518E+00 1.939862574804E+00 -1.175727956000E+00 1.080000000000E+02 +-5.870514185206E+00 1.863743381068E+00 -1.180212576000E+00 1.080000000000E+02 +-5.836256604612E+00 1.782870431418E+00 -1.172009822000E+00 1.080000000000E+02 +-5.809180789739E+00 1.700554693752E+00 -1.155518699000E+00 1.080000000000E+02 +-5.775064868579E+00 1.622079551984E+00 -1.133893710000E+00 1.080000000000E+02 +-5.726730228128E+00 1.553591507583E+00 -1.106430447000E+00 1.080000000000E+02 +-5.669168923254E+00 1.497359400687E+00 -1.070335916000E+00 1.080000000000E+02 +-5.609175004223E+00 1.453648350018E+00 -1.022604995000E+00 1.080000000000E+02 +-5.554415274675E+00 1.420998666969E+00 -9.616664656000E-01 1.080000000000E+02 +-5.504063051176E+00 1.403475327544E+00 -8.913395217000E-01 1.080000000000E+02 +-5.450886336670E+00 1.403420148788E+00 -8.209661657000E-01 1.080000000000E+02 +-5.389962920314E+00 1.417602228306E+00 -7.587395914000E-01 1.080000000000E+02 +-5.323116481349E+00 1.445747890470E+00 -7.085053980000E-01 1.080000000000E+02 +-5.257301346545E+00 1.488562356205E+00 -6.683070249000E-01 1.080000000000E+02 +-5.198186141910E+00 1.542354851087E+00 -6.309463669000E-01 1.080000000000E+02 +-5.148235669913E+00 1.602945014898E+00 -5.907387262000E-01 1.080000000000E+02 +-5.106776513804E+00 1.667952176469E+00 -5.478583852000E-01 1.080000000000E+02 +-5.068405470993E+00 1.730679030507E+00 -4.991121880000E-01 1.080000000000E+02 +-5.027388287963E+00 1.788021292841E+00 -4.461358974000E-01 1.080000000000E+02 +-4.979596673625E+00 1.838989904372E+00 -3.922509070000E-01 1.080000000000E+02 +-4.924699835305E+00 1.884547706365E+00 -3.403860995000E-01 1.080000000000E+02 +-4.865728112936E+00 1.928529390973E+00 -2.916382842000E-01 1.080000000000E+02 +-4.807982462663E+00 1.977318506233E+00 -2.462074493000E-01 1.080000000000E+02 +-4.755504579220E+00 2.033741144271E+00 -2.031942363000E-01 1.080000000000E+02 +-4.702490541491E+00 2.085239653880E+00 -1.550619236000E-01 1.080000000000E+02 +-4.647187697187E+00 2.125906425947E+00 -9.962429365000E-02 1.080000000000E+02 +-4.588873300583E+00 2.151265353908E+00 -3.845435998000E-02 1.080000000000E+02 +-4.528086223431E+00 2.162324628412E+00 2.448555749000E-02 1.080000000000E+02 +-4.465440076926E+00 2.158031960579E+00 8.649636904000E-02 1.080000000000E+02 +-4.403303136645E+00 2.138797639387E+00 1.460500498000E-01 1.080000000000E+02 +-4.344077535693E+00 2.107804379082E+00 2.036424630000E-01 1.080000000000E+02 +-4.289187739588E+00 2.069264701462E+00 2.609630366000E-01 1.080000000000E+02 +-4.240025043462E+00 2.024110708160E+00 3.185973837000E-01 1.080000000000E+02 +-4.197548464413E+00 1.972704233485E+00 3.764466502000E-01 1.080000000000E+02 +-4.162064683787E+00 1.916772472147E+00 4.346658470000E-01 1.080000000000E+02 +-4.132321961495E+00 1.864064767955E+00 4.988404496000E-01 1.080000000000E+02 +-4.109899274600E+00 1.816720474893E+00 5.697936167000E-01 1.080000000000E+02 +-4.096537275408E+00 1.773585626789E+00 6.456312705000E-01 1.080000000000E+02 +-4.093167516923E+00 1.735720064440E+00 7.252260042000E-01 1.080000000000E+02 +-4.100216611807E+00 1.704102786728E+00 8.072828216000E-01 1.080000000000E+02 +-4.117553430723E+00 1.678089393109E+00 8.897856590000E-01 1.080000000000E+02 +-4.144654699884E+00 1.657032137467E+00 9.710448039000E-01 1.080000000000E+02 +-4.180930136357E+00 1.642234004049E+00 1.050138721000E+00 1.080000000000E+02 +-4.225480280017E+00 1.632761659682E+00 1.125601149000E+00 1.080000000000E+02 +-4.277545914347E+00 1.630370840944E+00 1.196814028000E+00 1.080000000000E+02 +-4.336007981876E+00 1.635390497070E+00 1.262691804000E+00 1.080000000000E+02 +-4.400560802767E+00 1.641444561629E+00 1.322504398000E+00 1.080000000000E+02 +-4.471026521022E+00 1.643578751634E+00 1.375655668000E+00 1.080000000000E+02 +-4.546276568305E+00 1.644444084540E+00 1.421583532000E+00 1.080000000000E+02 +-4.625623583588E+00 1.647423251126E+00 1.460188986000E+00 1.080000000000E+02 +-4.707858881022E+00 1.654811039134E+00 1.491069996000E+00 1.080000000000E+02 +-4.791891207169E+00 1.668803176634E+00 1.513978101000E+00 1.080000000000E+02 +-4.876751232219E+00 1.687781161448E+00 1.528680731000E+00 1.080000000000E+02 +-4.962142901860E+00 1.709307923191E+00 1.535219663000E+00 1.080000000000E+02 +-5.047223790435E+00 1.732303553302E+00 1.533750385000E+00 1.080000000000E+02 +-5.131697903997E+00 1.756036235416E+00 1.524583142000E+00 1.080000000000E+02 +-5.215284198922E+00 1.779296073690E+00 1.508093490000E+00 1.080000000000E+02 +-5.297488973136E+00 1.800804489549E+00 1.484797470000E+00 1.080000000000E+02 +-5.378351681544E+00 1.819927558124E+00 1.455093589000E+00 1.080000000000E+02 +-5.457525882539E+00 1.836023909372E+00 1.419493916000E+00 1.080000000000E+02 +-5.534589379343E+00 1.848797711385E+00 1.378577601000E+00 1.080000000000E+02 +-5.609466391429E+00 1.857916794781E+00 1.332770951000E+00 1.080000000000E+02 +-5.681828417148E+00 1.863519969467E+00 1.282612075000E+00 1.080000000000E+02 +-5.751464472298E+00 1.865887614719E+00 1.228575236000E+00 1.080000000000E+02 +-5.818299815750E+00 1.865856398085E+00 1.170998922000E+00 1.080000000000E+02 +-5.882252832622E+00 1.864378547989E+00 1.110182121000E+00 1.080000000000E+02 +-5.943232490397E+00 1.862605465989E+00 1.046417130000E+00 1.080000000000E+02 +-6.001144868070E+00 1.861806644106E+00 9.799657947000E-01 1.080000000000E+02 +-6.056041884050E+00 1.863164972047E+00 9.108702606000E-01 1.080000000000E+02 +-6.107703062878E+00 1.867554521408E+00 8.394336353000E-01 1.080000000000E+02 +-6.156033360213E+00 1.873707607248E+00 7.659096737000E-01 1.080000000000E+02 +-6.201050816668E+00 1.880089776024E+00 6.903510399000E-01 1.080000000000E+02 +-6.242542205634E+00 1.887531087607E+00 6.127886991000E-01 1.080000000000E+02 +-6.280028634902E+00 1.897143160455E+00 5.335701480000E-01 1.080000000000E+02 +-6.313165889127E+00 1.909577972585E+00 4.527156872000E-01 1.080000000000E+02 +-6.341404394176E+00 1.925340662247E+00 3.706549346000E-01 1.080000000000E+02 +-6.364088048491E+00 1.945599564827E+00 2.879184587000E-01 1.080000000000E+02 +-6.381260128288E+00 1.968575271623E+00 2.044325232000E-01 1.080000000000E+02 +-6.392786513762E+00 1.993794673114E+00 1.206362437000E-01 1.080000000000E+02 +-6.399255198605E+00 2.018777681744E+00 3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +-6.490955111016E+00 1.459809917170E+00 3.187537464000E-02 1.080000000000E+02 +-6.500518682094E+00 1.501403584884E+00 -4.635841915000E-02 1.080000000000E+02 +-6.505378036944E+00 1.537959689789E+00 -1.274648788000E-01 1.080000000000E+02 +-6.505941072933E+00 1.565743396939E+00 -2.120822207000E-01 1.080000000000E+02 +-6.502764148823E+00 1.581153917295E+00 -2.997983967000E-01 1.080000000000E+02 +-6.496180532716E+00 1.583184933401E+00 -3.886351210000E-01 1.080000000000E+02 +-6.486677357143E+00 1.571113930543E+00 -4.764366174000E-01 1.080000000000E+02 +-6.474873094724E+00 1.544156712690E+00 -5.605003417000E-01 1.080000000000E+02 +-6.461354625690E+00 1.501939981806E+00 -6.378051764000E-01 1.080000000000E+02 +-6.445714163522E+00 1.447082213292E+00 -7.062104980000E-01 1.080000000000E+02 +-6.426877754613E+00 1.382403021475E+00 -7.645271884000E-01 1.080000000000E+02 +-6.404135131187E+00 1.309706891409E+00 -8.108473046000E-01 1.080000000000E+02 +-6.377429242178E+00 1.231100523247E+00 -8.432354714000E-01 1.080000000000E+02 +-6.347688285768E+00 1.148993323981E+00 -8.607369806000E-01 1.080000000000E+02 +-6.316366732510E+00 1.065611925873E+00 -8.640060786000E-01 1.080000000000E+02 +-6.282251886607E+00 9.836845983054E-01 -8.562220560000E-01 1.080000000000E+02 +-6.237135951012E+00 9.079964125047E-01 -8.427262700000E-01 1.080000000000E+02 +-6.178910312308E+00 8.431354354179E-01 -8.243174216000E-01 1.080000000000E+02 +-6.111147068669E+00 7.901244757511E-01 -8.012208021000E-01 1.080000000000E+02 +-6.035501359083E+00 7.495194702663E-01 -7.773689488000E-01 1.080000000000E+02 +-5.953076799728E+00 7.218185868837E-01 -7.578816060000E-01 1.080000000000E+02 +-5.865817395497E+00 7.087698858006E-01 -7.452820520000E-01 1.080000000000E+02 +-5.777249302699E+00 7.125836106678E-01 -7.366388673000E-01 1.080000000000E+02 +-5.690818339166E+00 7.319266620531E-01 -7.270540685000E-01 1.080000000000E+02 +-5.609406943534E+00 7.658559508940E-01 -7.142960837000E-01 1.080000000000E+02 +-5.534917401835E+00 8.120194928205E-01 -6.982493624000E-01 1.080000000000E+02 +-5.468899545991E+00 8.690063994831E-01 -6.800217467000E-01 1.080000000000E+02 +-5.409615243900E+00 9.327851073440E-01 -6.610368381000E-01 1.080000000000E+02 +-5.354117635668E+00 9.998910479124E-01 -6.421364412000E-01 1.080000000000E+02 +-5.299252941616E+00 1.067454282486E+00 -6.230907784000E-01 1.080000000000E+02 +-5.243473841106E+00 1.133855491246E+00 -6.026804297000E-01 1.080000000000E+02 +-5.185124433333E+00 1.196630231436E+00 -5.783904634000E-01 1.080000000000E+02 +-5.126735976332E+00 1.256674228544E+00 -5.479092097000E-01 1.080000000000E+02 +-5.069418729743E+00 1.313359309416E+00 -5.099632237000E-01 1.080000000000E+02 +-5.019553803223E+00 1.374075992658E+00 -4.679474510000E-01 1.080000000000E+02 +-4.969133789326E+00 1.431891752693E+00 -4.226801226000E-01 1.080000000000E+02 +-4.913320534824E+00 1.482991990894E+00 -3.756353333000E-01 1.080000000000E+02 +-4.849350448159E+00 1.523130318885E+00 -3.283193574000E-01 1.080000000000E+02 +-4.777787563506E+00 1.549211924013E+00 -2.820781068000E-01 1.080000000000E+02 +-4.701088244567E+00 1.558494597331E+00 -2.376983871000E-01 1.080000000000E+02 +-4.622976643115E+00 1.551126642878E+00 -1.954128437000E-01 1.080000000000E+02 +-4.546837354595E+00 1.526978931460E+00 -1.560456650000E-01 1.080000000000E+02 +-4.475698796728E+00 1.485459543836E+00 -1.219181286000E-01 1.080000000000E+02 +-4.411054542979E+00 1.431277513911E+00 -9.346268448000E-02 1.080000000000E+02 +-4.350785222709E+00 1.371403257923E+00 -6.642283384000E-02 1.080000000000E+02 +-4.293194379053E+00 1.310844118981E+00 -3.558837129000E-02 1.080000000000E+02 +-4.238108228674E+00 1.252855525263E+00 3.754172340000E-03 1.080000000000E+02 +-4.187353166278E+00 1.199495573054E+00 5.388091285000E-02 1.080000000000E+02 +-4.143054718034E+00 1.150384957513E+00 1.135748529000E-01 1.080000000000E+02 +-4.106363095865E+00 1.104759428445E+00 1.807565333000E-01 1.080000000000E+02 +-4.077856595608E+00 1.063254066160E+00 2.542191153000E-01 1.080000000000E+02 +-4.057818690958E+00 1.026556858257E+00 3.329023539000E-01 1.080000000000E+02 +-4.046357082387E+00 9.950306200407E-01 4.155171011000E-01 1.080000000000E+02 +-4.043414223550E+00 9.687495503328E-01 5.006187195000E-01 1.080000000000E+02 +-4.048855209561E+00 9.478612886741E-01 5.870384289000E-01 1.080000000000E+02 +-4.062486034977E+00 9.325472681650E-01 6.737108263000E-01 1.080000000000E+02 +-4.084035588936E+00 9.225945118628E-01 7.596450919000E-01 1.080000000000E+02 +-4.113063472634E+00 9.165569748386E-01 8.436327263000E-01 1.080000000000E+02 +-4.149318148914E+00 9.120013820859E-01 9.249046690000E-01 1.080000000000E+02 +-4.192674384768E+00 9.079528701354E-01 1.002637062000E+00 1.080000000000E+02 +-4.242981535986E+00 9.050687670257E-01 1.076114245000E+00 1.080000000000E+02 +-4.299935996527E+00 9.032168602644E-01 1.144593485000E+00 1.080000000000E+02 +-4.363156697360E+00 9.020797402571E-01 1.207380380000E+00 1.080000000000E+02 +-4.431982011791E+00 9.029019180504E-01 1.263842748000E+00 1.080000000000E+02 +-4.505715636485E+00 9.079616920992E-01 1.313751841000E+00 1.080000000000E+02 +-4.583310749226E+00 9.168874402221E-01 1.356669215000E+00 1.080000000000E+02 +-4.664298132151E+00 9.268117142000E-01 1.392276244000E+00 1.080000000000E+02 +-4.748669576192E+00 9.345854205200E-01 1.420151472000E+00 1.080000000000E+02 +-4.835495309800E+00 9.378583811036E-01 1.439465232000E+00 1.080000000000E+02 +-4.924056941429E+00 9.366848742232E-01 1.449884186000E+00 1.080000000000E+02 +-5.013048248725E+00 9.323502112759E-01 1.451432017000E+00 1.080000000000E+02 +-5.101350426366E+00 9.239897117012E-01 1.443978096000E+00 1.080000000000E+02 +-5.187913405626E+00 9.106766262263E-01 1.427519630000E+00 1.080000000000E+02 +-5.271822839106E+00 8.935473130374E-01 1.402784195000E+00 1.080000000000E+02 +-5.353000263804E+00 8.752980475137E-01 1.371062779000E+00 1.080000000000E+02 +-5.432065235910E+00 8.585352977597E-01 1.333595471000E+00 1.080000000000E+02 +-5.509956111823E+00 8.468742969206E-01 1.291888617000E+00 1.080000000000E+02 +-5.587032380154E+00 8.429165726761E-01 1.247327499000E+00 1.080000000000E+02 +-5.663011947997E+00 8.484118558215E-01 1.201173169000E+00 1.080000000000E+02 +-5.737189038870E+00 8.638750761987E-01 1.154170635000E+00 1.080000000000E+02 +-5.808378773706E+00 8.879598820644E-01 1.106391465000E+00 1.080000000000E+02 +-5.876098265940E+00 9.181214621024E-01 1.056863518000E+00 1.080000000000E+02 +-5.940092840407E+00 9.513807734457E-01 1.004521395000E+00 1.080000000000E+02 +-6.000761895375E+00 9.837724240082E-01 9.479798854000E-01 1.080000000000E+02 +-6.058229648719E+00 1.015330662062E+00 8.876176364000E-01 1.080000000000E+02 +-6.112678413404E+00 1.045078774963E+00 8.236903164000E-01 1.080000000000E+02 +-6.163918962311E+00 1.075456553350E+00 7.574711850000E-01 1.080000000000E+02 +-6.211950484676E+00 1.107662399052E+00 6.895838911000E-01 1.080000000000E+02 +-6.256599511163E+00 1.142170324711E+00 6.207042323000E-01 1.080000000000E+02 +-6.298166866971E+00 1.178406105819E+00 5.506192747000E-01 1.080000000000E+02 +-6.336660202547E+00 1.215633433764E+00 4.794354850000E-01 1.080000000000E+02 +-6.372027943967E+00 1.253746105103E+00 4.071715453000E-01 1.080000000000E+02 +-6.404143097463E+00 1.292697674500E+00 3.337124203000E-01 1.080000000000E+02 +-6.432570690599E+00 1.332711426039E+00 2.593013285000E-01 1.080000000000E+02 +-6.456848882493E+00 1.373915481552E+00 1.840910744000E-01 1.080000000000E+02 +-6.476395071956E+00 1.416573150235E+00 1.084250821000E-01 1.080000000000E+02 +-6.490955111016E+00 1.459809917170E+00 3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +-6.588058947735E+00 7.186146159526E-01 -3.206635964000E-02 1.080000000000E+02 +-6.609830810439E+00 6.607832978063E-01 -9.558959151000E-02 1.080000000000E+02 +-6.624678012230E+00 5.927187378129E-01 -1.502609002000E-01 1.080000000000E+02 +-6.630580263523E+00 5.179814601597E-01 -1.975103298000E-01 1.080000000000E+02 +-6.624808013052E+00 4.398708813480E-01 -2.389271858000E-01 1.080000000000E+02 +-6.607000950088E+00 3.608570454937E-01 -2.748207179000E-01 1.080000000000E+02 +-6.580639035190E+00 2.830726290513E-01 -3.080563152000E-01 1.080000000000E+02 +-6.544361104880E+00 2.105214010446E-01 -3.436690988000E-01 1.080000000000E+02 +-6.496244692130E+00 1.436991028937E-01 -3.763048784000E-01 1.080000000000E+02 +-6.441695891859E+00 8.014322868217E-02 -4.052293645000E-01 1.080000000000E+02 +-6.380585784315E+00 2.573834808411E-02 -4.392283960000E-01 1.080000000000E+02 +-6.312949235767E+00 -1.435894032594E-02 -4.800337212000E-01 1.080000000000E+02 +-6.240701059768E+00 -3.936948583777E-02 -5.247345144000E-01 1.080000000000E+02 +-6.165336202914E+00 -4.873409307384E-02 -5.704365727000E-01 1.080000000000E+02 +-6.088669127825E+00 -4.277131731066E-02 -6.144560156000E-01 1.080000000000E+02 +-6.012661744087E+00 -2.168531677922E-02 -6.547457037000E-01 1.080000000000E+02 +-5.939508542468E+00 1.388250704953E-02 -6.898657429000E-01 1.080000000000E+02 +-5.871178449115E+00 6.197697120814E-02 -7.191623664000E-01 1.080000000000E+02 +-5.808606486336E+00 1.202364718106E-01 -7.426294678000E-01 1.080000000000E+02 +-5.748430424060E+00 1.821702833399E-01 -7.624802322000E-01 1.080000000000E+02 +-5.689761822259E+00 2.466852532987E-01 -7.779139702000E-01 1.080000000000E+02 +-5.631267358074E+00 3.125337335924E-01 -7.877001548000E-01 1.080000000000E+02 +-5.570425418752E+00 3.768235924053E-01 -7.913832776000E-01 1.080000000000E+02 +-5.504717082220E+00 4.362235310568E-01 -7.895526386000E-01 1.080000000000E+02 +-5.437605735192E+00 4.933985845814E-01 -7.811847600000E-01 1.080000000000E+02 +-5.372744172314E+00 5.518452664538E-01 -7.661370968000E-01 1.080000000000E+02 +-5.308483725433E+00 6.098409876117E-01 -7.471733717000E-01 1.080000000000E+02 +-5.242210030654E+00 6.649891735014E-01 -7.269319722000E-01 1.080000000000E+02 +-5.172204229430E+00 7.155682426067E-01 -7.069563165000E-01 1.080000000000E+02 +-5.096906133860E+00 7.584274175552E-01 -6.885508517000E-01 1.080000000000E+02 +-5.015761983829E+00 7.900903374687E-01 -6.723087025000E-01 1.080000000000E+02 +-4.930657660556E+00 8.095470077034E-01 -6.572772207000E-01 1.080000000000E+02 +-4.843533812727E+00 8.160088770579E-01 -6.427120602000E-01 1.080000000000E+02 +-4.756266715859E+00 8.084997016121E-01 -6.291917806000E-01 1.080000000000E+02 +-4.671246514518E+00 7.855341624158E-01 -6.193379278000E-01 1.080000000000E+02 +-4.591046199170E+00 7.481597712703E-01 -6.153164653000E-01 1.080000000000E+02 +-4.513450779541E+00 7.056769142449E-01 -6.108406342000E-01 1.080000000000E+02 +-4.435464577995E+00 6.658161580739E-01 -5.976498684000E-01 1.080000000000E+02 +-4.358213226481E+00 6.301030082380E-01 -5.730609127000E-01 1.080000000000E+02 +-4.283829110759E+00 5.966681318215E-01 -5.383970067000E-01 1.080000000000E+02 +-4.213749412396E+00 5.644679192619E-01 -4.947621310000E-01 1.080000000000E+02 +-4.149164093921E+00 5.341760095933E-01 -4.421942386000E-01 1.080000000000E+02 +-4.091190354420E+00 5.065511781563E-01 -3.812203306000E-01 1.080000000000E+02 +-4.040779310954E+00 4.829952330593E-01 -3.122472237000E-01 1.080000000000E+02 +-3.997373233297E+00 4.597799984759E-01 -2.386307155000E-01 1.080000000000E+02 +-3.959891067072E+00 4.322908645197E-01 -1.632283249000E-01 1.080000000000E+02 +-3.929617052248E+00 4.051160528731E-01 -8.452815995000E-02 1.080000000000E+02 +-3.906527753754E+00 3.781927146837E-01 -3.268188411000E-03 1.080000000000E+02 +-3.890291040485E+00 3.500409109966E-01 7.911508161000E-02 1.080000000000E+02 +-3.881238834593E+00 3.222004326372E-01 1.627636593000E-01 1.080000000000E+02 +-3.879136586207E+00 2.934769808937E-01 2.465256910000E-01 1.080000000000E+02 +-3.884616673692E+00 2.670500114432E-01 3.309221835000E-01 1.080000000000E+02 +-3.897577164150E+00 2.429036536014E-01 4.151413601000E-01 1.080000000000E+02 +-3.917915326940E+00 2.207523453124E-01 4.985211599000E-01 1.080000000000E+02 +-3.945582312788E+00 2.015257507523E-01 5.804104256000E-01 1.080000000000E+02 +-3.980491852695E+00 1.867125770347E-01 6.604511422000E-01 1.080000000000E+02 +-4.022224173461E+00 1.790969628349E-01 7.382277411000E-01 1.080000000000E+02 +-4.069899229606E+00 1.795803542932E-01 8.130003965000E-01 1.080000000000E+02 +-4.122968513445E+00 1.833231982769E-01 8.837344519000E-01 1.080000000000E+02 +-4.182141242949E+00 1.834269831673E-01 9.496690099000E-01 1.080000000000E+02 +-4.247548367807E+00 1.772588400406E-01 1.009152163000E+00 1.080000000000E+02 +-4.318681387857E+00 1.662574495562E-01 1.060859533000E+00 1.080000000000E+02 +-4.394828925344E+00 1.519350131331E-01 1.103835896000E+00 1.080000000000E+02 +-4.475078120605E+00 1.355124341152E-01 1.137456428000E+00 1.080000000000E+02 +-4.558537127937E+00 1.178598539856E-01 1.161466271000E+00 1.080000000000E+02 +-4.643882655083E+00 9.881298982639E-02 1.175425951000E+00 1.080000000000E+02 +-4.729929499943E+00 7.810860203056E-02 1.179281333000E+00 1.080000000000E+02 +-4.815335055955E+00 5.512798253586E-02 1.173138038000E+00 1.080000000000E+02 +-4.898876052268E+00 2.998062525349E-02 1.157882812000E+00 1.080000000000E+02 +-4.980906718167E+00 4.756746780308E-03 1.135668523000E+00 1.080000000000E+02 +-5.062110393521E+00 -1.812958851758E-02 1.108680995000E+00 1.080000000000E+02 +-5.143966218245E+00 -3.484243943044E-02 1.079331268000E+00 1.080000000000E+02 +-5.227258767604E+00 -4.092423362672E-02 1.049719473000E+00 1.080000000000E+02 +-5.310422455597E+00 -3.697058203392E-02 1.019495947000E+00 1.080000000000E+02 +-5.392314302556E+00 -2.310712922164E-02 9.885700701000E-01 1.080000000000E+02 +-5.471810277680E+00 -1.378048154506E-04 9.570750472000E-01 1.080000000000E+02 +-5.548321062817E+00 3.200271673867E-02 9.259972860000E-01 1.080000000000E+02 +-5.620983630012E+00 7.374748183664E-02 8.971800023000E-01 1.080000000000E+02 +-5.689338787638E+00 1.242053756195E-01 8.719921484000E-01 1.080000000000E+02 +-5.753239473280E+00 1.818879990456E-01 8.511651264000E-01 1.080000000000E+02 +-5.813569211757E+00 2.444410627063E-01 8.338806698000E-01 1.080000000000E+02 +-5.873522447459E+00 3.071769757042E-01 8.161032666000E-01 1.080000000000E+02 +-5.934920133325E+00 3.673286358239E-01 7.945068161000E-01 1.080000000000E+02 +-5.996648834711E+00 4.252668035559E-01 7.685448264000E-01 1.080000000000E+02 +-6.057230978719E+00 4.823824947230E-01 7.382924668000E-01 1.080000000000E+02 +-6.115849883607E+00 5.385954817368E-01 7.029154360000E-01 1.080000000000E+02 +-6.172025450203E+00 5.932111101991E-01 6.614534371000E-01 1.080000000000E+02 +-6.225645641936E+00 6.443504004905E-01 6.129080743000E-01 1.080000000000E+02 +-6.276860411344E+00 6.898588699215E-01 5.567854442000E-01 1.080000000000E+02 +-6.325326254187E+00 7.297167812967E-01 4.941808118000E-01 1.080000000000E+02 +-6.370933850335E+00 7.634679541377E-01 4.262021665000E-01 1.080000000000E+02 +-6.414232631096E+00 7.886142834667E-01 3.530417735000E-01 1.080000000000E+02 +-6.455030341897E+00 8.044193170134E-01 2.760107546000E-01 1.080000000000E+02 +-6.493379294173E+00 8.073753607130E-01 1.962732381000E-01 1.080000000000E+02 +-6.528939830366E+00 7.935571982513E-01 1.162295333000E-01 1.080000000000E+02 +-6.560762735066E+00 7.635625503010E-01 3.922229480000E-02 1.080000000000E+02 +-6.588058947735E+00 7.186146159526E-01 -3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +-2.719265288001E+00 6.043552263244E+00 3.206635964000E-02 1.080000000000E+02 +-2.753578320260E+00 6.003702346740E+00 -3.922229480000E-02 1.080000000000E+02 +-2.772271107284E+00 5.964168109900E+00 -1.162295333000E-01 1.080000000000E+02 +-2.774424150724E+00 5.926077983200E+00 -1.962732381000E-01 1.080000000000E+02 +-2.759762308131E+00 5.890519429983E+00 -2.760107546000E-01 1.080000000000E+02 +-2.732123642017E+00 5.856602525239E+00 -3.530417735000E-01 1.080000000000E+02 +-2.694828002557E+00 5.823193580758E+00 -4.262021665000E-01 1.080000000000E+02 +-2.648635207412E+00 5.790247865236E+00 -4.941808118000E-01 1.080000000000E+02 +-2.595751311988E+00 5.756470881558E+00 -5.567854442000E-01 1.080000000000E+02 +-2.536643951479E+00 5.721825631824E+00 -6.129080743000E-01 1.080000000000E+02 +-2.471438045721E+00 5.686632708852E+00 -6.614534371000E-01 1.080000000000E+02 +-2.402136291633E+00 5.650083727537E+00 -7.029154360000E-01 1.080000000000E+02 +-2.330560326231E+00 5.611704604357E+00 -7.382924668000E-01 1.080000000000E+02 +-2.257519163910E+00 5.571737280744E+00 -7.685448264000E-01 1.080000000000E+02 +-2.183341474178E+00 5.530933675500E+00 -7.945068161000E-01 1.080000000000E+02 +-2.107160917507E+00 5.491128891489E+00 -8.161032666000E-01 1.080000000000E+02 +-2.028968949945E+00 5.453496439275E+00 -8.338806698000E-01 1.080000000000E+02 +-1.950834536680E+00 5.415449408091E+00 -8.511651264000E-01 1.080000000000E+02 +-1.876228703978E+00 5.372501155534E+00 -8.719921484000E-01 1.080000000000E+02 +-1.807117489938E+00 5.323083884131E+00 -8.971800023000E-01 1.080000000000E+02 +-1.744961890952E+00 5.266877517952E+00 -9.259972860000E-01 1.080000000000E+02 +-1.690751305631E+00 5.204043404548E+00 -9.570750472000E-01 1.080000000000E+02 +-1.644340572682E+00 5.135536150979E+00 -9.885700701000E-01 1.080000000000E+02 +-1.605849673135E+00 5.061936418816E+00 -1.019495947000E+00 1.080000000000E+02 +-1.576390534120E+00 4.984064796963E+00 -1.049719473000E+00 1.080000000000E+02 +-1.556435850864E+00 4.902969497374E+00 -1.079331268000E+00 1.080000000000E+02 +-1.547035875703E+00 4.819955426917E+00 -1.108680995000E+00 1.080000000000E+02 +-1.543708758332E+00 4.735653875778E+00 -1.135668523000E+00 1.080000000000E+02 +-1.542349222497E+00 4.649843469327E+00 -1.157882812000E+00 1.080000000000E+02 +-1.540450192920E+00 4.562620299641E+00 -1.173138038000E+00 1.080000000000E+02 +-1.535914292618E+00 4.474293387103E+00 -1.179281333000E+00 1.080000000000E+02 +-1.529015398173E+00 4.386059966905E+00 -1.175425951000E+00 1.080000000000E+02 +-1.520756824164E+00 4.299005742461E+00 -1.161466271000E+00 1.080000000000E+02 +-1.511755173927E+00 4.214176562440E+00 -1.137456428000E+00 1.080000000000E+02 +-1.502575609595E+00 4.132780186352E+00 -1.103835896000E+00 1.080000000000E+02 +-1.492666172922E+00 4.055933698370E+00 -1.060859533000E+00 1.080000000000E+02 +-1.481147804974E+00 3.984882559506E+00 -1.009152163000E+00 1.080000000000E+02 +-1.466802144553E+00 3.920770626147E+00 -9.496690099000E-01 1.080000000000E+02 +-1.448418060237E+00 3.864526087461E+00 -8.837344519000E-01 1.080000000000E+02 +-1.428459093491E+00 3.815210801649E+00 -8.130003965000E-01 1.080000000000E+02 +-1.413266958338E+00 3.770018505013E+00 -7.382277411000E-01 1.080000000000E+02 +-1.407613841517E+00 3.727975355198E+00 -6.604511422000E-01 1.080000000000E+02 +-1.410914365811E+00 3.690196887369E+00 -5.804104256000E-01 1.080000000000E+02 +-1.420650375043E+00 3.657942675729E+00 -4.985211599000E-01 1.080000000000E+02 +-1.435432683200E+00 3.631754802769E+00 -4.151413601000E-01 1.080000000000E+02 +-1.454392222363E+00 3.611967008940E+00 -3.309221835000E-01 1.080000000000E+02 +-1.477832323701E+00 3.598588753357E+00 -2.465256910000E-01 1.080000000000E+02 +-1.505799580130E+00 3.591712075657E+00 -1.627636593000E-01 1.080000000000E+02 +-1.535074733948E+00 3.591718054114E+00 -7.911508161000E-02 1.080000000000E+02 +-1.566866110623E+00 3.598460700310E+00 3.268188411000E-03 1.080000000000E+02 +-1.599606712471E+00 3.612100159053E+00 8.452815995000E-02 1.080000000000E+02 +-1.634806679235E+00 3.632494979508E+00 1.632283249000E-01 1.080000000000E+02 +-1.672533025561E+00 3.659648028388E+00 2.386307155000E-01 1.080000000000E+02 +-1.708025241344E+00 3.693755759376E+00 3.122472237000E-01 1.080000000000E+02 +-1.746006145561E+00 3.734420323404E+00 3.812203306000E-01 1.080000000000E+02 +-1.790193792244E+00 3.781020083750E+00 4.421942386000E-01 1.080000000000E+02 +-1.838961071321E+00 3.833083656863E+00 4.947621310000E-01 1.080000000000E+02 +-1.891241111057E+00 3.889782997748E+00 5.383970067000E-01 1.080000000000E+02 +-1.946025524014E+00 3.950194550696E+00 5.730609127000E-01 1.080000000000E+02 +-2.003862728339E+00 4.012628981724E+00 5.976498684000E-01 1.080000000000E+02 +-2.065871621845E+00 4.074480615820E+00 6.108406342000E-01 1.080000000000E+02 +-2.130253523200E+00 4.135150320502E+00 6.153164653000E-01 1.080000000000E+02 +-2.190581941839E+00 4.199876031005E+00 6.193379278000E-01 1.080000000000E+02 +-2.238696154621E+00 4.273638305610E+00 6.291917806000E-01 1.080000000000E+02 +-2.272804820843E+00 4.354313783918E+00 6.427120602000E-01 1.080000000000E+02 +-2.293581967480E+00 4.439170314566E+00 6.572772207000E-01 1.080000000000E+02 +-2.301376256654E+00 4.526121777536E+00 6.723087025000E-01 1.080000000000E+02 +-2.296337951699E+00 4.613078830528E+00 6.885508517000E-01 1.080000000000E+02 +-2.278844845257E+00 4.697935788408E+00 7.069563165000E-01 1.080000000000E+02 +-2.252374274279E+00 4.780145053754E+00 7.269319722000E-01 1.080000000000E+02 +-2.220404930694E+00 4.860216809682E+00 7.471733717000E-01 1.080000000000E+02 +-2.185105292322E+00 4.939253789866E+00 7.661370968000E-01 1.080000000000E+02 +-2.149562519882E+00 5.019001819862E+00 7.811847600000E-01 1.080000000000E+02 +-2.115924359405E+00 5.100496566964E+00 7.895526386000E-01 1.080000000000E+02 +-2.079736653343E+00 5.181344499105E+00 7.913832776000E-01 1.080000000000E+02 +-2.037394557409E+00 5.259075280901E+00 7.877001548000E-01 1.080000000000E+02 +-1.992844714647E+00 5.335055121695E+00 7.779139702000E-01 1.080000000000E+02 +-1.949616927062E+00 5.410788499850E+00 7.624802322000E-01 1.080000000000E+02 +-1.909309797926E+00 5.487157936291E+00 7.426294678000E-01 1.080000000000E+02 +-1.873237520112E+00 5.564670584999E+00 7.191623664000E-01 1.080000000000E+02 +-1.848612126650E+00 5.644518372302E+00 6.898657429000E-01 1.080000000000E+02 +-1.837390698520E+00 5.725082263405E+00 6.547457037000E-01 1.080000000000E+02 +-1.840824293585E+00 5.803885513504E+00 6.144560156000E-01 1.080000000000E+02 +-1.858844785952E+00 5.878642833897E+00 5.704365727000E-01 1.080000000000E+02 +-1.891040078233E+00 5.947425249326E+00 5.247345144000E-01 1.080000000000E+02 +-1.937152434714E+00 6.008408664299E+00 4.800337212000E-01 1.080000000000E+02 +-1.996188065085E+00 6.060344100988E+00 4.392283960000E-01 1.080000000000E+02 +-2.066814243055E+00 6.101651234298E+00 4.052293645000E-01 1.080000000000E+02 +-2.144115977679E+00 6.133890381028E+00 3.763048784000E-01 1.080000000000E+02 +-2.222536549017E+00 6.159002583182E+00 3.436690988000E-01 1.080000000000E+02 +-2.302747364165E+00 6.171085382785E+00 3.080563152000E-01 1.080000000000E+02 +-2.384871019997E+00 6.172120347152E+00 2.748207179000E-01 1.080000000000E+02 +-2.465520328539E+00 6.164639252351E+00 2.389271858000E-01 1.080000000000E+02 +-2.541591627001E+00 6.145991492481E+00 1.975103298000E-01 1.080000000000E+02 +-2.610847105968E+00 6.117283029020E+00 1.502609002000E-01 1.080000000000E+02 +-2.670992311606E+00 6.082129395255E+00 9.558959151000E-02 1.080000000000E+02 +-2.719265288001E+00 6.043552263244E+00 3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +-3.394177173306E+00 5.722159082349E+00 -3.187537464000E-02 1.080000000000E+02 +-3.348557264860E+00 5.721672558088E+00 -1.084250821000E-01 1.080000000000E+02 +-3.301947306370E+00 5.716264971793E+00 -1.840910744000E-01 1.080000000000E+02 +-3.255257546988E+00 5.705907792580E+00 -2.593013285000E-01 1.080000000000E+02 +-3.208417598457E+00 5.691236474119E+00 -3.337124203000E-01 1.080000000000E+02 +-3.161448326355E+00 5.672729845017E+00 -4.071715453000E-01 1.080000000000E+02 +-3.114271788774E+00 5.650870587217E+00 -4.794354850000E-01 1.080000000000E+02 +-3.066971401084E+00 5.625765126573E+00 -5.506192747000E-01 1.080000000000E+02 +-3.019664105983E+00 5.597429694134E+00 -6.207042323000E-01 1.080000000000E+02 +-2.973047810454E+00 5.565629482016E+00 -6.895838911000E-01 1.080000000000E+02 +-2.927575674360E+00 5.529900943324E+00 -7.574711850000E-01 1.080000000000E+02 +-2.882850489861E+00 5.490555535161E+00 -8.236903164000E-01 1.080000000000E+02 +-2.837732759628E+00 5.447964355140E+00 -8.876176364000E-01 1.080000000000E+02 +-2.789960579273E+00 5.403061305716E+00 -9.479798854000E-01 1.080000000000E+02 +-2.740406519914E+00 5.355371176151E+00 -1.004521395000E+00 1.080000000000E+02 +-2.688999624076E+00 5.304786411523E+00 -1.056863518000E+00 1.080000000000E+02 +-2.639387782888E+00 5.249701787963E+00 -1.106391465000E+00 1.080000000000E+02 +-2.594482933436E+00 5.189438941072E+00 -1.154170635000E+00 1.080000000000E+02 +-2.556854555261E+00 5.123670733322E+00 -1.201173169000E+00 1.080000000000E+02 +-2.528149252728E+00 5.053108006101E+00 -1.247327499000E+00 1.080000000000E+02 +-2.508095395382E+00 4.978581114801E+00 -1.291888617000E+00 1.080000000000E+02 +-2.495116061853E+00 4.900899042274E+00 -1.333595471000E+00 1.080000000000E+02 +-2.486625964197E+00 4.820523810796E+00 -1.371062779000E+00 1.080000000000E+02 +-2.478896843300E+00 4.737680158879E+00 -1.402784195000E+00 1.080000000000E+02 +-2.469258347294E+00 4.652584296511E+00 -1.427519630000E+00 1.080000000000E+02 +-2.455170412312E+00 4.566144041357E+00 -1.443978096000E+00 1.080000000000E+02 +-2.435834846381E+00 4.479580143459E+00 -1.451432017000E+00 1.080000000000E+02 +-2.412457529517E+00 4.393604896246E+00 -1.449884186000E+00 1.080000000000E+02 +-2.386206551659E+00 4.309015145822E+00 -1.439465232000E+00 1.080000000000E+02 +-2.356263153935E+00 4.227450366534E+00 -1.420151472000E+00 1.080000000000E+02 +-2.322797709835E+00 4.149610562252E+00 -1.392276244000E+00 1.080000000000E+02 +-2.288332686745E+00 4.075653753299E+00 -1.356669215000E+00 1.080000000000E+02 +-2.255865587312E+00 4.004614623552E+00 -1.313751841000E+00 1.080000000000E+02 +-2.228268513145E+00 3.936053335486E+00 -1.263842748000E+00 1.080000000000E+02 +-2.206218383794E+00 3.870850638620E+00 -1.207380380000E+00 1.080000000000E+02 +-2.187763578233E+00 3.810372789721E+00 -1.144593485000E+00 1.080000000000E+02 +-2.171924950014E+00 3.755633608231E+00 -1.076114245000E+00 1.080000000000E+02 +-2.159122130405E+00 3.706897427374E+00 -1.002637062000E+00 1.080000000000E+02 +-2.149574680386E+00 3.664412137748E+00 -9.249046690000E-01 1.080000000000E+02 +-2.142703995463E+00 3.628524136046E+00 -8.436327263000E-01 1.080000000000E+02 +-2.139475925018E+00 3.599051276556E+00 -7.596450919000E-01 1.080000000000E+02 +-2.142282380360E+00 3.575480862002E+00 -6.737108263000E-01 1.080000000000E+02 +-2.152634722655E+00 3.557784884078E+00 -5.870384289000E-01 1.080000000000E+02 +-2.170819282876E+00 3.546155371042E+00 -5.006187195000E-01 1.080000000000E+02 +-2.196723458870E+00 3.540832898945E+00 -4.155171011000E-01 1.080000000000E+02 +-2.230248524991E+00 3.541991393086E+00 -3.329023539000E-01 1.080000000000E+02 +-2.271341696766E+00 3.549708511988E+00 -2.542191153000E-01 1.080000000000E+02 +-2.319624635057E+00 3.563993942511E+00 -1.807565333000E-01 1.080000000000E+02 +-2.374355426588E+00 3.584790685009E+00 -1.135748529000E-01 1.080000000000E+02 +-2.434751370850E+00 3.611744998067E+00 -5.388091285000E-02 1.080000000000E+02 +-2.501183877938E+00 3.643526798842E+00 -3.754172340000E-03 1.080000000000E+02 +-2.573356864486E+00 3.677997380178E+00 3.558837129000E-02 1.080000000000E+02 +-2.648748577608E+00 3.714055724219E+00 6.642283384000E-02 1.080000000000E+02 +-2.724316623128E+00 3.752873091369E+00 9.346268448000E-02 1.080000000000E+02 +-2.795822968750E+00 3.797610262100E+00 1.219181286000E-01 1.080000000000E+02 +-2.857293276239E+00 3.852436854748E+00 1.560456650000E-01 1.080000000000E+02 +-2.903787448629E+00 3.917387568038E+00 1.954128437000E-01 1.080000000000E+02 +-2.934932602030E+00 3.989399292458E+00 2.376983871000E-01 1.080000000000E+02 +-2.949805648091E+00 4.065213183338E+00 2.820781068000E-01 1.080000000000E+02 +-2.947114715103E+00 4.141333190337E+00 3.283193574000E-01 1.080000000000E+02 +-2.928708740626E+00 4.214575783583E+00 3.756353333000E-01 1.080000000000E+02 +-2.897356770253E+00 4.283448184994E+00 4.226801226000E-01 1.080000000000E+02 +-2.857951356077E+00 4.349266520155E+00 4.679474510000E-01 1.080000000000E+02 +-2.815615468550E+00 4.415453370420E+00 5.099632237000E-01 1.080000000000E+02 +-2.779416756277E+00 4.487481964602E+00 5.479092097000E-01 1.080000000000E+02 +-2.740354547051E+00 4.561567302626E+00 5.783904634000E-01 1.080000000000E+02 +-2.698683179948E+00 4.636459348646E+00 6.026804297000E-01 1.080000000000E+02 +-2.652768567656E+00 4.710027527613E+00 6.230907784000E-01 1.080000000000E+02 +-2.605466236006E+00 4.783085140084E+00 6.421364412000E-01 1.080000000000E+02 +-2.558794398038E+00 4.856603378092E+00 6.610368381000E-01 1.080000000000E+02 +-2.516457099171E+00 4.932694804517E+00 6.800217467000E-01 1.080000000000E+02 +-2.482659969634E+00 5.013091439125E+00 6.982493624000E-01 1.080000000000E+02 +-2.461774366558E+00 5.098200522130E+00 7.142960837000E-01 1.080000000000E+02 +-2.454663200099E+00 5.186112087305E+00 7.270540685000E-01 1.080000000000E+02 +-2.462975501605E+00 5.274290149984E+00 7.366388673000E-01 1.080000000000E+02 +-2.486717479553E+00 5.359701917571E+00 7.452820520000E-01 1.080000000000E+02 +-2.526092170574E+00 5.438658272184E+00 7.578816060000E-01 1.080000000000E+02 +-2.577907865817E+00 5.508488642737E+00 7.773689488000E-01 1.080000000000E+02 +-2.639901330691E+00 5.567884351017E+00 8.012208021000E-01 1.080000000000E+02 +-2.711257743195E+00 5.615949738020E+00 8.243174216000E-01 1.080000000000E+02 +-2.790936909975E+00 5.651282466933E+00 8.427262700000E-01 1.080000000000E+02 +-2.876862243103E+00 5.670801335784E+00 8.562220560000E-01 1.080000000000E+02 +-2.965321828993E+00 5.677929545760E+00 8.640060786000E-01 1.080000000000E+02 +-3.054301143249E+00 5.681951844057E+00 8.607369806000E-01 1.080000000000E+02 +-3.141580191105E+00 5.684864654517E+00 8.432354714000E-01 1.080000000000E+02 +-3.224591863322E+00 5.685972760655E+00 8.108473046000E-01 1.080000000000E+02 +-3.300757848666E+00 5.685137941247E+00 7.645271884000E-01 1.080000000000E+02 +-3.368092185977E+00 5.683065461228E+00 7.062104980000E-01 1.080000000000E+02 +-3.425098192802E+00 5.680988441947E+00 6.378051764000E-01 1.080000000000E+02 +-3.469426126475E+00 5.680799582722E+00 5.605003417000E-01 1.080000000000E+02 +-3.498711681869E+00 5.683695864978E+00 4.764366174000E-01 1.080000000000E+02 +-3.513128530549E+00 5.689003777010E+00 3.886351210000E-01 1.080000000000E+02 +-3.513231368707E+00 5.695892786502E+00 2.997983967000E-01 1.080000000000E+02 +-3.499556816443E+00 5.703676333561E+00 2.120822207000E-01 1.080000000000E+02 +-3.472958953023E+00 5.711726492191E+00 1.274648788000E-01 1.080000000000E+02 +-3.436690408012E+00 5.718401428759E+00 4.635841915000E-02 1.080000000000E+02 +-3.394177173306E+00 5.722159082349E+00 -3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +-3.897450276885E+00 5.462216744545E+00 -3.632685538000E-02 1.080000000000E+02 +-3.871691090183E+00 5.463784833911E+00 -1.206362437000E-01 1.080000000000E+02 +-3.844144165063E+00 5.460615813545E+00 -2.044325232000E-01 1.080000000000E+02 +-3.816986504912E+00 5.451384079013E+00 -2.879184587000E-01 1.080000000000E+02 +-3.790709508922E+00 5.436070986948E+00 -3.706549346000E-01 1.080000000000E+02 +-3.766992122249E+00 5.414085511694E+00 -4.527156872000E-01 1.080000000000E+02 +-3.744925938441E+00 5.386412678401E+00 -5.335701480000E-01 1.080000000000E+02 +-3.724200370222E+00 5.353731259434E+00 -6.127886991000E-01 1.080000000000E+02 +-3.704301718041E+00 5.316570095328E+00 -6.903510399000E-01 1.080000000000E+02 +-3.684320755750E+00 5.275728148631E+00 -7.659096737000E-01 1.080000000000E+02 +-3.663533940147E+00 5.231664712509E+00 -8.394336353000E-01 1.080000000000E+02 +-3.643395048416E+00 5.183888457095E+00 -9.108702606000E-01 1.080000000000E+02 +-3.625139090898E+00 5.132098038740E+00 -9.799657947000E-01 1.080000000000E+02 +-3.608002906770E+00 5.076773245043E+00 -1.046417130000E+00 1.080000000000E+02 +-3.590845457396E+00 5.018230231685E+00 -1.110182121000E+00 1.080000000000E+02 +-3.572488407305E+00 4.956950617456E+00 -1.170998922000E+00 1.080000000000E+02 +-3.551864839137E+00 4.893376782078E+00 -1.228575236000E+00 1.080000000000E+02 +-3.528094350229E+00 4.827880600677E+00 -1.282612075000E+00 1.080000000000E+02 +-3.500404318737E+00 4.760791700785E+00 -1.332770951000E+00 1.080000000000E+02 +-3.468593285829E+00 4.692397382262E+00 -1.378577601000E+00 1.080000000000E+02 +-3.432630748027E+00 4.623052963363E+00 -1.419493916000E+00 1.080000000000E+02 +-3.392856034661E+00 4.552727869667E+00 -1.455093589000E+00 1.080000000000E+02 +-3.349680964572E+00 4.481732217086E+00 -1.484797470000E+00 1.080000000000E+02 +-3.303822573264E+00 4.410197296921E+00 -1.508093490000E+00 1.080000000000E+02 +-3.255871566876E+00 4.337889691773E+00 -1.524583142000E+00 1.080000000000E+02 +-3.207196508227E+00 4.264883837707E+00 -1.533750385000E+00 1.080000000000E+02 +-3.159034923897E+00 4.191073144716E+00 -1.535219663000E+00 1.080000000000E+02 +-3.112174279770E+00 4.116512976079E+00 -1.528680731000E+00 1.080000000000E+02 +-3.067901953763E+00 4.041670816109E+00 -1.513978101000E+00 1.080000000000E+02 +-3.028627223361E+00 3.966075133022E+00 -1.491069996000E+00 1.080000000000E+02 +-2.996188914990E+00 3.890147669574E+00 -1.460188986000E+00 1.080000000000E+02 +-2.968835983020E+00 3.815604786744E+00 -1.421583532000E+00 1.080000000000E+02 +-2.944759459083E+00 3.744305141498E+00 -1.375655668000E+00 1.080000000000E+02 +-2.920954619310E+00 3.677947761956E+00 -1.322504398000E+00 1.080000000000E+02 +-2.895248943071E+00 3.618425189837E+00 -1.262691804000E+00 1.080000000000E+02 +-2.872409194009E+00 3.564375618606E+00 -1.196814028000E+00 1.080000000000E+02 +-2.858593831919E+00 3.514119454181E+00 -1.125601149000E+00 1.080000000000E+02 +-2.853835815260E+00 3.468822634366E+00 -1.050138721000E+00 1.080000000000E+02 +-2.856699950129E+00 3.429749769415E+00 -9.710448039000E-01 1.080000000000E+02 +-2.868351837582E+00 3.397467880932E+00 -8.897856590000E-01 1.080000000000E+02 +-2.887734673422E+00 3.372941005620E+00 -8.072828216000E-01 1.080000000000E+02 +-2.915626201303E+00 3.356466641867E+00 -7.252260042000E-01 1.080000000000E+02 +-2.952679803756E+00 3.347970370366E+00 -6.456312705000E-01 1.080000000000E+02 +-2.997832566954E+00 3.347348985654E+00 -5.697936167000E-01 1.080000000000E+02 +-3.049788656690E+00 3.354044036996E+00 -4.988404496000E-01 1.080000000000E+02 +-3.109107668869E+00 3.366043470514E+00 -4.346658470000E-01 1.080000000000E+02 +-3.173267026195E+00 3.382506686522E+00 -3.764466502000E-01 1.080000000000E+02 +-3.235283473704E+00 3.407018839522E+00 -3.185973837000E-01 1.080000000000E+02 +-3.293419581863E+00 3.439821990736E+00 -2.609630366000E-01 1.080000000000E+02 +-3.347034873213E+00 3.480115873658E+00 -2.036424630000E-01 1.080000000000E+02 +-3.394812932584E+00 3.526865323230E+00 -1.460500498000E-01 1.080000000000E+02 +-3.432307229615E+00 3.580017333063E+00 -8.649636904000E-02 1.080000000000E+02 +-3.455748523232E+00 3.638270851605E+00 -2.448555749000E-02 1.080000000000E+02 +-3.464014768028E+00 3.699500301205E+00 3.845435998000E-02 1.080000000000E+02 +-3.457917133911E+00 3.762796927788E+00 9.962429365000E-02 1.080000000000E+02 +-3.436330254068E+00 3.827959781908E+00 1.550619236000E-01 1.080000000000E+02 +-3.403734499524E+00 3.894293042599E+00 2.031942363000E-01 1.080000000000E+02 +-3.366289939763E+00 3.961638029631E+00 2.462074493000E-01 1.080000000000E+02 +-3.337733121057E+00 4.031634072366E+00 2.916382842000E-01 1.080000000000E+02 +-3.314127317712E+00 4.101310601187E+00 3.403860995000E-01 1.080000000000E+02 +-3.287763329237E+00 4.167598732037E+00 3.922509070000E-01 1.080000000000E+02 +-3.254057720133E+00 4.228801425421E+00 4.461358974000E-01 1.080000000000E+02 +-3.212196994499E+00 4.285530818179E+00 4.991121880000E-01 1.080000000000E+02 +-3.164397515540E+00 4.341407512383E+00 5.478583852000E-01 1.080000000000E+02 +-3.115383614732E+00 4.400925830642E+00 5.907387262000E-01 1.080000000000E+02 +-3.073194489340E+00 4.467154942836E+00 6.309463669000E-01 1.080000000000E+02 +-3.040302389413E+00 4.539999638505E+00 6.683070249000E-01 1.080000000000E+02 +-3.019921407926E+00 4.615823948848E+00 7.085053980000E-01 1.080000000000E+02 +-3.013809978173E+00 4.688096178143E+00 7.587395914000E-01 1.080000000000E+02 +-3.019148390042E+00 4.750420293851E+00 8.209661657000E-01 1.080000000000E+02 +-3.035633376645E+00 4.800977303524E+00 8.913395217000E-01 1.080000000000E+02 +-3.067858755558E+00 4.843450104112E+00 9.616664656000E-01 1.080000000000E+02 +-3.115832136415E+00 4.885440394806E+00 1.022604995000E+00 1.080000000000E+02 +-3.175942956527E+00 4.928990544939E+00 1.070335916000E+00 1.080000000000E+02 +-3.247210289640E+00 4.966357922366E+00 1.106430447000E+00 1.080000000000E+02 +-3.327282515873E+00 4.991162927498E+00 1.133893710000E+00 1.080000000000E+02 +-3.412459210235E+00 4.999358944185E+00 1.155518699000E+00 1.080000000000E+02 +-3.499113015868E+00 4.999672612510E+00 1.172009822000E+00 1.080000000000E+02 +-3.586613936214E+00 5.007262391939E+00 1.180212576000E+00 1.080000000000E+02 +-3.672707222782E+00 5.025903397345E+00 1.175727956000E+00 1.080000000000E+02 +-3.755280056026E+00 5.050564153250E+00 1.156570420000E+00 1.080000000000E+02 +-3.832030062448E+00 5.077424098145E+00 1.122466283000E+00 1.080000000000E+02 +-3.900426769746E+00 5.105327148405E+00 1.074292285000E+00 1.080000000000E+02 +-3.958003085953E+00 5.134394445769E+00 1.014026757000E+00 1.080000000000E+02 +-4.002687741884E+00 5.165057259940E+00 9.444199619000E-01 1.080000000000E+02 +-4.033645614749E+00 5.197311787711E+00 8.684143517000E-01 1.080000000000E+02 +-4.051820281249E+00 5.230357841280E+00 7.885880029000E-01 1.080000000000E+02 +-4.060493675794E+00 5.262285036358E+00 7.068846032000E-01 1.080000000000E+02 +-4.060408312443E+00 5.293325732481E+00 6.243033587000E-01 1.080000000000E+02 +-4.050955805378E+00 5.324376366677E+00 5.422183342000E-01 1.080000000000E+02 +-4.034098705908E+00 5.354813945499E+00 4.611599500000E-01 1.080000000000E+02 +-4.011719525251E+00 5.384001507461E+00 3.810313384000E-01 1.080000000000E+02 +-3.988091488476E+00 5.409679360445E+00 2.999547317000E-01 1.080000000000E+02 +-3.965849608727E+00 5.430059692645E+00 2.170477619000E-01 1.080000000000E+02 +-3.943926565601E+00 5.445455309364E+00 1.330022602000E-01 1.080000000000E+02 +-3.922335205635E+00 5.455517156138E+00 4.805479793000E-02 1.080000000000E+02 +-3.897450276885E+00 5.462216744545E+00 -3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +-4.564435369340E+00 5.020429867828E+00 -2.786784824000E-03 1.080000000000E+02 +-4.568827558587E+00 5.007659321588E+00 -9.012406132000E-02 1.080000000000E+02 +-4.573005979928E+00 4.990154597143E+00 -1.765219348000E-01 1.080000000000E+02 +-4.574721694098E+00 4.969538520312E+00 -2.624374443000E-01 1.080000000000E+02 +-4.571815975135E+00 4.947383811723E+00 -3.478877549000E-01 1.080000000000E+02 +-4.564776528103E+00 4.923356579557E+00 -4.326343739000E-01 1.080000000000E+02 +-4.554751281569E+00 4.896722734764E+00 -5.162774167000E-01 1.080000000000E+02 +-4.542810891082E+00 4.866811505948E+00 -5.984352213000E-01 1.080000000000E+02 +-4.529109386677E+00 4.833468966284E+00 -6.790841041000E-01 1.080000000000E+02 +-4.512383737093E+00 4.797583596308E+00 -7.581530132000E-01 1.080000000000E+02 +-4.491688952164E+00 4.759975561382E+00 -8.352590367000E-01 1.080000000000E+02 +-4.467541611207E+00 4.720106024498E+00 -9.103747398000E-01 1.080000000000E+02 +-4.440722981539E+00 4.677622454629E+00 -9.829305340000E-01 1.080000000000E+02 +-4.410707950521E+00 4.632697008276E+00 -1.052910239000E+00 1.080000000000E+02 +-4.377843742779E+00 4.585354307312E+00 -1.119713595000E+00 1.080000000000E+02 +-4.344596518119E+00 4.533619497506E+00 -1.183240350000E+00 1.080000000000E+02 +-4.313127751398E+00 4.476507710846E+00 -1.242822431000E+00 1.080000000000E+02 +-4.283125500851E+00 4.414511358784E+00 -1.298134958000E+00 1.080000000000E+02 +-4.253858602732E+00 4.348340487880E+00 -1.348880339000E+00 1.080000000000E+02 +-4.225452551837E+00 4.278349931086E+00 -1.394624322000E+00 1.080000000000E+02 +-4.197923388055E+00 4.204786903618E+00 -1.435050927000E+00 1.080000000000E+02 +-4.170266451324E+00 4.128551681660E+00 -1.469852265000E+00 1.080000000000E+02 +-4.141027498239E+00 4.050337454820E+00 -1.498846663000E+00 1.080000000000E+02 +-4.108013033931E+00 3.971642679586E+00 -1.521653119000E+00 1.080000000000E+02 +-4.068502048881E+00 3.894362515695E+00 -1.537810757000E+00 1.080000000000E+02 +-4.022661490713E+00 3.819317306175E+00 -1.546702180000E+00 1.080000000000E+02 +-3.971963931010E+00 3.746959894245E+00 -1.547836060000E+00 1.080000000000E+02 +-3.917078839102E+00 3.678196797943E+00 -1.540955846000E+00 1.080000000000E+02 +-3.858400087253E+00 3.613801307586E+00 -1.525941209000E+00 1.080000000000E+02 +-3.797115297247E+00 3.554610459818E+00 -1.502926011000E+00 1.080000000000E+02 +-3.734680792464E+00 3.500304603265E+00 -1.472011314000E+00 1.080000000000E+02 +-3.675305018027E+00 3.447866293004E+00 -1.432913650000E+00 1.080000000000E+02 +-3.623583886322E+00 3.394640235767E+00 -1.385061074000E+00 1.080000000000E+02 +-3.579966680511E+00 3.342646382344E+00 -1.328492129000E+00 1.080000000000E+02 +-3.543718021354E+00 3.294824463353E+00 -1.263647540000E+00 1.080000000000E+02 +-3.516443196216E+00 3.252288057673E+00 -1.191204722000E+00 1.080000000000E+02 +-3.500348011694E+00 3.215759670630E+00 -1.112414355000E+00 1.080000000000E+02 +-3.496324681733E+00 3.186313245052E+00 -1.029225643000E+00 1.080000000000E+02 +-3.504257495748E+00 3.164562533713E+00 -9.439925506000E-01 1.080000000000E+02 +-3.524511021632E+00 3.149798024733E+00 -8.592609358000E-01 1.080000000000E+02 +-3.557227704037E+00 3.140490232399E+00 -7.777589224000E-01 1.080000000000E+02 +-3.601818035556E+00 3.134634517289E+00 -7.017224202000E-01 1.080000000000E+02 +-3.655845152071E+00 3.130738731526E+00 -6.319745517000E-01 1.080000000000E+02 +-3.713420527165E+00 3.130306150224E+00 -5.649597706000E-01 1.080000000000E+02 +-3.768167675217E+00 3.137210988032E+00 -4.959805589000E-01 1.080000000000E+02 +-3.816042740977E+00 3.154563497564E+00 -4.238156204000E-01 1.080000000000E+02 +-3.853610828620E+00 3.184641277811E+00 -3.497702850000E-01 1.080000000000E+02 +-3.880656059693E+00 3.226985144637E+00 -2.770763044000E-01 1.080000000000E+02 +-3.900762629647E+00 3.278598959530E+00 -2.083126740000E-01 1.080000000000E+02 +-3.910270670962E+00 3.338836995198E+00 -1.443669380000E-01 1.080000000000E+02 +-3.907071072457E+00 3.404092202633E+00 -8.494149535000E-02 1.080000000000E+02 +-3.889121014078E+00 3.470197789881E+00 -2.916971350000E-02 1.080000000000E+02 +-3.860561303261E+00 3.533915066317E+00 2.494784873000E-02 1.080000000000E+02 +-3.827086656508E+00 3.594597652287E+00 7.966775233000E-02 1.080000000000E+02 +-3.792833029247E+00 3.653026839544E+00 1.364003779000E-01 1.080000000000E+02 +-3.759354897806E+00 3.710355614202E+00 1.946452353000E-01 1.080000000000E+02 +-3.726858037859E+00 3.767543083315E+00 2.536123470000E-01 1.080000000000E+02 +-3.692136053360E+00 3.824771929066E+00 3.112409570000E-01 1.080000000000E+02 +-3.652146258123E+00 3.880434826052E+00 3.670458051000E-01 1.080000000000E+02 +-3.606708995297E+00 3.931643689641E+00 4.228264178000E-01 1.080000000000E+02 +-3.557440149267E+00 3.977025351783E+00 4.803836822000E-01 1.080000000000E+02 +-3.506574208760E+00 4.017656768124E+00 5.400717519000E-01 1.080000000000E+02 +-3.455324561950E+00 4.058970474329E+00 5.989634359000E-01 1.080000000000E+02 +-3.411485373571E+00 4.094882713256E+00 6.667474988000E-01 1.080000000000E+02 +-3.381900061699E+00 4.130109502305E+00 7.421450537000E-01 1.080000000000E+02 +-3.369263860733E+00 4.172009055296E+00 8.188905247000E-01 1.080000000000E+02 +-3.373640683707E+00 4.218808592586E+00 8.936981911000E-01 1.080000000000E+02 +-3.395129428744E+00 4.263446560236E+00 9.667867241000E-01 1.080000000000E+02 +-3.432131676747E+00 4.302029446497E+00 1.037139043000E+00 1.080000000000E+02 +-3.482773453989E+00 4.332241301110E+00 1.102951579000E+00 1.080000000000E+02 +-3.544391846726E+00 4.353158382751E+00 1.162638692000E+00 1.080000000000E+02 +-3.613573552351E+00 4.367166213703E+00 1.215714425000E+00 1.080000000000E+02 +-3.688324660580E+00 4.374717720102E+00 1.262085734000E+00 1.080000000000E+02 +-3.767026816846E+00 4.381441026057E+00 1.301720477000E+00 1.080000000000E+02 +-3.848880937678E+00 4.392221038251E+00 1.333014261000E+00 1.080000000000E+02 +-3.933224920032E+00 4.409160343659E+00 1.353085167000E+00 1.080000000000E+02 +-4.017939881472E+00 4.433645688368E+00 1.358569067000E+00 1.080000000000E+02 +-4.100572122891E+00 4.463126939115E+00 1.348281183000E+00 1.080000000000E+02 +-4.178268317064E+00 4.496730207382E+00 1.323067807000E+00 1.080000000000E+02 +-4.248695439932E+00 4.534210915938E+00 1.285194785000E+00 1.080000000000E+02 +-4.309384145450E+00 4.576680365064E+00 1.237059622000E+00 1.080000000000E+02 +-4.359668783257E+00 4.623327907429E+00 1.181327921000E+00 1.080000000000E+02 +-4.399692564851E+00 4.672943319517E+00 1.120196685000E+00 1.080000000000E+02 +-4.427812955957E+00 4.726079534800E+00 1.055471471000E+00 1.080000000000E+02 +-4.446257319586E+00 4.780323543559E+00 9.881923803000E-01 1.080000000000E+02 +-4.458693860612E+00 4.832760794815E+00 9.182365063000E-01 1.080000000000E+02 +-4.465802811958E+00 4.882649233552E+00 8.457732406000E-01 1.080000000000E+02 +-4.472525276684E+00 4.926671758261E+00 7.694019289000E-01 1.080000000000E+02 +-4.481220166321E+00 4.962750859321E+00 6.892798267000E-01 1.080000000000E+02 +-4.490987347194E+00 4.991445729805E+00 6.062523787000E-01 1.080000000000E+02 +-4.503075259032E+00 5.011842922231E+00 5.212198625000E-01 1.080000000000E+02 +-4.515616348030E+00 5.025673976755E+00 4.348356053000E-01 1.080000000000E+02 +-4.527136056838E+00 5.034293735050E+00 3.477269332000E-01 1.080000000000E+02 +-4.538212508835E+00 5.037564188143E+00 2.600860194000E-01 1.080000000000E+02 +-4.549235316654E+00 5.035402562198E+00 1.724869752000E-01 1.080000000000E+02 +-4.558446757857E+00 5.029312173810E+00 8.489061568000E-02 1.080000000000E+02 +-4.564435369340E+00 5.020429867828E+00 -2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +-5.282348219460E+00 4.370833091219E+00 -1.744954334000E-02 1.080000000000E+02 +-5.282575291438E+00 4.365208846521E+00 -1.063739981000E-01 1.080000000000E+02 +-5.279036198340E+00 4.356482388143E+00 -1.949310037000E-01 1.080000000000E+02 +-5.271402047957E+00 4.345062352379E+00 -2.829651087000E-01 1.080000000000E+02 +-5.260168366993E+00 4.330476929970E+00 -3.701617308000E-01 1.080000000000E+02 +-5.246288975081E+00 4.311865775592E+00 -4.560661339000E-01 1.080000000000E+02 +-5.229598467324E+00 4.289456558061E+00 -5.407768227000E-01 1.080000000000E+02 +-5.210000201932E+00 4.263752693974E+00 -6.236520547000E-01 1.080000000000E+02 +-5.187989630253E+00 4.234213404943E+00 -7.047985910000E-01 1.080000000000E+02 +-5.164355187931E+00 4.200347130769E+00 -7.837241475000E-01 1.080000000000E+02 +-5.139790667104E+00 4.161621414016E+00 -8.601609198000E-01 1.080000000000E+02 +-5.115952570215E+00 4.116837424625E+00 -9.334175927000E-01 1.080000000000E+02 +-5.096460746401E+00 4.063513553089E+00 -1.002061223000E+00 1.080000000000E+02 +-5.082565798206E+00 4.001906619889E+00 -1.064920566000E+00 1.080000000000E+02 +-5.070439439571E+00 3.935587996494E+00 -1.123012040000E+00 1.080000000000E+02 +-5.056452751838E+00 3.866811505809E+00 -1.177853833000E+00 1.080000000000E+02 +-5.037905565962E+00 3.797139299389E+00 -1.230287750000E+00 1.080000000000E+02 +-5.011028851436E+00 3.729112151651E+00 -1.280975246000E+00 1.080000000000E+02 +-4.974467730741E+00 3.663775032568E+00 -1.329400646000E+00 1.080000000000E+02 +-4.929237974366E+00 3.601403640468E+00 -1.374018251000E+00 1.080000000000E+02 +-4.875881378818E+00 3.542067127169E+00 -1.413793625000E+00 1.080000000000E+02 +-4.815378190500E+00 3.486111125707E+00 -1.447633049000E+00 1.080000000000E+02 +-4.748950586796E+00 3.433384092173E+00 -1.474786583000E+00 1.080000000000E+02 +-4.677692370641E+00 3.383746005767E+00 -1.494787468000E+00 1.080000000000E+02 +-4.601598165155E+00 3.339194400421E+00 -1.507450791000E+00 1.080000000000E+02 +-4.521251183597E+00 3.301316120240E+00 -1.512984118000E+00 1.080000000000E+02 +-4.438945962439E+00 3.267118184380E+00 -1.511502484000E+00 1.080000000000E+02 +-4.357187986457E+00 3.232847760060E+00 -1.502532507000E+00 1.080000000000E+02 +-4.278729161110E+00 3.194604054815E+00 -1.484801442000E+00 1.080000000000E+02 +-4.207355101639E+00 3.149474081196E+00 -1.456473280000E+00 1.080000000000E+02 +-4.145966342424E+00 3.098889420530E+00 -1.416487546000E+00 1.080000000000E+02 +-4.096225913731E+00 3.046254221264E+00 -1.364609021000E+00 1.080000000000E+02 +-4.059061309777E+00 2.995468456062E+00 -1.301455248000E+00 1.080000000000E+02 +-4.034864919660E+00 2.950056411290E+00 -1.228771473000E+00 1.080000000000E+02 +-4.024706131039E+00 2.911389253048E+00 -1.149164457000E+00 1.080000000000E+02 +-4.029398185205E+00 2.879144506374E+00 -1.066259509000E+00 1.080000000000E+02 +-4.049189345405E+00 2.851294656661E+00 -9.840199882000E-01 1.080000000000E+02 +-4.081801811475E+00 2.825960442811E+00 -9.050198505000E-01 1.080000000000E+02 +-4.120273419345E+00 2.805133309909E+00 -8.274301477000E-01 1.080000000000E+02 +-4.158051066235E+00 2.793538220860E+00 -7.475896770000E-01 1.080000000000E+02 +-4.193151169009E+00 2.793930368079E+00 -6.657541041000E-01 1.080000000000E+02 +-4.225605661632E+00 2.806822396068E+00 -5.837632627000E-01 1.080000000000E+02 +-4.252979461615E+00 2.833408593241E+00 -5.032871173000E-01 1.080000000000E+02 +-4.271056073939E+00 2.873979548936E+00 -4.260584823000E-01 1.080000000000E+02 +-4.275669697907E+00 2.926209339808E+00 -3.540587787000E-01 1.080000000000E+02 +-4.266432742405E+00 2.985622060424E+00 -2.882948801000E-01 1.080000000000E+02 +-4.248092941234E+00 3.048087598098E+00 -2.275175217000E-01 1.080000000000E+02 +-4.226990908271E+00 3.111608072858E+00 -1.687606404000E-01 1.080000000000E+02 +-4.206487311436E+00 3.175381025886E+00 -1.100117670000E-01 1.080000000000E+02 +-4.189907008148E+00 3.236300764843E+00 -4.718627597000E-02 1.080000000000E+02 +-4.168135114078E+00 3.292777670605E+00 1.819661694000E-02 1.080000000000E+02 +-4.137411761058E+00 3.342697934177E+00 8.530081591000E-02 1.080000000000E+02 +-4.096748116290E+00 3.389211487492E+00 1.494783330000E-01 1.080000000000E+02 +-4.050784292977E+00 3.431446683237E+00 2.130101728000E-01 1.080000000000E+02 +-3.999504391834E+00 3.473677973317E+00 2.723890661000E-01 1.080000000000E+02 +-3.945320906933E+00 3.511893098675E+00 3.318667032000E-01 1.080000000000E+02 +-3.888412523809E+00 3.551783497384E+00 3.875539046000E-01 1.080000000000E+02 +-3.831670821652E+00 3.588495312202E+00 4.456338674000E-01 1.080000000000E+02 +-3.778346777681E+00 3.619356892533E+00 5.099892243000E-01 1.080000000000E+02 +-3.732874732147E+00 3.641498367766E+00 5.833000314000E-01 1.080000000000E+02 +-3.699626399392E+00 3.655170315475E+00 6.647899090000E-01 1.080000000000E+02 +-3.680925968075E+00 3.664035132544E+00 7.514880132000E-01 1.080000000000E+02 +-3.677767337988E+00 3.670749155062E+00 8.402099046000E-01 1.080000000000E+02 +-3.690427436170E+00 3.675155465718E+00 9.282726209000E-01 1.080000000000E+02 +-3.717951248645E+00 3.675399126063E+00 1.013024536000E+00 1.080000000000E+02 +-3.758316283557E+00 3.668345501961E+00 1.092107862000E+00 1.080000000000E+02 +-3.806532367866E+00 3.662903168054E+00 1.166812923000E+00 1.080000000000E+02 +-3.860912381273E+00 3.665375521681E+00 1.237341473000E+00 1.080000000000E+02 +-3.921131467423E+00 3.677739331236E+00 1.301808004000E+00 1.080000000000E+02 +-3.986701112490E+00 3.700161434844E+00 1.357785149000E+00 1.080000000000E+02 +-4.056491914239E+00 3.732049016679E+00 1.403042952000E+00 1.080000000000E+02 +-4.128803706563E+00 3.772410577340E+00 1.435958561000E+00 1.080000000000E+02 +-4.201587493602E+00 3.819773709133E+00 1.455667884000E+00 1.080000000000E+02 +-4.272915503312E+00 3.872769441585E+00 1.462072215000E+00 1.080000000000E+02 +-4.341017902237E+00 3.929826441197E+00 1.455639493000E+00 1.080000000000E+02 +-4.404979976086E+00 3.989140413646E+00 1.437348696000E+00 1.080000000000E+02 +-4.466041385115E+00 4.047196169999E+00 1.408608053000E+00 1.080000000000E+02 +-4.525677686809E+00 4.101550339865E+00 1.370749447000E+00 1.080000000000E+02 +-4.583581313847E+00 4.151615162989E+00 1.325285698000E+00 1.080000000000E+02 +-4.639397469146E+00 4.197821914002E+00 1.273441742000E+00 1.080000000000E+02 +-4.691587897158E+00 4.241936457015E+00 1.216246575000E+00 1.080000000000E+02 +-4.740288102705E+00 4.283912415048E+00 1.154539058000E+00 1.080000000000E+02 +-4.790240185719E+00 4.318240954015E+00 1.089263674000E+00 1.080000000000E+02 +-4.843642167049E+00 4.341400219271E+00 1.021917209000E+00 1.080000000000E+02 +-4.899591611883E+00 4.353830446593E+00 9.537419589000E-01 1.080000000000E+02 +-4.956242567220E+00 4.358127429845E+00 8.850071242000E-01 1.080000000000E+02 +-5.010767877198E+00 4.359062369268E+00 8.145657329000E-01 1.080000000000E+02 +-5.061385077857E+00 4.359703260576E+00 7.412825815000E-01 1.080000000000E+02 +-5.107491520026E+00 4.360545227490E+00 6.651770142000E-01 1.080000000000E+02 +-5.149110662520E+00 4.361290701164E+00 5.863142345000E-01 1.080000000000E+02 +-5.185368542423E+00 4.362539932878E+00 5.049593618000E-01 1.080000000000E+02 +-5.215665127205E+00 4.364686349507E+00 4.212413326000E-01 1.080000000000E+02 +-5.239859107737E+00 4.367495956556E+00 3.354886308000E-01 1.080000000000E+02 +-5.258177767851E+00 4.370237504846E+00 2.484589536000E-01 1.080000000000E+02 +-5.271004719720E+00 4.372281868749E+00 1.602254120000E-01 1.080000000000E+02 +-5.278744340953E+00 4.372882273218E+00 7.150080869000E-02 1.080000000000E+02 +-5.282348219460E+00 4.370833091219E+00 -1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +-6.522967902E+00 2.593869287E+00 -7.060900000E-01 3.600000000E+01 +-6.503076100E+00 2.552668536E+00 -8.029600000E-01 3.600000000E+01 +-6.478295599E+00 2.510931943E+00 -8.983500000E-01 3.600000000E+01 +-6.447829399E+00 2.468599601E+00 -9.918700000E-01 3.600000000E+01 +-6.409285106E+00 2.425663832E+00 -1.082130000E+00 3.600000000E+01 +-6.362585679E+00 2.382451842E+00 -1.168230000E+00 3.600000000E+01 +-6.308237829E+00 2.339269974E+00 -1.249630000E+00 3.600000000E+01 +-6.245582974E+00 2.296480268E+00 -1.325010000E+00 3.600000000E+01 +-6.174298594E+00 2.254577678E+00 -1.392860000E+00 3.600000000E+01 +-6.094570261E+00 2.214191459E+00 -1.451630000E+00 3.600000000E+01 +-6.007193786E+00 2.175961602E+00 -1.500110000E+00 3.600000000E+01 +-5.913467823E+00 2.140448456E+00 -1.537570000E+00 3.600000000E+01 +-5.814944602E+00 2.108050501E+00 -1.563950000E+00 3.600000000E+01 +-5.713160801E+00 2.078932426E+00 -1.579670000E+00 3.600000000E+01 +-5.609433208E+00 2.053136245E+00 -1.585460000E+00 3.600000000E+01 +-5.504827125E+00 2.030607777E+00 -1.582110000E+00 3.600000000E+01 +-5.400189482E+00 2.011270157E+00 -1.570270000E+00 3.600000000E+01 +-5.296222410E+00 1.995126724E+00 -1.550420000E+00 3.600000000E+01 +-5.193582471E+00 1.982209514E+00 -1.522840000E+00 3.600000000E+01 +-5.092941714E+00 1.972648339E+00 -1.487590000E+00 3.600000000E+01 +-4.995014091E+00 1.966566375E+00 -1.444770000E+00 3.600000000E+01 +-4.900270091E+00 1.963860466E+00 -1.394960000E+00 3.600000000E+01 +-4.809516322E+00 1.964696386E+00 -1.338190000E+00 3.600000000E+01 +-4.723826371E+00 1.969433876E+00 -1.274170000E+00 3.600000000E+01 +-4.644020749E+00 1.978100483E+00 -1.203290000E+00 3.600000000E+01 +-4.571197943E+00 1.990851549E+00 -1.125800000E+00 3.600000000E+01 +-4.503642076E+00 2.006390972E+00 -1.044140000E+00 3.600000000E+01 +-4.439493994E+00 2.023602852E+00 -9.600900000E-01 3.600000000E+01 +-4.379411081E+00 2.042705232E+00 -8.735000000E-01 3.600000000E+01 +-4.322979287E+00 2.063434368E+00 -7.848200000E-01 3.600000000E+01 +-4.268771964E+00 2.085099841E+00 -6.949900000E-01 3.600000000E+01 +-4.215613262E+00 2.107193442E+00 -6.046400000E-01 3.600000000E+01 +-4.164300313E+00 2.130047109E+00 -5.134200000E-01 3.600000000E+01 +-4.115599339E+00 2.153933240E+00 -4.210300000E-01 3.600000000E+01 +-4.071221467E+00 2.179439924E+00 -3.269400000E-01 3.600000000E+01 +-4.032816765E+00 2.207086170E+00 -2.308300000E-01 3.600000000E+01 +-3.993336267E+00 2.234358706E+00 -1.350400000E-01 3.600000000E+01 +-3.952673345E+00 2.261217146E+00 -3.963000000E-02 3.600000000E+01 +-3.914069361E+00 2.288780408E+00 5.642000000E-02 3.600000000E+01 +-3.879359700E+00 2.317652698E+00 1.535700000E-01 3.600000000E+01 +-3.847464138E+00 2.347432368E+00 2.514000000E-01 3.600000000E+01 +-3.815626661E+00 2.377217158E+00 3.492500000E-01 3.600000000E+01 +-3.788656280E+00 2.408486226E+00 4.480900000E-01 3.600000000E+01 +-3.767003701E+00 2.441282735E+00 5.477400000E-01 3.600000000E+01 +-3.749679147E+00 2.475233669E+00 6.478600000E-01 3.600000000E+01 +-3.734011235E+00 2.509609501E+00 7.481100000E-01 3.600000000E+01 +-3.721858795E+00 2.544846061E+00 8.485000000E-01 3.600000000E+01 +-3.716689455E+00 2.581682787E+00 9.489300000E-01 3.600000000E+01 +-3.718857532E+00 2.620006288E+00 1.048900000E+00 3.600000000E+01 +-3.728777643E+00 2.659722259E+00 1.147850000E+00 3.600000000E+01 +-3.746997447E+00 2.700672365E+00 1.245100000E+00 3.600000000E+01 +-3.774192528E+00 2.742692333E+00 1.339760000E+00 3.600000000E+01 +-3.811403092E+00 2.785524338E+00 1.430550000E+00 3.600000000E+01 +-3.859228875E+00 2.828751230E+00 1.516010000E+00 3.600000000E+01 +-3.917695340E+00 2.871810555E+00 1.594630000E+00 3.600000000E+01 +-3.986462505E+00 2.914047400E+00 1.664860000E+00 3.600000000E+01 +-4.064774948E+00 2.954715148E+00 1.725230000E+00 3.600000000E+01 +-4.151316314E+00 2.993141706E+00 1.774710000E+00 3.600000000E+01 +-4.244179296E+00 3.028991993E+00 1.813600000E+00 3.600000000E+01 +-4.341583946E+00 3.062283033E+00 1.843010000E+00 3.600000000E+01 +-4.443138576E+00 3.091852639E+00 1.860050000E+00 3.600000000E+01 +-4.546405549E+00 3.118401900E+00 1.868120000E+00 3.600000000E+01 +-4.650578774E+00 3.142853161E+00 1.870100000E+00 3.600000000E+01 +-4.755355859E+00 3.163206782E+00 1.860860000E+00 3.600000000E+01 +-4.859625953E+00 3.181127819E+00 1.845540000E+00 3.600000000E+01 +-4.963272694E+00 3.196197992E+00 1.823030000E+00 3.600000000E+01 +-5.065336517E+00 3.208189841E+00 1.793360000E+00 3.600000000E+01 +-5.166426029E+00 3.218324269E+00 1.759350000E+00 3.600000000E+01 +-5.264449346E+00 3.224648808E+00 1.717120000E+00 3.600000000E+01 +-5.360937352E+00 3.229054436E+00 1.670760000E+00 3.600000000E+01 +-5.453268140E+00 3.229722747E+00 1.617000000E+00 3.600000000E+01 +-5.542680329E+00 3.227739063E+00 1.558010000E+00 3.600000000E+01 +-5.629465425E+00 3.223859045E+00 1.495580000E+00 3.600000000E+01 +-5.712248099E+00 3.217083458E+00 1.427910000E+00 3.600000000E+01 +-5.793567276E+00 3.209429989E+00 1.358800000E+00 3.600000000E+01 +-5.866024572E+00 3.196450446E+00 1.280960000E+00 3.600000000E+01 +-5.938484080E+00 3.183484872E+00 1.203110000E+00 3.600000000E+01 +-6.003676423E+00 3.166809200E+00 1.119870000E+00 3.600000000E+01 +-6.067342826E+00 3.149358606E+00 1.035480000E+00 3.600000000E+01 +-6.127162494E+00 3.130176214E+00 9.488300000E-01 3.600000000E+01 +-6.183187632E+00 3.109275231E+00 8.599400000E-01 3.600000000E+01 +-6.236860374E+00 3.087443856E+00 7.699800000E-01 3.600000000E+01 +-6.281509582E+00 3.062023062E+00 6.759700000E-01 3.600000000E+01 +-6.326158789E+00 3.036602268E+00 5.819600000E-01 3.600000000E+01 +-6.363588440E+00 3.008630788E+00 4.855600000E-01 3.600000000E+01 +-6.400851169E+00 2.980599834E+00 3.891000000E-01 3.600000000E+01 +-6.432101859E+00 2.950635933E+00 2.911500000E-01 3.600000000E+01 +-6.462100286E+00 2.920268997E+00 1.928800000E-01 3.600000000E+01 +-6.485299975E+00 2.887929052E+00 9.349000000E-02 3.600000000E+01 +-6.506450334E+00 2.854990151E+00 -6.240000000E-03 3.600000000E+01 +-6.520735152E+00 2.820289280E+00 -1.065300000E-01 3.600000000E+01 +-6.533509646E+00 2.785183292E+00 -2.069400000E-01 3.600000000E+01 +-6.539012072E+00 2.748415516E+00 -3.074100000E-01 3.600000000E+01 +-6.542610097E+00 2.711240607E+00 -4.077700000E-01 3.600000000E+01 +-6.540225104E+00 2.672858392E+00 -5.077700000E-01 3.600000000E+01 +-6.533331390E+00 2.633672536E+00 -6.071600000E-01 3.600000000E+01 +-6.522967902E+00 2.593869287E+00 -7.060900000E-01 0.000000000E+00 6 AAE14_SC +-6.883930345E+00 9.302434188E-01 -7.213900000E-01 3.600000000E+01 +-6.839823758E+00 9.665032239E-01 -8.084600000E-01 3.600000000E+01 +-6.789496955E+00 1.002137392E+00 -8.923100000E-01 3.600000000E+01 +-6.733335858E+00 1.037006048E+00 -9.726500000E-01 3.600000000E+01 +-6.671618309E+00 1.070964958E+00 -1.049200000E+00 3.600000000E+01 +-6.603961858E+00 1.103723893E+00 -1.121050000E+00 3.600000000E+01 +-6.528306047E+00 1.134478044E+00 -1.185540000E+00 3.600000000E+01 +-6.445008669E+00 1.162683915E+00 -1.241260000E+00 3.600000000E+01 +-6.356496057E+00 1.188608701E+00 -1.289570000E+00 3.600000000E+01 +-6.263202545E+00 1.211875764E+00 -1.329530000E+00 3.600000000E+01 +-6.165777863E+00 1.232067192E+00 -1.360190000E+00 3.600000000E+01 +-6.065136439E+00 1.248809059E+00 -1.380740000E+00 3.600000000E+01 +-5.962377951E+00 1.261676621E+00 -1.390330000E+00 3.600000000E+01 +-5.858758502E+00 1.269876716E+00 -1.387100000E+00 3.600000000E+01 +-5.755687864E+00 1.274174029E+00 -1.373500000E+00 3.600000000E+01 +-5.654036805E+00 1.275139406E+00 -1.351240000E+00 3.600000000E+01 +-5.554499431E+00 1.272906325E+00 -1.320860000E+00 3.600000000E+01 +-5.457129031E+00 1.268218062E+00 -1.284380000E+00 3.600000000E+01 +-5.362031603E+00 1.261337037E+00 -1.242550000E+00 3.600000000E+01 +-5.268915531E+00 1.252817743E+00 -1.196770000E+00 3.600000000E+01 +-5.176914364E+00 1.243427422E+00 -1.148930000E+00 3.600000000E+01 +-5.085405613E+00 1.233665582E+00 -1.100210000E+00 3.600000000E+01 +-4.994850853E+00 1.223237182E+00 -1.049910000E+00 3.600000000E+01 +-4.905444116E+00 1.212011261E+00 -9.977300000E-01 3.600000000E+01 +-4.816918624E+00 1.200201894E+00 -9.442200000E-01 3.600000000E+01 +-4.729094309E+00 1.187937828E+00 -8.896400000E-01 3.600000000E+01 +-4.641935904E+00 1.175267607E+00 -8.341100000E-01 3.600000000E+01 +-4.555623476E+00 1.162062479E+00 -7.773900000E-01 3.600000000E+01 +-4.469993139E+00 1.148462951E+00 -7.197400000E-01 3.600000000E+01 +-4.384880248E+00 1.134559532E+00 -6.614000000E-01 3.600000000E+01 +-4.301457163E+00 1.119708350E+00 -6.009100000E-01 3.600000000E+01 +-4.220145071E+00 1.103720987E+00 -5.378800000E-01 3.600000000E+01 +-4.141507054E+00 1.086400873E+00 -4.719100000E-01 3.600000000E+01 +-4.066150308E+00 1.067558767E+00 -4.026100000E-01 3.600000000E+01 +-3.994815833E+00 1.046991396E+00 -3.296700000E-01 3.600000000E+01 +-3.928317439E+00 1.024548388E+00 -2.528300000E-01 3.600000000E+01 +-3.867509388E+00 1.000108758E+00 -1.720200000E-01 3.600000000E+01 +-3.813334935E+00 9.736161812E-01 -8.727000000E-02 3.600000000E+01 +-3.766444761E+00 9.451107822E-01 1.130000000E-03 3.600000000E+01 +-3.728991463E+00 9.143518529E-01 9.328000000E-02 3.600000000E+01 +-3.701957420E+00 8.816205112E-01 1.882300000E-01 3.600000000E+01 +-3.682434508E+00 8.477210010E-01 2.844900000E-01 3.600000000E+01 +-3.671027082E+00 8.126721490E-01 3.818700000E-01 3.600000000E+01 +-3.673528595E+00 7.763939898E-01 4.791500000E-01 3.600000000E+01 +-3.679927317E+00 7.397706235E-01 5.764100000E-01 3.600000000E+01 +-3.699043597E+00 7.027581345E-01 6.716100000E-01 3.600000000E+01 +-3.721372717E+00 6.656448565E-01 7.663000000E-01 3.600000000E+01 +-3.752287072E+00 6.288112697E-01 8.581300000E-01 3.600000000E+01 +-3.793385785E+00 5.923191034E-01 9.465600000E-01 3.600000000E+01 +-3.834476408E+00 5.558210593E-01 1.034990000E+00 3.600000000E+01 +-3.889114795E+00 5.207855016E-01 1.116160000E+00 3.600000000E+01 +-3.946093499E+00 4.860164440E-01 1.196060000E+00 3.600000000E+01 +-4.009358158E+00 4.525140990E-01 1.270980000E+00 3.600000000E+01 +-4.082619038E+00 4.210582273E-01 1.337940000E+00 3.600000000E+01 +-4.158875669E+00 3.906169911E-01 1.401440000E+00 3.600000000E+01 +-4.244254109E+00 3.632556226E-01 1.454390000E+00 3.600000000E+01 +-4.333619224E+00 3.381479881E-01 1.500280000E+00 3.600000000E+01 +-4.429692783E+00 3.168389439E-01 1.534290000E+00 3.600000000E+01 +-4.529185967E+00 2.989043719E-01 1.558340000E+00 3.600000000E+01 +-4.630352754E+00 2.830386297E-01 1.576410000E+00 3.600000000E+01 +-4.733408496E+00 2.706466097E-01 1.584630000E+00 3.600000000E+01 +-4.836964850E+00 2.611893277E-01 1.584800000E+00 3.600000000E+01 +-4.940572239E+00 2.539075216E-01 1.579120000E+00 3.600000000E+01 +-5.043858774E+00 2.490748690E-01 1.566880000E+00 3.600000000E+01 +-5.146058556E+00 2.470990447E-01 1.547210000E+00 3.600000000E+01 +-5.247262963E+00 2.468845352E-01 1.523040000E+00 3.600000000E+01 +-5.347357281E+00 2.483850768E-01 1.494500000E+00 3.600000000E+01 +-5.446021003E+00 2.517015469E-01 1.461420000E+00 3.600000000E+01 +-5.542895385E+00 2.569194019E-01 1.423650000E+00 3.600000000E+01 +-5.638333793E+00 2.634672111E-01 1.382610000E+00 3.600000000E+01 +-5.732261963E+00 2.713281001E-01 1.338430000E+00 3.600000000E+01 +-5.824587236E+00 2.804594708E-01 1.291210000E+00 3.600000000E+01 +-5.915124363E+00 2.909121413E-01 1.240850000E+00 3.600000000E+01 +-6.003610164E+00 3.027421137E-01 1.187270000E+00 3.600000000E+01 +-6.090227611E+00 3.157485871E-01 1.131000000E+00 3.600000000E+01 +-6.174826722E+00 3.299338388E-01 1.072020000E+00 3.600000000E+01 +-6.257234002E+00 3.453325066E-01 1.010300000E+00 3.600000000E+01 +-6.337200240E+00 3.619983804E-01 9.457800000E-01 3.600000000E+01 +-6.414479888E+00 3.799631917E-01 8.783800000E-01 3.600000000E+01 +-6.488734049E+00 3.993020943E-01 8.080400000E-01 3.600000000E+01 +-6.559619400E+00 4.200623059E-01 7.346800000E-01 3.600000000E+01 +-6.626680875E+00 4.423087429E-01 6.582400000E-01 3.600000000E+01 +-6.689508975E+00 4.660776265E-01 5.787300000E-01 3.600000000E+01 +-6.747602305E+00 4.914125738E-01 4.961700000E-01 3.600000000E+01 +-6.800506493E+00 5.182924807E-01 4.106700000E-01 3.600000000E+01 +-6.847777469E+00 5.467160889E-01 3.224100000E-01 3.600000000E+01 +-6.888878503E+00 5.766395420E-01 2.316100000E-01 3.600000000E+01 +-6.922853829E+00 6.080853530E-01 1.384300000E-01 3.600000000E+01 +-6.949160082E+00 6.409677614E-01 4.327000000E-02 3.600000000E+01 +-6.967781709E+00 6.750529763E-01 -5.326000000E-02 3.600000000E+01 +-6.978637746E+00 7.101462047E-01 -1.506200000E-01 3.600000000E+01 +-6.981772936E+00 7.460327423E-01 -2.482300000E-01 3.600000000E+01 +-6.977398190E+00 7.825073634E-01 -3.455700000E-01 3.600000000E+01 +-6.965808222E+00 8.193515687E-01 -4.421800000E-01 3.600000000E+01 +-6.947062507E+00 8.563984358E-01 -5.375700000E-01 3.600000000E+01 +-6.920344132E+00 8.934623458E-01 -6.310500000E-01 3.600000000E+01 +-6.883930345E+00 9.302434188E-01 -7.213900000E-01 0.000000000E+00 7 AAE23_SC +-6.883930359E+00 -9.302490090E-01 7.213900000E-01 3.600000000E+01 +-6.920355030E+00 -8.934637685E-01 6.310500000E-01 3.600000000E+01 +-6.947058826E+00 -8.563989136E-01 5.375700000E-01 3.600000000E+01 +-6.965813474E+00 -8.193493765E-01 4.421800000E-01 3.600000000E+01 +-6.977398210E+00 -7.825030092E-01 3.455700000E-01 3.600000000E+01 +-6.981778398E+00 -7.460333059E-01 2.482300000E-01 3.600000000E+01 +-6.978634855E+00 -7.101474447E-01 1.506200000E-01 3.600000000E+01 +-6.967784413E+00 -6.750526686E-01 5.326000000E-02 3.600000000E+01 +-6.949157862E+00 -6.409599511E-01 -4.327000000E-02 3.600000000E+01 +-6.922855818E+00 -6.080928456E-01 -1.384300000E-01 3.600000000E+01 +-6.888877459E+00 -5.766373610E-01 -2.316100000E-01 3.600000000E+01 +-6.847777080E+00 -5.467099260E-01 -3.224100000E-01 3.600000000E+01 +-6.800508997E+00 -5.182970275E-01 -4.106700000E-01 3.600000000E+01 +-6.747601088E+00 -4.914106812E-01 -4.961600000E-01 3.600000000E+01 +-6.689506966E+00 -4.660797771E-01 -5.787300000E-01 3.600000000E+01 +-6.626684670E+00 -4.423052692E-01 -6.582400000E-01 3.600000000E+01 +-6.559610631E+00 -4.200623879E-01 -7.346800000E-01 3.600000000E+01 +-6.488743646E+00 -3.993020930E-01 -8.080400000E-01 3.600000000E+01 +-6.414486640E+00 -3.799664951E-01 -8.783800000E-01 3.600000000E+01 +-6.337206514E+00 -3.619991578E-01 -9.457800000E-01 3.600000000E+01 +-6.257228260E+00 -3.453370080E-01 -1.010300000E+00 3.600000000E+01 +-6.174830547E+00 -3.299382716E-01 -1.072020000E+00 3.600000000E+01 +-6.090230291E+00 -3.157442351E-01 -1.131000000E+00 3.600000000E+01 +-6.003607622E+00 -3.027476322E-01 -1.187270000E+00 3.600000000E+01 +-5.915125037E+00 -2.909169266E-01 -1.240850000E+00 3.600000000E+01 +-5.824591281E+00 -2.804652390E-01 -1.291210000E+00 3.600000000E+01 +-5.732259294E+00 -2.713324026E-01 -1.338430000E+00 3.600000000E+01 +-5.638329813E+00 -2.634714598E-01 -1.382610000E+00 3.600000000E+01 +-5.542898402E+00 -2.569118646E-01 -1.423650000E+00 3.600000000E+01 +-5.446014296E+00 -2.517043704E-01 -1.461420000E+00 3.600000000E+01 +-5.347349333E+00 -2.483840568E-01 -1.494500000E+00 3.600000000E+01 +-5.247264536E+00 -2.468863973E-01 -1.523040000E+00 3.600000000E+01 +-5.146055509E+00 -2.471078679E-01 -1.547210000E+00 3.600000000E+01 +-5.043859720E+00 -2.490845598E-01 -1.566880000E+00 3.600000000E+01 +-4.940568572E+00 -2.539089501E-01 -1.579120000E+00 3.600000000E+01 +-4.836965986E+00 -2.611968962E-01 -1.584800000E+00 3.600000000E+01 +-4.733400598E+00 -2.706456560E-01 -1.584630000E+00 3.600000000E+01 +-4.630350663E+00 -2.830325800E-01 -1.576410000E+00 3.600000000E+01 +-4.529190035E+00 -2.989045892E-01 -1.558340000E+00 3.600000000E+01 +-4.429694423E+00 -3.168301133E-01 -1.534290000E+00 3.600000000E+01 +-4.333613734E+00 -3.381458735E-01 -1.500280000E+00 3.600000000E+01 +-4.244256241E+00 -3.632541423E-01 -1.454390000E+00 3.600000000E+01 +-4.158881068E+00 -3.906111299E-01 -1.401440000E+00 3.600000000E+01 +-4.082624021E+00 -4.210589050E-01 -1.337940000E+00 3.600000000E+01 +-4.009363961E+00 -4.525182969E-01 -1.270980000E+00 3.600000000E+01 +-3.946098174E+00 -4.860116563E-01 -1.196060000E+00 3.600000000E+01 +-3.889115654E+00 -5.207865559E-01 -1.116160000E+00 3.600000000E+01 +-3.834483492E+00 -5.558191683E-01 -1.034990000E+00 3.600000000E+01 +-3.793386670E+00 -5.923154429E-01 -9.465600000E-01 3.600000000E+01 +-3.752281757E+00 -6.288175953E-01 -8.581200000E-01 3.600000000E+01 +-3.721377056E+00 -6.656466449E-01 -7.663000000E-01 3.600000000E+01 +-3.699041152E+00 -7.027518178E-01 -6.716100000E-01 3.600000000E+01 +-3.679932879E+00 -7.397739831E-01 -5.764100000E-01 3.600000000E+01 +-3.673524162E+00 -7.763949066E-01 -4.791500000E-01 3.600000000E+01 +-3.671029158E+00 -8.126692082E-01 -3.818700000E-01 3.600000000E+01 +-3.682430295E+00 -8.477223402E-01 -2.844900000E-01 3.600000000E+01 +-3.701953902E+00 -8.816206544E-01 -1.882300000E-01 3.600000000E+01 +-3.728986077E+00 -9.143528292E-01 -9.328000000E-02 3.600000000E+01 +-3.766439393E+00 -9.451129905E-01 -1.130000000E-03 3.600000000E+01 +-3.813342031E+00 -9.736183514E-01 8.727000000E-02 3.600000000E+01 +-3.867513959E+00 -1.000117843E+00 1.720200000E-01 3.600000000E+01 +-3.928319980E+00 -1.024553817E+00 2.528300000E-01 3.600000000E+01 +-3.994818988E+00 -1.046991990E+00 3.296700000E-01 3.600000000E+01 +-4.066147048E+00 -1.067553262E+00 4.026200000E-01 3.600000000E+01 +-4.141497550E+00 -1.086403406E+00 4.719100000E-01 3.600000000E+01 +-4.220147692E+00 -1.103721468E+00 5.378800000E-01 3.600000000E+01 +-4.301450390E+00 -1.119705647E+00 6.009100000E-01 3.600000000E+01 +-4.384878396E+00 -1.134565963E+00 6.614000000E-01 3.600000000E+01 +-4.469997118E+00 -1.148469838E+00 7.197400000E-01 3.600000000E+01 +-4.555622549E+00 -1.162067370E+00 7.773900000E-01 3.600000000E+01 +-4.641934126E+00 -1.175265273E+00 8.341100000E-01 3.600000000E+01 +-4.729101743E+00 -1.187940112E+00 8.896400000E-01 3.600000000E+01 +-4.816915815E+00 -1.200194717E+00 9.442200000E-01 3.600000000E+01 +-4.905444728E+00 -1.212004124E+00 9.977300000E-01 3.600000000E+01 +-4.994852498E+00 -1.223236806E+00 1.049910000E+00 3.600000000E+01 +-5.085418615E+00 -1.233664983E+00 1.100210000E+00 3.600000000E+01 +-5.176912890E+00 -1.243431174E+00 1.148930000E+00 3.600000000E+01 +-5.268919058E+00 -1.252813092E+00 1.196770000E+00 3.600000000E+01 +-5.362034338E+00 -1.261339751E+00 1.242550000E+00 3.600000000E+01 +-5.457128868E+00 -1.268218268E+00 1.284380000E+00 3.600000000E+01 +-5.554502874E+00 -1.272909140E+00 1.320860000E+00 3.600000000E+01 +-5.654034439E+00 -1.275142486E+00 1.351240000E+00 3.600000000E+01 +-5.755690832E+00 -1.274175721E+00 1.373500000E+00 3.600000000E+01 +-5.858756020E+00 -1.269873960E+00 1.387100000E+00 3.600000000E+01 +-5.962380360E+00 -1.261680240E+00 1.390330000E+00 3.600000000E+01 +-6.065135708E+00 -1.248802787E+00 1.380740000E+00 3.600000000E+01 +-6.165781363E+00 -1.232068860E+00 1.360180000E+00 3.600000000E+01 +-6.263195196E+00 -1.211873469E+00 1.329530000E+00 3.600000000E+01 +-6.356491086E+00 -1.188613206E+00 1.289570000E+00 3.600000000E+01 +-6.445004944E+00 -1.162684034E+00 1.241260000E+00 3.600000000E+01 +-6.528308685E+00 -1.134483501E+00 1.185540000E+00 3.600000000E+01 +-6.603956388E+00 -1.103724439E+00 1.121050000E+00 3.600000000E+01 +-6.671615466E+00 -1.070969864E+00 1.049200000E+00 3.600000000E+01 +-6.733338264E+00 -1.037003024E+00 9.726500000E-01 3.600000000E+01 +-6.789504001E+00 -1.002141714E+00 8.923100000E-01 3.600000000E+01 +-6.839828828E+00 -9.665056384E-01 8.084600000E-01 3.600000000E+01 +-6.883930359E+00 -9.302490090E-01 7.213900000E-01 0.000000000E+00 7 AAE23_SC +-6.522967844E+00 -2.593858614E+00 7.060900000E-01 3.600000000E+01 +-6.533336675E+00 -2.633666622E+00 6.071600000E-01 3.600000000E+01 +-6.540224561E+00 -2.672851710E+00 5.077700000E-01 3.600000000E+01 +-6.542605959E+00 -2.711244289E+00 4.077700000E-01 3.600000000E+01 +-6.539009174E+00 -2.748417967E+00 3.074100000E-01 3.600000000E+01 +-6.533508378E+00 -2.785182691E+00 2.069400000E-01 3.600000000E+01 +-6.520740046E+00 -2.820280888E+00 1.065300000E-01 3.600000000E+01 +-6.506457354E+00 -2.854996049E+00 6.240000000E-03 3.600000000E+01 +-6.485304933E+00 -2.887928709E+00 -9.349000000E-02 3.600000000E+01 +-6.462099342E+00 -2.920264128E+00 -1.928800000E-01 3.600000000E+01 +-6.432102776E+00 -2.950636221E+00 -2.911500000E-01 3.600000000E+01 +-6.400846247E+00 -2.980601138E+00 -3.891000000E-01 3.600000000E+01 +-6.363596437E+00 -3.008628842E+00 -4.855600000E-01 3.600000000E+01 +-6.326155500E+00 -3.036597637E+00 -5.819600000E-01 3.600000000E+01 +-6.281508472E+00 -3.062014736E+00 -6.759700000E-01 3.600000000E+01 +-6.236859231E+00 -3.087445802E+00 -7.699800000E-01 3.600000000E+01 +-6.183193566E+00 -3.109279567E+00 -8.599400000E-01 3.600000000E+01 +-6.127163900E+00 -3.130173333E+00 -9.488300000E-01 3.600000000E+01 +-6.067337663E+00 -3.149363263E+00 -1.035480000E+00 3.600000000E+01 +-6.003677377E+00 -3.166814784E+00 -1.119870000E+00 3.600000000E+01 +-5.938486746E+00 -3.183486982E+00 -1.203110000E+00 3.600000000E+01 +-5.866021464E+00 -3.196458309E+00 -1.280960000E+00 3.600000000E+01 +-5.793570149E+00 -3.209431849E+00 -1.358800000E+00 3.600000000E+01 +-5.712246601E+00 -3.217084077E+00 -1.427910000E+00 3.600000000E+01 +-5.629466278E+00 -3.223854087E+00 -1.495580000E+00 3.600000000E+01 +-5.542683356E+00 -3.227734996E+00 -1.558010000E+00 3.600000000E+01 +-5.453272948E+00 -3.229717797E+00 -1.617000000E+00 3.600000000E+01 +-5.360930295E+00 -3.229059775E+00 -1.670760000E+00 3.600000000E+01 +-5.264450178E+00 -3.224646506E+00 -1.717120000E+00 3.600000000E+01 +-5.166424814E+00 -3.218327557E+00 -1.759350000E+00 3.600000000E+01 +-5.065331017E+00 -3.208193583E+00 -1.793360000E+00 3.600000000E+01 +-4.963279389E+00 -3.196196854E+00 -1.823030000E+00 3.600000000E+01 +-4.859624257E+00 -3.181125425E+00 -1.845540000E+00 3.600000000E+01 +-4.755354378E+00 -3.163200334E+00 -1.860860000E+00 3.600000000E+01 +-4.650579090E+00 -3.142861292E+00 -1.870100000E+00 3.600000000E+01 +-4.546406441E+00 -3.118400924E+00 -1.868120000E+00 3.600000000E+01 +-4.443137634E+00 -3.091850038E+00 -1.860050000E+00 3.600000000E+01 +-4.341584788E+00 -3.062284856E+00 -1.843010000E+00 3.600000000E+01 +-4.244181072E+00 -3.028988235E+00 -1.813600000E+00 3.600000000E+01 +-4.151312644E+00 -2.993138175E+00 -1.774710000E+00 3.600000000E+01 +-4.064771966E+00 -2.954717887E+00 -1.725230000E+00 3.600000000E+01 +-3.986462356E+00 -2.914050304E+00 -1.664860000E+00 3.600000000E+01 +-3.917693640E+00 -2.871815390E+00 -1.594630000E+00 3.600000000E+01 +-3.859228617E+00 -2.828756812E+00 -1.516010000E+00 3.600000000E+01 +-3.811401500E+00 -2.785521718E+00 -1.430550000E+00 3.600000000E+01 +-3.774191423E+00 -2.742693859E+00 -1.339760000E+00 3.600000000E+01 +-3.746998262E+00 -2.700672169E+00 -1.245100000E+00 3.600000000E+01 +-3.728777886E+00 -2.659720828E+00 -1.147850000E+00 3.600000000E+01 +-3.718851608E+00 -2.620011550E+00 -1.048900000E+00 3.600000000E+01 +-3.716689273E+00 -2.581682304E+00 -9.489300000E-01 3.600000000E+01 +-3.721865139E+00 -2.544844638E+00 -8.485000000E-01 3.600000000E+01 +-3.734017425E+00 -2.509613074E+00 -7.481100000E-01 3.600000000E+01 +-3.749679220E+00 -2.475230888E+00 -6.478600000E-01 3.600000000E+01 +-3.767004598E+00 -2.441284010E+00 -5.477400000E-01 3.600000000E+01 +-3.788656897E+00 -2.408494956E+00 -4.480900000E-01 3.600000000E+01 +-3.815624809E+00 -2.377220778E+00 -3.492500000E-01 3.600000000E+01 +-3.847462812E+00 -2.347426709E+00 -2.514000000E-01 3.600000000E+01 +-3.879368443E+00 -2.317657669E+00 -1.535700000E-01 3.600000000E+01 +-3.914066724E+00 -2.288789131E+00 -5.642000000E-02 3.600000000E+01 +-3.952669848E+00 -2.261212025E+00 3.963000000E-02 3.600000000E+01 +-3.993342258E+00 -2.234356418E+00 1.350400000E-01 3.600000000E+01 +-4.032812788E+00 -2.207088517E+00 2.308300000E-01 3.600000000E+01 +-4.071218907E+00 -2.179444412E+00 3.269400000E-01 3.600000000E+01 +-4.115601302E+00 -2.153935285E+00 4.210300000E-01 3.600000000E+01 +-4.164295695E+00 -2.130039809E+00 5.134100000E-01 3.600000000E+01 +-4.215608420E+00 -2.107196206E+00 6.046400000E-01 3.600000000E+01 +-4.268772061E+00 -2.085096789E+00 6.949900000E-01 3.600000000E+01 +-4.322983173E+00 -2.063435325E+00 7.848200000E-01 3.600000000E+01 +-4.379402426E+00 -2.042703493E+00 8.735000000E-01 3.600000000E+01 +-4.439493296E+00 -2.023605591E+00 9.600900000E-01 3.600000000E+01 +-4.503637973E+00 -2.006395452E+00 1.044140000E+00 3.600000000E+01 +-4.571197659E+00 -1.990857352E+00 1.125800000E+00 3.600000000E+01 +-4.644023833E+00 -1.978093527E+00 1.203290000E+00 3.600000000E+01 +-4.723832588E+00 -1.969428184E+00 1.274170000E+00 3.600000000E+01 +-4.809512361E+00 -1.964692429E+00 1.338190000E+00 3.600000000E+01 +-4.900265456E+00 -1.963860146E+00 1.394960000E+00 3.600000000E+01 +-4.995017160E+00 -1.966574978E+00 1.444770000E+00 3.600000000E+01 +-5.092938241E+00 -1.972648316E+00 1.487590000E+00 3.600000000E+01 +-5.193578684E+00 -1.982209340E+00 1.522840000E+00 3.600000000E+01 +-5.296222457E+00 -1.995123166E+00 1.550420000E+00 3.600000000E+01 +-5.400187337E+00 -2.011267421E+00 1.570270000E+00 3.600000000E+01 +-5.504827825E+00 -2.030604301E+00 1.582110000E+00 3.600000000E+01 +-5.609427820E+00 -2.053134934E+00 1.585460000E+00 3.600000000E+01 +-5.713160174E+00 -2.078928771E+00 1.579670000E+00 3.600000000E+01 +-5.814947765E+00 -2.108051466E+00 1.563950000E+00 3.600000000E+01 +-5.913467231E+00 -2.140450922E+00 1.537570000E+00 3.600000000E+01 +-6.007198965E+00 -2.175958049E+00 1.500110000E+00 3.600000000E+01 +-6.094570522E+00 -2.214194931E+00 1.451630000E+00 3.600000000E+01 +-6.174298494E+00 -2.254586016E+00 1.392860000E+00 3.600000000E+01 +-6.245584750E+00 -2.296475111E+00 1.325020000E+00 3.600000000E+01 +-6.308236210E+00 -2.339273218E+00 1.249630000E+00 3.600000000E+01 +-6.362581036E+00 -2.382445256E+00 1.168230000E+00 3.600000000E+01 +-6.409280344E+00 -2.425659226E+00 1.082140000E+00 3.600000000E+01 +-6.447832868E+00 -2.468599479E+00 9.918700000E-01 3.600000000E+01 +-6.478291705E+00 -2.510930784E+00 8.983500000E-01 3.600000000E+01 +-6.503066880E+00 -2.552669731E+00 8.029600000E-01 3.600000000E+01 +-6.522967844E+00 -2.593858614E+00 7.060900000E-01 0.000000000E+00 6 AAE14_SC +-5.282348219460E+00 -4.370833091219E+00 1.744954334000E-02 1.080000000000E+02 +-5.278744340953E+00 -4.372882273218E+00 -7.150080869000E-02 1.080000000000E+02 +-5.271004719720E+00 -4.372281868749E+00 -1.602254120000E-01 1.080000000000E+02 +-5.258177767851E+00 -4.370237504846E+00 -2.484589536000E-01 1.080000000000E+02 +-5.239859107737E+00 -4.367495956556E+00 -3.354886308000E-01 1.080000000000E+02 +-5.215665127205E+00 -4.364686349507E+00 -4.212413326000E-01 1.080000000000E+02 +-5.185368542423E+00 -4.362539932878E+00 -5.049593618000E-01 1.080000000000E+02 +-5.149110662520E+00 -4.361290701164E+00 -5.863142345000E-01 1.080000000000E+02 +-5.107491520026E+00 -4.360545227490E+00 -6.651770142000E-01 1.080000000000E+02 +-5.061385077857E+00 -4.359703260576E+00 -7.412825815000E-01 1.080000000000E+02 +-5.010767877198E+00 -4.359062369268E+00 -8.145657329000E-01 1.080000000000E+02 +-4.956242567220E+00 -4.358127429845E+00 -8.850071242000E-01 1.080000000000E+02 +-4.899591611883E+00 -4.353830446593E+00 -9.537419589000E-01 1.080000000000E+02 +-4.843642167049E+00 -4.341400219271E+00 -1.021917209000E+00 1.080000000000E+02 +-4.790240185719E+00 -4.318240954015E+00 -1.089263674000E+00 1.080000000000E+02 +-4.740288102705E+00 -4.283912415048E+00 -1.154539058000E+00 1.080000000000E+02 +-4.691587897158E+00 -4.241936457015E+00 -1.216246575000E+00 1.080000000000E+02 +-4.639397469146E+00 -4.197821914002E+00 -1.273441742000E+00 1.080000000000E+02 +-4.583581313847E+00 -4.151615162989E+00 -1.325285698000E+00 1.080000000000E+02 +-4.525677686809E+00 -4.101550339865E+00 -1.370749447000E+00 1.080000000000E+02 +-4.466041385115E+00 -4.047196169999E+00 -1.408608053000E+00 1.080000000000E+02 +-4.404979976086E+00 -3.989140413646E+00 -1.437348696000E+00 1.080000000000E+02 +-4.341017902237E+00 -3.929826441197E+00 -1.455639493000E+00 1.080000000000E+02 +-4.272915503312E+00 -3.872769441585E+00 -1.462072215000E+00 1.080000000000E+02 +-4.201587493602E+00 -3.819773709133E+00 -1.455667884000E+00 1.080000000000E+02 +-4.128803706563E+00 -3.772410577340E+00 -1.435958561000E+00 1.080000000000E+02 +-4.056491914239E+00 -3.732049016679E+00 -1.403042952000E+00 1.080000000000E+02 +-3.986701112490E+00 -3.700161434844E+00 -1.357785149000E+00 1.080000000000E+02 +-3.921131467423E+00 -3.677739331236E+00 -1.301808004000E+00 1.080000000000E+02 +-3.860912381273E+00 -3.665375521681E+00 -1.237341473000E+00 1.080000000000E+02 +-3.806532367866E+00 -3.662903168054E+00 -1.166812923000E+00 1.080000000000E+02 +-3.758316283557E+00 -3.668345501961E+00 -1.092107862000E+00 1.080000000000E+02 +-3.717951248645E+00 -3.675399126063E+00 -1.013024536000E+00 1.080000000000E+02 +-3.690427436170E+00 -3.675155465718E+00 -9.282726209000E-01 1.080000000000E+02 +-3.677767337988E+00 -3.670749155062E+00 -8.402099046000E-01 1.080000000000E+02 +-3.680925968075E+00 -3.664035132544E+00 -7.514880132000E-01 1.080000000000E+02 +-3.699626399392E+00 -3.655170315475E+00 -6.647899090000E-01 1.080000000000E+02 +-3.732874732147E+00 -3.641498367766E+00 -5.833000314000E-01 1.080000000000E+02 +-3.778346777681E+00 -3.619356892533E+00 -5.099892243000E-01 1.080000000000E+02 +-3.831670821652E+00 -3.588495312202E+00 -4.456338674000E-01 1.080000000000E+02 +-3.888412523809E+00 -3.551783497384E+00 -3.875539046000E-01 1.080000000000E+02 +-3.945320906933E+00 -3.511893098675E+00 -3.318667032000E-01 1.080000000000E+02 +-3.999504391834E+00 -3.473677973317E+00 -2.723890661000E-01 1.080000000000E+02 +-4.050784292977E+00 -3.431446683237E+00 -2.130101728000E-01 1.080000000000E+02 +-4.096748116290E+00 -3.389211487492E+00 -1.494783330000E-01 1.080000000000E+02 +-4.137411761058E+00 -3.342697934177E+00 -8.530081591000E-02 1.080000000000E+02 +-4.168135114078E+00 -3.292777670605E+00 -1.819661694000E-02 1.080000000000E+02 +-4.189907008148E+00 -3.236300764843E+00 4.718627597000E-02 1.080000000000E+02 +-4.206487311436E+00 -3.175381025886E+00 1.100117670000E-01 1.080000000000E+02 +-4.226990908271E+00 -3.111608072858E+00 1.687606404000E-01 1.080000000000E+02 +-4.248092941234E+00 -3.048087598098E+00 2.275175217000E-01 1.080000000000E+02 +-4.266432742405E+00 -2.985622060424E+00 2.882948801000E-01 1.080000000000E+02 +-4.275669697907E+00 -2.926209339808E+00 3.540587787000E-01 1.080000000000E+02 +-4.271056073939E+00 -2.873979548936E+00 4.260584823000E-01 1.080000000000E+02 +-4.252979461615E+00 -2.833408593241E+00 5.032871173000E-01 1.080000000000E+02 +-4.225605661632E+00 -2.806822396068E+00 5.837632627000E-01 1.080000000000E+02 +-4.193151169009E+00 -2.793930368079E+00 6.657541041000E-01 1.080000000000E+02 +-4.158051066235E+00 -2.793538220860E+00 7.475896770000E-01 1.080000000000E+02 +-4.120273419345E+00 -2.805133309909E+00 8.274301477000E-01 1.080000000000E+02 +-4.081801811475E+00 -2.825960442811E+00 9.050198505000E-01 1.080000000000E+02 +-4.049189345405E+00 -2.851294656661E+00 9.840199882000E-01 1.080000000000E+02 +-4.029398185205E+00 -2.879144506374E+00 1.066259509000E+00 1.080000000000E+02 +-4.024706131039E+00 -2.911389253048E+00 1.149164457000E+00 1.080000000000E+02 +-4.034864919660E+00 -2.950056411290E+00 1.228771473000E+00 1.080000000000E+02 +-4.059061309777E+00 -2.995468456062E+00 1.301455248000E+00 1.080000000000E+02 +-4.096225913731E+00 -3.046254221264E+00 1.364609021000E+00 1.080000000000E+02 +-4.145966342424E+00 -3.098889420530E+00 1.416487546000E+00 1.080000000000E+02 +-4.207355101639E+00 -3.149474081196E+00 1.456473280000E+00 1.080000000000E+02 +-4.278729161110E+00 -3.194604054815E+00 1.484801442000E+00 1.080000000000E+02 +-4.357187986457E+00 -3.232847760060E+00 1.502532507000E+00 1.080000000000E+02 +-4.438945962439E+00 -3.267118184380E+00 1.511502484000E+00 1.080000000000E+02 +-4.521251183597E+00 -3.301316120240E+00 1.512984118000E+00 1.080000000000E+02 +-4.601598165155E+00 -3.339194400421E+00 1.507450791000E+00 1.080000000000E+02 +-4.677692370641E+00 -3.383746005767E+00 1.494787468000E+00 1.080000000000E+02 +-4.748950586796E+00 -3.433384092173E+00 1.474786583000E+00 1.080000000000E+02 +-4.815378190500E+00 -3.486111125707E+00 1.447633049000E+00 1.080000000000E+02 +-4.875881378818E+00 -3.542067127169E+00 1.413793625000E+00 1.080000000000E+02 +-4.929237974366E+00 -3.601403640468E+00 1.374018251000E+00 1.080000000000E+02 +-4.974467730741E+00 -3.663775032568E+00 1.329400646000E+00 1.080000000000E+02 +-5.011028851436E+00 -3.729112151651E+00 1.280975246000E+00 1.080000000000E+02 +-5.037905565962E+00 -3.797139299389E+00 1.230287750000E+00 1.080000000000E+02 +-5.056452751838E+00 -3.866811505809E+00 1.177853833000E+00 1.080000000000E+02 +-5.070439439571E+00 -3.935587996494E+00 1.123012040000E+00 1.080000000000E+02 +-5.082565798206E+00 -4.001906619889E+00 1.064920566000E+00 1.080000000000E+02 +-5.096460746401E+00 -4.063513553089E+00 1.002061223000E+00 1.080000000000E+02 +-5.115952570215E+00 -4.116837424625E+00 9.334175927000E-01 1.080000000000E+02 +-5.139790667104E+00 -4.161621414016E+00 8.601609198000E-01 1.080000000000E+02 +-5.164355187931E+00 -4.200347130769E+00 7.837241475000E-01 1.080000000000E+02 +-5.187989630253E+00 -4.234213404943E+00 7.047985910000E-01 1.080000000000E+02 +-5.210000201932E+00 -4.263752693974E+00 6.236520547000E-01 1.080000000000E+02 +-5.229598467324E+00 -4.289456558061E+00 5.407768227000E-01 1.080000000000E+02 +-5.246288975081E+00 -4.311865775592E+00 4.560661339000E-01 1.080000000000E+02 +-5.260168366993E+00 -4.330476929970E+00 3.701617308000E-01 1.080000000000E+02 +-5.271402047957E+00 -4.345062352379E+00 2.829651087000E-01 1.080000000000E+02 +-5.279036198340E+00 -4.356482388143E+00 1.949310037000E-01 1.080000000000E+02 +-5.282575291438E+00 -4.365208846521E+00 1.063739981000E-01 1.080000000000E+02 +-5.282348219460E+00 -4.370833091219E+00 1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +-4.564435369340E+00 -5.020429867828E+00 2.786784824000E-03 1.080000000000E+02 +-4.558446757857E+00 -5.029312173810E+00 -8.489061568000E-02 1.080000000000E+02 +-4.549235316654E+00 -5.035402562198E+00 -1.724869752000E-01 1.080000000000E+02 +-4.538212508835E+00 -5.037564188143E+00 -2.600860194000E-01 1.080000000000E+02 +-4.527136056838E+00 -5.034293735050E+00 -3.477269332000E-01 1.080000000000E+02 +-4.515616348030E+00 -5.025673976755E+00 -4.348356053000E-01 1.080000000000E+02 +-4.503075259032E+00 -5.011842922231E+00 -5.212198625000E-01 1.080000000000E+02 +-4.490987347194E+00 -4.991445729805E+00 -6.062523787000E-01 1.080000000000E+02 +-4.481220166321E+00 -4.962750859321E+00 -6.892798267000E-01 1.080000000000E+02 +-4.472525276684E+00 -4.926671758261E+00 -7.694019289000E-01 1.080000000000E+02 +-4.465802811958E+00 -4.882649233552E+00 -8.457732406000E-01 1.080000000000E+02 +-4.458693860612E+00 -4.832760794815E+00 -9.182365063000E-01 1.080000000000E+02 +-4.446257319586E+00 -4.780323543559E+00 -9.881923803000E-01 1.080000000000E+02 +-4.427812955957E+00 -4.726079534800E+00 -1.055471471000E+00 1.080000000000E+02 +-4.399692564851E+00 -4.672943319517E+00 -1.120196685000E+00 1.080000000000E+02 +-4.359668783257E+00 -4.623327907429E+00 -1.181327921000E+00 1.080000000000E+02 +-4.309384145450E+00 -4.576680365064E+00 -1.237059622000E+00 1.080000000000E+02 +-4.248695439932E+00 -4.534210915938E+00 -1.285194785000E+00 1.080000000000E+02 +-4.178268317064E+00 -4.496730207382E+00 -1.323067807000E+00 1.080000000000E+02 +-4.100572122891E+00 -4.463126939115E+00 -1.348281183000E+00 1.080000000000E+02 +-4.017939881472E+00 -4.433645688368E+00 -1.358569067000E+00 1.080000000000E+02 +-3.933224920032E+00 -4.409160343659E+00 -1.353085167000E+00 1.080000000000E+02 +-3.848880937678E+00 -4.392221038251E+00 -1.333014261000E+00 1.080000000000E+02 +-3.767026816846E+00 -4.381441026057E+00 -1.301720477000E+00 1.080000000000E+02 +-3.688324660580E+00 -4.374717720102E+00 -1.262085734000E+00 1.080000000000E+02 +-3.613573552351E+00 -4.367166213703E+00 -1.215714425000E+00 1.080000000000E+02 +-3.544391846726E+00 -4.353158382751E+00 -1.162638692000E+00 1.080000000000E+02 +-3.482773453989E+00 -4.332241301110E+00 -1.102951579000E+00 1.080000000000E+02 +-3.432131676747E+00 -4.302029446497E+00 -1.037139043000E+00 1.080000000000E+02 +-3.395129428744E+00 -4.263446560236E+00 -9.667867241000E-01 1.080000000000E+02 +-3.373640683707E+00 -4.218808592585E+00 -8.936981911000E-01 1.080000000000E+02 +-3.369263860733E+00 -4.172009055296E+00 -8.188905247000E-01 1.080000000000E+02 +-3.381900061699E+00 -4.130109502305E+00 -7.421450537000E-01 1.080000000000E+02 +-3.411485373571E+00 -4.094882713256E+00 -6.667474988000E-01 1.080000000000E+02 +-3.455324561950E+00 -4.058970474329E+00 -5.989634359000E-01 1.080000000000E+02 +-3.506574208760E+00 -4.017656768124E+00 -5.400717519000E-01 1.080000000000E+02 +-3.557440149267E+00 -3.977025351783E+00 -4.803836822000E-01 1.080000000000E+02 +-3.606708995297E+00 -3.931643689641E+00 -4.228264178000E-01 1.080000000000E+02 +-3.652146258123E+00 -3.880434826052E+00 -3.670458051000E-01 1.080000000000E+02 +-3.692136053360E+00 -3.824771929066E+00 -3.112409570000E-01 1.080000000000E+02 +-3.726858037859E+00 -3.767543083315E+00 -2.536123470000E-01 1.080000000000E+02 +-3.759354897806E+00 -3.710355614202E+00 -1.946452353000E-01 1.080000000000E+02 +-3.792833029247E+00 -3.653026839544E+00 -1.364003779000E-01 1.080000000000E+02 +-3.827086656508E+00 -3.594597652287E+00 -7.966775233000E-02 1.080000000000E+02 +-3.860561303261E+00 -3.533915066317E+00 -2.494784873000E-02 1.080000000000E+02 +-3.889121014078E+00 -3.470197789881E+00 2.916971350000E-02 1.080000000000E+02 +-3.907071072457E+00 -3.404092202633E+00 8.494149535000E-02 1.080000000000E+02 +-3.910270670962E+00 -3.338836995198E+00 1.443669380000E-01 1.080000000000E+02 +-3.900762629647E+00 -3.278598959530E+00 2.083126740000E-01 1.080000000000E+02 +-3.880656059693E+00 -3.226985144637E+00 2.770763044000E-01 1.080000000000E+02 +-3.853610828620E+00 -3.184641277811E+00 3.497702850000E-01 1.080000000000E+02 +-3.816042740977E+00 -3.154563497564E+00 4.238156204000E-01 1.080000000000E+02 +-3.768167675217E+00 -3.137210988032E+00 4.959805589000E-01 1.080000000000E+02 +-3.713420527165E+00 -3.130306150224E+00 5.649597706000E-01 1.080000000000E+02 +-3.655845152071E+00 -3.130738731526E+00 6.319745517000E-01 1.080000000000E+02 +-3.601818035556E+00 -3.134634517289E+00 7.017224202000E-01 1.080000000000E+02 +-3.557227704037E+00 -3.140490232399E+00 7.777589224000E-01 1.080000000000E+02 +-3.524511021632E+00 -3.149798024733E+00 8.592609358000E-01 1.080000000000E+02 +-3.504257495748E+00 -3.164562533713E+00 9.439925506000E-01 1.080000000000E+02 +-3.496324681733E+00 -3.186313245052E+00 1.029225643000E+00 1.080000000000E+02 +-3.500348011694E+00 -3.215759670630E+00 1.112414355000E+00 1.080000000000E+02 +-3.516443196216E+00 -3.252288057673E+00 1.191204722000E+00 1.080000000000E+02 +-3.543718021354E+00 -3.294824463353E+00 1.263647540000E+00 1.080000000000E+02 +-3.579966680511E+00 -3.342646382344E+00 1.328492129000E+00 1.080000000000E+02 +-3.623583886322E+00 -3.394640235767E+00 1.385061074000E+00 1.080000000000E+02 +-3.675305018027E+00 -3.447866293004E+00 1.432913650000E+00 1.080000000000E+02 +-3.734680792464E+00 -3.500304603265E+00 1.472011314000E+00 1.080000000000E+02 +-3.797115297247E+00 -3.554610459818E+00 1.502926011000E+00 1.080000000000E+02 +-3.858400087253E+00 -3.613801307586E+00 1.525941209000E+00 1.080000000000E+02 +-3.917078839102E+00 -3.678196797943E+00 1.540955846000E+00 1.080000000000E+02 +-3.971963931010E+00 -3.746959894245E+00 1.547836060000E+00 1.080000000000E+02 +-4.022661490713E+00 -3.819317306175E+00 1.546702180000E+00 1.080000000000E+02 +-4.068502048881E+00 -3.894362515695E+00 1.537810757000E+00 1.080000000000E+02 +-4.108013033931E+00 -3.971642679586E+00 1.521653119000E+00 1.080000000000E+02 +-4.141027498239E+00 -4.050337454820E+00 1.498846663000E+00 1.080000000000E+02 +-4.170266451324E+00 -4.128551681660E+00 1.469852265000E+00 1.080000000000E+02 +-4.197923388055E+00 -4.204786903618E+00 1.435050927000E+00 1.080000000000E+02 +-4.225452551837E+00 -4.278349931086E+00 1.394624322000E+00 1.080000000000E+02 +-4.253858602732E+00 -4.348340487880E+00 1.348880339000E+00 1.080000000000E+02 +-4.283125500851E+00 -4.414511358784E+00 1.298134958000E+00 1.080000000000E+02 +-4.313127751398E+00 -4.476507710846E+00 1.242822431000E+00 1.080000000000E+02 +-4.344596518119E+00 -4.533619497506E+00 1.183240350000E+00 1.080000000000E+02 +-4.377843742779E+00 -4.585354307312E+00 1.119713595000E+00 1.080000000000E+02 +-4.410707950521E+00 -4.632697008276E+00 1.052910239000E+00 1.080000000000E+02 +-4.440722981539E+00 -4.677622454629E+00 9.829305340000E-01 1.080000000000E+02 +-4.467541611207E+00 -4.720106024498E+00 9.103747398000E-01 1.080000000000E+02 +-4.491688952164E+00 -4.759975561382E+00 8.352590367000E-01 1.080000000000E+02 +-4.512383737093E+00 -4.797583596308E+00 7.581530132000E-01 1.080000000000E+02 +-4.529109386677E+00 -4.833468966284E+00 6.790841041000E-01 1.080000000000E+02 +-4.542810891082E+00 -4.866811505948E+00 5.984352213000E-01 1.080000000000E+02 +-4.554751281569E+00 -4.896722734764E+00 5.162774167000E-01 1.080000000000E+02 +-4.564776528103E+00 -4.923356579557E+00 4.326343739000E-01 1.080000000000E+02 +-4.571815975135E+00 -4.947383811723E+00 3.478877549000E-01 1.080000000000E+02 +-4.574721694098E+00 -4.969538520312E+00 2.624374443000E-01 1.080000000000E+02 +-4.573005979928E+00 -4.990154597143E+00 1.765219348000E-01 1.080000000000E+02 +-4.568827558587E+00 -5.007659321588E+00 9.012406132000E-02 1.080000000000E+02 +-4.564435369340E+00 -5.020429867828E+00 2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +-3.897450276885E+00 -5.462216744545E+00 3.632685538000E-02 1.080000000000E+02 +-3.922335205635E+00 -5.455517156138E+00 -4.805479793000E-02 1.080000000000E+02 +-3.943926565601E+00 -5.445455309364E+00 -1.330022602000E-01 1.080000000000E+02 +-3.965849608727E+00 -5.430059692645E+00 -2.170477619000E-01 1.080000000000E+02 +-3.988091488476E+00 -5.409679360445E+00 -2.999547317000E-01 1.080000000000E+02 +-4.011719525251E+00 -5.384001507461E+00 -3.810313384000E-01 1.080000000000E+02 +-4.034098705908E+00 -5.354813945499E+00 -4.611599500000E-01 1.080000000000E+02 +-4.050955805378E+00 -5.324376366677E+00 -5.422183342000E-01 1.080000000000E+02 +-4.060408312443E+00 -5.293325732481E+00 -6.243033587000E-01 1.080000000000E+02 +-4.060493675794E+00 -5.262285036358E+00 -7.068846032000E-01 1.080000000000E+02 +-4.051820281249E+00 -5.230357841280E+00 -7.885880029000E-01 1.080000000000E+02 +-4.033645614749E+00 -5.197311787711E+00 -8.684143517000E-01 1.080000000000E+02 +-4.002687741884E+00 -5.165057259940E+00 -9.444199619000E-01 1.080000000000E+02 +-3.958003085953E+00 -5.134394445769E+00 -1.014026757000E+00 1.080000000000E+02 +-3.900426769746E+00 -5.105327148405E+00 -1.074292285000E+00 1.080000000000E+02 +-3.832030062448E+00 -5.077424098145E+00 -1.122466283000E+00 1.080000000000E+02 +-3.755280056026E+00 -5.050564153250E+00 -1.156570420000E+00 1.080000000000E+02 +-3.672707222782E+00 -5.025903397345E+00 -1.175727956000E+00 1.080000000000E+02 +-3.586613936214E+00 -5.007262391939E+00 -1.180212576000E+00 1.080000000000E+02 +-3.499113015868E+00 -4.999672612510E+00 -1.172009822000E+00 1.080000000000E+02 +-3.412459210235E+00 -4.999358944185E+00 -1.155518699000E+00 1.080000000000E+02 +-3.327282515873E+00 -4.991162927498E+00 -1.133893710000E+00 1.080000000000E+02 +-3.247210289640E+00 -4.966357922366E+00 -1.106430447000E+00 1.080000000000E+02 +-3.175942956527E+00 -4.928990544939E+00 -1.070335916000E+00 1.080000000000E+02 +-3.115832136415E+00 -4.885440394806E+00 -1.022604995000E+00 1.080000000000E+02 +-3.067858755558E+00 -4.843450104112E+00 -9.616664656000E-01 1.080000000000E+02 +-3.035633376645E+00 -4.800977303524E+00 -8.913395217000E-01 1.080000000000E+02 +-3.019148390042E+00 -4.750420293851E+00 -8.209661657000E-01 1.080000000000E+02 +-3.013809978173E+00 -4.688096178143E+00 -7.587395914000E-01 1.080000000000E+02 +-3.019921407926E+00 -4.615823948848E+00 -7.085053980000E-01 1.080000000000E+02 +-3.040302389413E+00 -4.539999638505E+00 -6.683070249000E-01 1.080000000000E+02 +-3.073194489340E+00 -4.467154942836E+00 -6.309463669000E-01 1.080000000000E+02 +-3.115383614732E+00 -4.400925830642E+00 -5.907387262000E-01 1.080000000000E+02 +-3.164397515540E+00 -4.341407512383E+00 -5.478583852000E-01 1.080000000000E+02 +-3.212196994499E+00 -4.285530818179E+00 -4.991121880000E-01 1.080000000000E+02 +-3.254057720133E+00 -4.228801425421E+00 -4.461358974000E-01 1.080000000000E+02 +-3.287763329237E+00 -4.167598732037E+00 -3.922509070000E-01 1.080000000000E+02 +-3.314127317712E+00 -4.101310601187E+00 -3.403860995000E-01 1.080000000000E+02 +-3.337733121057E+00 -4.031634072366E+00 -2.916382842000E-01 1.080000000000E+02 +-3.366289939763E+00 -3.961638029631E+00 -2.462074493000E-01 1.080000000000E+02 +-3.403734499524E+00 -3.894293042599E+00 -2.031942363000E-01 1.080000000000E+02 +-3.436330254068E+00 -3.827959781908E+00 -1.550619236000E-01 1.080000000000E+02 +-3.457917133911E+00 -3.762796927788E+00 -9.962429365000E-02 1.080000000000E+02 +-3.464014768028E+00 -3.699500301205E+00 -3.845435998000E-02 1.080000000000E+02 +-3.455748523232E+00 -3.638270851605E+00 2.448555749000E-02 1.080000000000E+02 +-3.432307229615E+00 -3.580017333063E+00 8.649636904000E-02 1.080000000000E+02 +-3.394812932584E+00 -3.526865323230E+00 1.460500498000E-01 1.080000000000E+02 +-3.347034873213E+00 -3.480115873658E+00 2.036424630000E-01 1.080000000000E+02 +-3.293419581863E+00 -3.439821990736E+00 2.609630366000E-01 1.080000000000E+02 +-3.235283473704E+00 -3.407018839522E+00 3.185973837000E-01 1.080000000000E+02 +-3.173267026195E+00 -3.382506686522E+00 3.764466502000E-01 1.080000000000E+02 +-3.109107668869E+00 -3.366043470514E+00 4.346658470000E-01 1.080000000000E+02 +-3.049788656690E+00 -3.354044036996E+00 4.988404496000E-01 1.080000000000E+02 +-2.997832566954E+00 -3.347348985654E+00 5.697936167000E-01 1.080000000000E+02 +-2.952679803756E+00 -3.347970370366E+00 6.456312705000E-01 1.080000000000E+02 +-2.915626201303E+00 -3.356466641867E+00 7.252260042000E-01 1.080000000000E+02 +-2.887734673422E+00 -3.372941005620E+00 8.072828216000E-01 1.080000000000E+02 +-2.868351837582E+00 -3.397467880932E+00 8.897856590000E-01 1.080000000000E+02 +-2.856699950129E+00 -3.429749769415E+00 9.710448039000E-01 1.080000000000E+02 +-2.853835815260E+00 -3.468822634366E+00 1.050138721000E+00 1.080000000000E+02 +-2.858593831919E+00 -3.514119454181E+00 1.125601149000E+00 1.080000000000E+02 +-2.872409194009E+00 -3.564375618606E+00 1.196814028000E+00 1.080000000000E+02 +-2.895248943071E+00 -3.618425189837E+00 1.262691804000E+00 1.080000000000E+02 +-2.920954619310E+00 -3.677947761956E+00 1.322504398000E+00 1.080000000000E+02 +-2.944759459083E+00 -3.744305141498E+00 1.375655668000E+00 1.080000000000E+02 +-2.968835983020E+00 -3.815604786744E+00 1.421583532000E+00 1.080000000000E+02 +-2.996188914990E+00 -3.890147669574E+00 1.460188986000E+00 1.080000000000E+02 +-3.028627223361E+00 -3.966075133022E+00 1.491069996000E+00 1.080000000000E+02 +-3.067901953763E+00 -4.041670816109E+00 1.513978101000E+00 1.080000000000E+02 +-3.112174279770E+00 -4.116512976079E+00 1.528680731000E+00 1.080000000000E+02 +-3.159034923897E+00 -4.191073144716E+00 1.535219663000E+00 1.080000000000E+02 +-3.207196508227E+00 -4.264883837707E+00 1.533750385000E+00 1.080000000000E+02 +-3.255871566876E+00 -4.337889691773E+00 1.524583142000E+00 1.080000000000E+02 +-3.303822573264E+00 -4.410197296921E+00 1.508093490000E+00 1.080000000000E+02 +-3.349680964572E+00 -4.481732217086E+00 1.484797470000E+00 1.080000000000E+02 +-3.392856034661E+00 -4.552727869667E+00 1.455093589000E+00 1.080000000000E+02 +-3.432630748027E+00 -4.623052963363E+00 1.419493916000E+00 1.080000000000E+02 +-3.468593285829E+00 -4.692397382262E+00 1.378577601000E+00 1.080000000000E+02 +-3.500404318737E+00 -4.760791700785E+00 1.332770951000E+00 1.080000000000E+02 +-3.528094350229E+00 -4.827880600677E+00 1.282612075000E+00 1.080000000000E+02 +-3.551864839137E+00 -4.893376782078E+00 1.228575236000E+00 1.080000000000E+02 +-3.572488407305E+00 -4.956950617456E+00 1.170998922000E+00 1.080000000000E+02 +-3.590845457396E+00 -5.018230231685E+00 1.110182121000E+00 1.080000000000E+02 +-3.608002906770E+00 -5.076773245043E+00 1.046417130000E+00 1.080000000000E+02 +-3.625139090898E+00 -5.132098038740E+00 9.799657947000E-01 1.080000000000E+02 +-3.643395048416E+00 -5.183888457095E+00 9.108702606000E-01 1.080000000000E+02 +-3.663533940147E+00 -5.231664712509E+00 8.394336353000E-01 1.080000000000E+02 +-3.684320755750E+00 -5.275728148631E+00 7.659096737000E-01 1.080000000000E+02 +-3.704301718041E+00 -5.316570095328E+00 6.903510399000E-01 1.080000000000E+02 +-3.724200370222E+00 -5.353731259434E+00 6.127886991000E-01 1.080000000000E+02 +-3.744925938441E+00 -5.386412678401E+00 5.335701480000E-01 1.080000000000E+02 +-3.766992122249E+00 -5.414085511694E+00 4.527156872000E-01 1.080000000000E+02 +-3.790709508922E+00 -5.436070986948E+00 3.706549346000E-01 1.080000000000E+02 +-3.816986504912E+00 -5.451384079013E+00 2.879184587000E-01 1.080000000000E+02 +-3.844144165063E+00 -5.460615813545E+00 2.044325232000E-01 1.080000000000E+02 +-3.871691090183E+00 -5.463784833911E+00 1.206362437000E-01 1.080000000000E+02 +-3.897450276885E+00 -5.462216744545E+00 3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +-3.394177173306E+00 -5.722159082349E+00 3.187537464000E-02 1.080000000000E+02 +-3.436690408012E+00 -5.718401428759E+00 -4.635841915000E-02 1.080000000000E+02 +-3.472958953023E+00 -5.711726492191E+00 -1.274648788000E-01 1.080000000000E+02 +-3.499556816443E+00 -5.703676333561E+00 -2.120822207000E-01 1.080000000000E+02 +-3.513231368707E+00 -5.695892786502E+00 -2.997983967000E-01 1.080000000000E+02 +-3.513128530549E+00 -5.689003777010E+00 -3.886351210000E-01 1.080000000000E+02 +-3.498711681869E+00 -5.683695864978E+00 -4.764366174000E-01 1.080000000000E+02 +-3.469426126475E+00 -5.680799582722E+00 -5.605003417000E-01 1.080000000000E+02 +-3.425098192802E+00 -5.680988441947E+00 -6.378051764000E-01 1.080000000000E+02 +-3.368092185977E+00 -5.683065461228E+00 -7.062104980000E-01 1.080000000000E+02 +-3.300757848666E+00 -5.685137941247E+00 -7.645271884000E-01 1.080000000000E+02 +-3.224591863322E+00 -5.685972760655E+00 -8.108473046000E-01 1.080000000000E+02 +-3.141580191105E+00 -5.684864654517E+00 -8.432354714000E-01 1.080000000000E+02 +-3.054301143249E+00 -5.681951844057E+00 -8.607369806000E-01 1.080000000000E+02 +-2.965321828993E+00 -5.677929545760E+00 -8.640060786000E-01 1.080000000000E+02 +-2.876862243103E+00 -5.670801335784E+00 -8.562220560000E-01 1.080000000000E+02 +-2.790936909975E+00 -5.651282466933E+00 -8.427262700000E-01 1.080000000000E+02 +-2.711257743195E+00 -5.615949738020E+00 -8.243174216000E-01 1.080000000000E+02 +-2.639901330691E+00 -5.567884351017E+00 -8.012208021000E-01 1.080000000000E+02 +-2.577907865817E+00 -5.508488642737E+00 -7.773689488000E-01 1.080000000000E+02 +-2.526092170574E+00 -5.438658272184E+00 -7.578816060000E-01 1.080000000000E+02 +-2.486717479553E+00 -5.359701917571E+00 -7.452820520000E-01 1.080000000000E+02 +-2.462975501605E+00 -5.274290149984E+00 -7.366388673000E-01 1.080000000000E+02 +-2.454663200099E+00 -5.186112087305E+00 -7.270540685000E-01 1.080000000000E+02 +-2.461774366558E+00 -5.098200522130E+00 -7.142960837000E-01 1.080000000000E+02 +-2.482659969634E+00 -5.013091439125E+00 -6.982493624000E-01 1.080000000000E+02 +-2.516457099171E+00 -4.932694804517E+00 -6.800217467000E-01 1.080000000000E+02 +-2.558794398038E+00 -4.856603378092E+00 -6.610368381000E-01 1.080000000000E+02 +-2.605466236006E+00 -4.783085140084E+00 -6.421364412000E-01 1.080000000000E+02 +-2.652768567656E+00 -4.710027527613E+00 -6.230907784000E-01 1.080000000000E+02 +-2.698683179948E+00 -4.636459348646E+00 -6.026804297000E-01 1.080000000000E+02 +-2.740354547051E+00 -4.561567302626E+00 -5.783904634000E-01 1.080000000000E+02 +-2.779416756277E+00 -4.487481964602E+00 -5.479092097000E-01 1.080000000000E+02 +-2.815615468550E+00 -4.415453370420E+00 -5.099632237000E-01 1.080000000000E+02 +-2.857951356077E+00 -4.349266520155E+00 -4.679474510000E-01 1.080000000000E+02 +-2.897356770253E+00 -4.283448184994E+00 -4.226801226000E-01 1.080000000000E+02 +-2.928708740626E+00 -4.214575783583E+00 -3.756353333000E-01 1.080000000000E+02 +-2.947114715103E+00 -4.141333190337E+00 -3.283193574000E-01 1.080000000000E+02 +-2.949805648091E+00 -4.065213183338E+00 -2.820781068000E-01 1.080000000000E+02 +-2.934932602030E+00 -3.989399292458E+00 -2.376983871000E-01 1.080000000000E+02 +-2.903787448629E+00 -3.917387568038E+00 -1.954128437000E-01 1.080000000000E+02 +-2.857293276239E+00 -3.852436854748E+00 -1.560456650000E-01 1.080000000000E+02 +-2.795822968750E+00 -3.797610262100E+00 -1.219181286000E-01 1.080000000000E+02 +-2.724316623128E+00 -3.752873091369E+00 -9.346268448000E-02 1.080000000000E+02 +-2.648748577608E+00 -3.714055724219E+00 -6.642283384000E-02 1.080000000000E+02 +-2.573356864486E+00 -3.677997380178E+00 -3.558837129000E-02 1.080000000000E+02 +-2.501183877938E+00 -3.643526798842E+00 3.754172340000E-03 1.080000000000E+02 +-2.434751370850E+00 -3.611744998067E+00 5.388091285000E-02 1.080000000000E+02 +-2.374355426588E+00 -3.584790685009E+00 1.135748529000E-01 1.080000000000E+02 +-2.319624635057E+00 -3.563993942511E+00 1.807565333000E-01 1.080000000000E+02 +-2.271341696766E+00 -3.549708511988E+00 2.542191153000E-01 1.080000000000E+02 +-2.230248524991E+00 -3.541991393086E+00 3.329023539000E-01 1.080000000000E+02 +-2.196723458870E+00 -3.540832898945E+00 4.155171011000E-01 1.080000000000E+02 +-2.170819282876E+00 -3.546155371042E+00 5.006187195000E-01 1.080000000000E+02 +-2.152634722655E+00 -3.557784884078E+00 5.870384289000E-01 1.080000000000E+02 +-2.142282380360E+00 -3.575480862002E+00 6.737108263000E-01 1.080000000000E+02 +-2.139475925018E+00 -3.599051276556E+00 7.596450919000E-01 1.080000000000E+02 +-2.142703995463E+00 -3.628524136046E+00 8.436327263000E-01 1.080000000000E+02 +-2.149574680386E+00 -3.664412137748E+00 9.249046690000E-01 1.080000000000E+02 +-2.159122130405E+00 -3.706897427374E+00 1.002637062000E+00 1.080000000000E+02 +-2.171924950014E+00 -3.755633608231E+00 1.076114245000E+00 1.080000000000E+02 +-2.187763578233E+00 -3.810372789721E+00 1.144593485000E+00 1.080000000000E+02 +-2.206218383794E+00 -3.870850638620E+00 1.207380380000E+00 1.080000000000E+02 +-2.228268513145E+00 -3.936053335486E+00 1.263842748000E+00 1.080000000000E+02 +-2.255865587312E+00 -4.004614623552E+00 1.313751841000E+00 1.080000000000E+02 +-2.288332686745E+00 -4.075653753299E+00 1.356669215000E+00 1.080000000000E+02 +-2.322797709835E+00 -4.149610562252E+00 1.392276244000E+00 1.080000000000E+02 +-2.356263153935E+00 -4.227450366534E+00 1.420151472000E+00 1.080000000000E+02 +-2.386206551659E+00 -4.309015145822E+00 1.439465232000E+00 1.080000000000E+02 +-2.412457529517E+00 -4.393604896246E+00 1.449884186000E+00 1.080000000000E+02 +-2.435834846381E+00 -4.479580143459E+00 1.451432017000E+00 1.080000000000E+02 +-2.455170412312E+00 -4.566144041357E+00 1.443978096000E+00 1.080000000000E+02 +-2.469258347294E+00 -4.652584296511E+00 1.427519630000E+00 1.080000000000E+02 +-2.478896843300E+00 -4.737680158879E+00 1.402784195000E+00 1.080000000000E+02 +-2.486625964197E+00 -4.820523810796E+00 1.371062779000E+00 1.080000000000E+02 +-2.495116061853E+00 -4.900899042274E+00 1.333595471000E+00 1.080000000000E+02 +-2.508095395382E+00 -4.978581114801E+00 1.291888617000E+00 1.080000000000E+02 +-2.528149252728E+00 -5.053108006101E+00 1.247327499000E+00 1.080000000000E+02 +-2.556854555261E+00 -5.123670733322E+00 1.201173169000E+00 1.080000000000E+02 +-2.594482933436E+00 -5.189438941072E+00 1.154170635000E+00 1.080000000000E+02 +-2.639387782888E+00 -5.249701787963E+00 1.106391465000E+00 1.080000000000E+02 +-2.688999624076E+00 -5.304786411523E+00 1.056863518000E+00 1.080000000000E+02 +-2.740406519914E+00 -5.355371176151E+00 1.004521395000E+00 1.080000000000E+02 +-2.789960579273E+00 -5.403061305716E+00 9.479798854000E-01 1.080000000000E+02 +-2.837732759628E+00 -5.447964355140E+00 8.876176364000E-01 1.080000000000E+02 +-2.882850489861E+00 -5.490555535161E+00 8.236903164000E-01 1.080000000000E+02 +-2.927575674360E+00 -5.529900943324E+00 7.574711850000E-01 1.080000000000E+02 +-2.973047810454E+00 -5.565629482016E+00 6.895838911000E-01 1.080000000000E+02 +-3.019664105983E+00 -5.597429694134E+00 6.207042323000E-01 1.080000000000E+02 +-3.066971401084E+00 -5.625765126573E+00 5.506192747000E-01 1.080000000000E+02 +-3.114271788774E+00 -5.650870587217E+00 4.794354850000E-01 1.080000000000E+02 +-3.161448326355E+00 -5.672729845017E+00 4.071715453000E-01 1.080000000000E+02 +-3.208417598457E+00 -5.691236474119E+00 3.337124203000E-01 1.080000000000E+02 +-3.255257546988E+00 -5.705907792580E+00 2.593013285000E-01 1.080000000000E+02 +-3.301947306370E+00 -5.716264971793E+00 1.840910744000E-01 1.080000000000E+02 +-3.348557264860E+00 -5.721672558088E+00 1.084250821000E-01 1.080000000000E+02 +-3.394177173306E+00 -5.722159082349E+00 3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +-2.719265288001E+00 -6.043552263244E+00 -3.206635964000E-02 1.080000000000E+02 +-2.670992311606E+00 -6.082129395255E+00 -9.558959151000E-02 1.080000000000E+02 +-2.610847105968E+00 -6.117283029020E+00 -1.502609002000E-01 1.080000000000E+02 +-2.541591627001E+00 -6.145991492481E+00 -1.975103298000E-01 1.080000000000E+02 +-2.465520328539E+00 -6.164639252351E+00 -2.389271858000E-01 1.080000000000E+02 +-2.384871019997E+00 -6.172120347152E+00 -2.748207179000E-01 1.080000000000E+02 +-2.302747364165E+00 -6.171085382785E+00 -3.080563152000E-01 1.080000000000E+02 +-2.222536549017E+00 -6.159002583182E+00 -3.436690988000E-01 1.080000000000E+02 +-2.144115977679E+00 -6.133890381028E+00 -3.763048784000E-01 1.080000000000E+02 +-2.066814243055E+00 -6.101651234298E+00 -4.052293645000E-01 1.080000000000E+02 +-1.996188065085E+00 -6.060344100988E+00 -4.392283960000E-01 1.080000000000E+02 +-1.937152434714E+00 -6.008408664299E+00 -4.800337212000E-01 1.080000000000E+02 +-1.891040078233E+00 -5.947425249326E+00 -5.247345144000E-01 1.080000000000E+02 +-1.858844785952E+00 -5.878642833897E+00 -5.704365727000E-01 1.080000000000E+02 +-1.840824293585E+00 -5.803885513504E+00 -6.144560156000E-01 1.080000000000E+02 +-1.837390698520E+00 -5.725082263405E+00 -6.547457037000E-01 1.080000000000E+02 +-1.848612126650E+00 -5.644518372302E+00 -6.898657429000E-01 1.080000000000E+02 +-1.873237520112E+00 -5.564670584999E+00 -7.191623664000E-01 1.080000000000E+02 +-1.909309797926E+00 -5.487157936291E+00 -7.426294678000E-01 1.080000000000E+02 +-1.949616927062E+00 -5.410788499850E+00 -7.624802322000E-01 1.080000000000E+02 +-1.992844714647E+00 -5.335055121695E+00 -7.779139702000E-01 1.080000000000E+02 +-2.037394557409E+00 -5.259075280901E+00 -7.877001548000E-01 1.080000000000E+02 +-2.079736653343E+00 -5.181344499105E+00 -7.913832776000E-01 1.080000000000E+02 +-2.115924359405E+00 -5.100496566964E+00 -7.895526386000E-01 1.080000000000E+02 +-2.149562519882E+00 -5.019001819862E+00 -7.811847600000E-01 1.080000000000E+02 +-2.185105292322E+00 -4.939253789866E+00 -7.661370968000E-01 1.080000000000E+02 +-2.220404930694E+00 -4.860216809682E+00 -7.471733717000E-01 1.080000000000E+02 +-2.252374274279E+00 -4.780145053754E+00 -7.269319722000E-01 1.080000000000E+02 +-2.278844845257E+00 -4.697935788408E+00 -7.069563165000E-01 1.080000000000E+02 +-2.296337951699E+00 -4.613078830528E+00 -6.885508517000E-01 1.080000000000E+02 +-2.301376256654E+00 -4.526121777536E+00 -6.723087025000E-01 1.080000000000E+02 +-2.293581967480E+00 -4.439170314566E+00 -6.572772207000E-01 1.080000000000E+02 +-2.272804820843E+00 -4.354313783918E+00 -6.427120602000E-01 1.080000000000E+02 +-2.238696154621E+00 -4.273638305610E+00 -6.291917806000E-01 1.080000000000E+02 +-2.190581941839E+00 -4.199876031005E+00 -6.193379278000E-01 1.080000000000E+02 +-2.130253523200E+00 -4.135150320502E+00 -6.153164653000E-01 1.080000000000E+02 +-2.065871621845E+00 -4.074480615820E+00 -6.108406342000E-01 1.080000000000E+02 +-2.003862728339E+00 -4.012628981724E+00 -5.976498684000E-01 1.080000000000E+02 +-1.946025524014E+00 -3.950194550696E+00 -5.730609127000E-01 1.080000000000E+02 +-1.891241111057E+00 -3.889782997748E+00 -5.383970067000E-01 1.080000000000E+02 +-1.838961071321E+00 -3.833083656863E+00 -4.947621310000E-01 1.080000000000E+02 +-1.790193792244E+00 -3.781020083750E+00 -4.421942386000E-01 1.080000000000E+02 +-1.746006145561E+00 -3.734420323404E+00 -3.812203306000E-01 1.080000000000E+02 +-1.708025241344E+00 -3.693755759376E+00 -3.122472237000E-01 1.080000000000E+02 +-1.672533025561E+00 -3.659648028388E+00 -2.386307155000E-01 1.080000000000E+02 +-1.634806679235E+00 -3.632494979508E+00 -1.632283249000E-01 1.080000000000E+02 +-1.599606712471E+00 -3.612100159053E+00 -8.452815995000E-02 1.080000000000E+02 +-1.566866110623E+00 -3.598460700310E+00 -3.268188411000E-03 1.080000000000E+02 +-1.535074733948E+00 -3.591718054114E+00 7.911508161000E-02 1.080000000000E+02 +-1.505799580130E+00 -3.591712075657E+00 1.627636593000E-01 1.080000000000E+02 +-1.477832323701E+00 -3.598588753357E+00 2.465256910000E-01 1.080000000000E+02 +-1.454392222363E+00 -3.611967008940E+00 3.309221835000E-01 1.080000000000E+02 +-1.435432683200E+00 -3.631754802769E+00 4.151413601000E-01 1.080000000000E+02 +-1.420650375043E+00 -3.657942675729E+00 4.985211599000E-01 1.080000000000E+02 +-1.410914365811E+00 -3.690196887369E+00 5.804104256000E-01 1.080000000000E+02 +-1.407613841517E+00 -3.727975355198E+00 6.604511422000E-01 1.080000000000E+02 +-1.413266958338E+00 -3.770018505013E+00 7.382277411000E-01 1.080000000000E+02 +-1.428459093491E+00 -3.815210801649E+00 8.130003965000E-01 1.080000000000E+02 +-1.448418060237E+00 -3.864526087461E+00 8.837344519000E-01 1.080000000000E+02 +-1.466802144553E+00 -3.920770626147E+00 9.496690099000E-01 1.080000000000E+02 +-1.481147804974E+00 -3.984882559506E+00 1.009152163000E+00 1.080000000000E+02 +-1.492666172922E+00 -4.055933698370E+00 1.060859533000E+00 1.080000000000E+02 +-1.502575609595E+00 -4.132780186352E+00 1.103835896000E+00 1.080000000000E+02 +-1.511755173927E+00 -4.214176562440E+00 1.137456428000E+00 1.080000000000E+02 +-1.520756824164E+00 -4.299005742461E+00 1.161466271000E+00 1.080000000000E+02 +-1.529015398173E+00 -4.386059966905E+00 1.175425951000E+00 1.080000000000E+02 +-1.535914292618E+00 -4.474293387103E+00 1.179281333000E+00 1.080000000000E+02 +-1.540450192920E+00 -4.562620299641E+00 1.173138038000E+00 1.080000000000E+02 +-1.542349222497E+00 -4.649843469327E+00 1.157882812000E+00 1.080000000000E+02 +-1.543708758332E+00 -4.735653875778E+00 1.135668523000E+00 1.080000000000E+02 +-1.547035875703E+00 -4.819955426917E+00 1.108680995000E+00 1.080000000000E+02 +-1.556435850864E+00 -4.902969497374E+00 1.079331268000E+00 1.080000000000E+02 +-1.576390534120E+00 -4.984064796963E+00 1.049719473000E+00 1.080000000000E+02 +-1.605849673135E+00 -5.061936418816E+00 1.019495947000E+00 1.080000000000E+02 +-1.644340572682E+00 -5.135536150979E+00 9.885700701000E-01 1.080000000000E+02 +-1.690751305631E+00 -5.204043404548E+00 9.570750472000E-01 1.080000000000E+02 +-1.744961890952E+00 -5.266877517952E+00 9.259972860000E-01 1.080000000000E+02 +-1.807117489938E+00 -5.323083884131E+00 8.971800023000E-01 1.080000000000E+02 +-1.876228703978E+00 -5.372501155534E+00 8.719921484000E-01 1.080000000000E+02 +-1.950834536680E+00 -5.415449408091E+00 8.511651264000E-01 1.080000000000E+02 +-2.028968949945E+00 -5.453496439275E+00 8.338806698000E-01 1.080000000000E+02 +-2.107160917507E+00 -5.491128891489E+00 8.161032666000E-01 1.080000000000E+02 +-2.183341474178E+00 -5.530933675500E+00 7.945068161000E-01 1.080000000000E+02 +-2.257519163910E+00 -5.571737280744E+00 7.685448264000E-01 1.080000000000E+02 +-2.330560326231E+00 -5.611704604357E+00 7.382924668000E-01 1.080000000000E+02 +-2.402136291633E+00 -5.650083727537E+00 7.029154360000E-01 1.080000000000E+02 +-2.471438045721E+00 -5.686632708852E+00 6.614534371000E-01 1.080000000000E+02 +-2.536643951479E+00 -5.721825631824E+00 6.129080743000E-01 1.080000000000E+02 +-2.595751311988E+00 -5.756470881558E+00 5.567854442000E-01 1.080000000000E+02 +-2.648635207412E+00 -5.790247865236E+00 4.941808118000E-01 1.080000000000E+02 +-2.694828002557E+00 -5.823193580758E+00 4.262021665000E-01 1.080000000000E+02 +-2.732123642017E+00 -5.856602525239E+00 3.530417735000E-01 1.080000000000E+02 +-2.759762308131E+00 -5.890519429983E+00 2.760107546000E-01 1.080000000000E+02 +-2.774424150724E+00 -5.926077983200E+00 1.962732381000E-01 1.080000000000E+02 +-2.772271107284E+00 -5.964168109900E+00 1.162295333000E-01 1.080000000000E+02 +-2.753578320260E+00 -6.003702346740E+00 3.922229480000E-02 1.080000000000E+02 +-2.719265288001E+00 -6.043552263244E+00 -3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +-6.588058947735E+00 -7.186146159526E-01 3.206635964000E-02 1.080000000000E+02 +-6.560762735066E+00 -7.635625503010E-01 -3.922229480000E-02 1.080000000000E+02 +-6.528939830366E+00 -7.935571982513E-01 -1.162295333000E-01 1.080000000000E+02 +-6.493379294173E+00 -8.073753607130E-01 -1.962732381000E-01 1.080000000000E+02 +-6.455030341897E+00 -8.044193170134E-01 -2.760107546000E-01 1.080000000000E+02 +-6.414232631096E+00 -7.886142834667E-01 -3.530417735000E-01 1.080000000000E+02 +-6.370933850335E+00 -7.634679541377E-01 -4.262021665000E-01 1.080000000000E+02 +-6.325326254187E+00 -7.297167812967E-01 -4.941808118000E-01 1.080000000000E+02 +-6.276860411344E+00 -6.898588699215E-01 -5.567854442000E-01 1.080000000000E+02 +-6.225645641936E+00 -6.443504004905E-01 -6.129080743000E-01 1.080000000000E+02 +-6.172025450203E+00 -5.932111101991E-01 -6.614534371000E-01 1.080000000000E+02 +-6.115849883607E+00 -5.385954817368E-01 -7.029154360000E-01 1.080000000000E+02 +-6.057230978719E+00 -4.823824947230E-01 -7.382924668000E-01 1.080000000000E+02 +-5.996648834711E+00 -4.252668035559E-01 -7.685448264000E-01 1.080000000000E+02 +-5.934920133325E+00 -3.673286358239E-01 -7.945068161000E-01 1.080000000000E+02 +-5.873522447459E+00 -3.071769757042E-01 -8.161032666000E-01 1.080000000000E+02 +-5.813569211757E+00 -2.444410627063E-01 -8.338806698000E-01 1.080000000000E+02 +-5.753239473280E+00 -1.818879990456E-01 -8.511651264000E-01 1.080000000000E+02 +-5.689338787638E+00 -1.242053756195E-01 -8.719921484000E-01 1.080000000000E+02 +-5.620983630012E+00 -7.374748183663E-02 -8.971800023000E-01 1.080000000000E+02 +-5.548321062817E+00 -3.200271673866E-02 -9.259972860000E-01 1.080000000000E+02 +-5.471810277680E+00 1.378048154519E-04 -9.570750472000E-01 1.080000000000E+02 +-5.392314302556E+00 2.310712922164E-02 -9.885700701000E-01 1.080000000000E+02 +-5.310422455597E+00 3.697058203392E-02 -1.019495947000E+00 1.080000000000E+02 +-5.227258767604E+00 4.092423362672E-02 -1.049719473000E+00 1.080000000000E+02 +-5.143966218245E+00 3.484243943044E-02 -1.079331268000E+00 1.080000000000E+02 +-5.062110393521E+00 1.812958851758E-02 -1.108680995000E+00 1.080000000000E+02 +-4.980906718167E+00 -4.756746780307E-03 -1.135668523000E+00 1.080000000000E+02 +-4.898876052268E+00 -2.998062525349E-02 -1.157882812000E+00 1.080000000000E+02 +-4.815335055955E+00 -5.512798253586E-02 -1.173138038000E+00 1.080000000000E+02 +-4.729929499943E+00 -7.810860203055E-02 -1.179281333000E+00 1.080000000000E+02 +-4.643882655083E+00 -9.881298982639E-02 -1.175425951000E+00 1.080000000000E+02 +-4.558537127937E+00 -1.178598539856E-01 -1.161466271000E+00 1.080000000000E+02 +-4.475078120605E+00 -1.355124341152E-01 -1.137456428000E+00 1.080000000000E+02 +-4.394828925344E+00 -1.519350131331E-01 -1.103835896000E+00 1.080000000000E+02 +-4.318681387857E+00 -1.662574495562E-01 -1.060859533000E+00 1.080000000000E+02 +-4.247548367807E+00 -1.772588400406E-01 -1.009152163000E+00 1.080000000000E+02 +-4.182141242949E+00 -1.834269831673E-01 -9.496690099000E-01 1.080000000000E+02 +-4.122968513445E+00 -1.833231982769E-01 -8.837344519000E-01 1.080000000000E+02 +-4.069899229606E+00 -1.795803542932E-01 -8.130003965000E-01 1.080000000000E+02 +-4.022224173461E+00 -1.790969628349E-01 -7.382277411000E-01 1.080000000000E+02 +-3.980491852695E+00 -1.867125770347E-01 -6.604511422000E-01 1.080000000000E+02 +-3.945582312788E+00 -2.015257507523E-01 -5.804104256000E-01 1.080000000000E+02 +-3.917915326940E+00 -2.207523453124E-01 -4.985211599000E-01 1.080000000000E+02 +-3.897577164150E+00 -2.429036536014E-01 -4.151413601000E-01 1.080000000000E+02 +-3.884616673692E+00 -2.670500114432E-01 -3.309221835000E-01 1.080000000000E+02 +-3.879136586207E+00 -2.934769808937E-01 -2.465256910000E-01 1.080000000000E+02 +-3.881238834593E+00 -3.222004326372E-01 -1.627636593000E-01 1.080000000000E+02 +-3.890291040485E+00 -3.500409109966E-01 -7.911508161000E-02 1.080000000000E+02 +-3.906527753754E+00 -3.781927146837E-01 3.268188411000E-03 1.080000000000E+02 +-3.929617052248E+00 -4.051160528731E-01 8.452815995000E-02 1.080000000000E+02 +-3.959891067072E+00 -4.322908645197E-01 1.632283249000E-01 1.080000000000E+02 +-3.997373233297E+00 -4.597799984759E-01 2.386307155000E-01 1.080000000000E+02 +-4.040779310954E+00 -4.829952330593E-01 3.122472237000E-01 1.080000000000E+02 +-4.091190354420E+00 -5.065511781563E-01 3.812203306000E-01 1.080000000000E+02 +-4.149164093921E+00 -5.341760095933E-01 4.421942386000E-01 1.080000000000E+02 +-4.213749412396E+00 -5.644679192619E-01 4.947621310000E-01 1.080000000000E+02 +-4.283829110759E+00 -5.966681318215E-01 5.383970067000E-01 1.080000000000E+02 +-4.358213226481E+00 -6.301030082380E-01 5.730609127000E-01 1.080000000000E+02 +-4.435464577995E+00 -6.658161580739E-01 5.976498684000E-01 1.080000000000E+02 +-4.513450779541E+00 -7.056769142449E-01 6.108406342000E-01 1.080000000000E+02 +-4.591046199170E+00 -7.481597712703E-01 6.153164653000E-01 1.080000000000E+02 +-4.671246514518E+00 -7.855341624158E-01 6.193379278000E-01 1.080000000000E+02 +-4.756266715859E+00 -8.084997016121E-01 6.291917806000E-01 1.080000000000E+02 +-4.843533812727E+00 -8.160088770579E-01 6.427120602000E-01 1.080000000000E+02 +-4.930657660556E+00 -8.095470077034E-01 6.572772207000E-01 1.080000000000E+02 +-5.015761983829E+00 -7.900903374687E-01 6.723087025000E-01 1.080000000000E+02 +-5.096906133860E+00 -7.584274175552E-01 6.885508517000E-01 1.080000000000E+02 +-5.172204229430E+00 -7.155682426067E-01 7.069563165000E-01 1.080000000000E+02 +-5.242210030654E+00 -6.649891735014E-01 7.269319722000E-01 1.080000000000E+02 +-5.308483725433E+00 -6.098409876117E-01 7.471733717000E-01 1.080000000000E+02 +-5.372744172314E+00 -5.518452664538E-01 7.661370968000E-01 1.080000000000E+02 +-5.437605735192E+00 -4.933985845814E-01 7.811847600000E-01 1.080000000000E+02 +-5.504717082220E+00 -4.362235310568E-01 7.895526386000E-01 1.080000000000E+02 +-5.570425418752E+00 -3.768235924053E-01 7.913832776000E-01 1.080000000000E+02 +-5.631267358074E+00 -3.125337335924E-01 7.877001548000E-01 1.080000000000E+02 +-5.689761822259E+00 -2.466852532987E-01 7.779139702000E-01 1.080000000000E+02 +-5.748430424060E+00 -1.821702833399E-01 7.624802322000E-01 1.080000000000E+02 +-5.808606486336E+00 -1.202364718106E-01 7.426294678000E-01 1.080000000000E+02 +-5.871178449115E+00 -6.197697120814E-02 7.191623664000E-01 1.080000000000E+02 +-5.939508542468E+00 -1.388250704953E-02 6.898657429000E-01 1.080000000000E+02 +-6.012661744087E+00 2.168531677922E-02 6.547457037000E-01 1.080000000000E+02 +-6.088669127825E+00 4.277131731066E-02 6.144560156000E-01 1.080000000000E+02 +-6.165336202914E+00 4.873409307384E-02 5.704365727000E-01 1.080000000000E+02 +-6.240701059768E+00 3.936948583777E-02 5.247345144000E-01 1.080000000000E+02 +-6.312949235767E+00 1.435894032594E-02 4.800337212000E-01 1.080000000000E+02 +-6.380585784315E+00 -2.573834808411E-02 4.392283960000E-01 1.080000000000E+02 +-6.441695891859E+00 -8.014322868217E-02 4.052293645000E-01 1.080000000000E+02 +-6.496244692130E+00 -1.436991028937E-01 3.763048784000E-01 1.080000000000E+02 +-6.544361104880E+00 -2.105214010446E-01 3.436690988000E-01 1.080000000000E+02 +-6.580639035190E+00 -2.830726290513E-01 3.080563152000E-01 1.080000000000E+02 +-6.607000950088E+00 -3.608570454937E-01 2.748207179000E-01 1.080000000000E+02 +-6.624808013052E+00 -4.398708813480E-01 2.389271858000E-01 1.080000000000E+02 +-6.630580263523E+00 -5.179814601597E-01 1.975103298000E-01 1.080000000000E+02 +-6.624678012230E+00 -5.927187378129E-01 1.502609002000E-01 1.080000000000E+02 +-6.609830810439E+00 -6.607832978063E-01 9.558959151000E-02 1.080000000000E+02 +-6.588058947735E+00 -7.186146159526E-01 3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +-6.490955111016E+00 -1.459809917170E+00 -3.187537464000E-02 1.080000000000E+02 +-6.476395071956E+00 -1.416573150235E+00 -1.084250821000E-01 1.080000000000E+02 +-6.456848882493E+00 -1.373915481552E+00 -1.840910744000E-01 1.080000000000E+02 +-6.432570690599E+00 -1.332711426039E+00 -2.593013285000E-01 1.080000000000E+02 +-6.404143097463E+00 -1.292697674500E+00 -3.337124203000E-01 1.080000000000E+02 +-6.372027943967E+00 -1.253746105103E+00 -4.071715453000E-01 1.080000000000E+02 +-6.336660202547E+00 -1.215633433764E+00 -4.794354850000E-01 1.080000000000E+02 +-6.298166866971E+00 -1.178406105819E+00 -5.506192747000E-01 1.080000000000E+02 +-6.256599511163E+00 -1.142170324711E+00 -6.207042323000E-01 1.080000000000E+02 +-6.211950484676E+00 -1.107662399052E+00 -6.895838911000E-01 1.080000000000E+02 +-6.163918962311E+00 -1.075456553350E+00 -7.574711850000E-01 1.080000000000E+02 +-6.112678413404E+00 -1.045078774963E+00 -8.236903164000E-01 1.080000000000E+02 +-6.058229648719E+00 -1.015330662062E+00 -8.876176364000E-01 1.080000000000E+02 +-6.000761895375E+00 -9.837724240082E-01 -9.479798854000E-01 1.080000000000E+02 +-5.940092840407E+00 -9.513807734457E-01 -1.004521395000E+00 1.080000000000E+02 +-5.876098265940E+00 -9.181214621024E-01 -1.056863518000E+00 1.080000000000E+02 +-5.808378773706E+00 -8.879598820644E-01 -1.106391465000E+00 1.080000000000E+02 +-5.737189038870E+00 -8.638750761987E-01 -1.154170635000E+00 1.080000000000E+02 +-5.663011947997E+00 -8.484118558215E-01 -1.201173169000E+00 1.080000000000E+02 +-5.587032380154E+00 -8.429165726761E-01 -1.247327499000E+00 1.080000000000E+02 +-5.509956111823E+00 -8.468742969206E-01 -1.291888617000E+00 1.080000000000E+02 +-5.432065235910E+00 -8.585352977597E-01 -1.333595471000E+00 1.080000000000E+02 +-5.353000263804E+00 -8.752980475137E-01 -1.371062779000E+00 1.080000000000E+02 +-5.271822839106E+00 -8.935473130374E-01 -1.402784195000E+00 1.080000000000E+02 +-5.187913405626E+00 -9.106766262263E-01 -1.427519630000E+00 1.080000000000E+02 +-5.101350426366E+00 -9.239897117012E-01 -1.443978096000E+00 1.080000000000E+02 +-5.013048248725E+00 -9.323502112759E-01 -1.451432017000E+00 1.080000000000E+02 +-4.924056941429E+00 -9.366848742232E-01 -1.449884186000E+00 1.080000000000E+02 +-4.835495309800E+00 -9.378583811036E-01 -1.439465232000E+00 1.080000000000E+02 +-4.748669576192E+00 -9.345854205200E-01 -1.420151472000E+00 1.080000000000E+02 +-4.664298132151E+00 -9.268117142000E-01 -1.392276244000E+00 1.080000000000E+02 +-4.583310749226E+00 -9.168874402221E-01 -1.356669215000E+00 1.080000000000E+02 +-4.505715636485E+00 -9.079616920992E-01 -1.313751841000E+00 1.080000000000E+02 +-4.431982011791E+00 -9.029019180504E-01 -1.263842748000E+00 1.080000000000E+02 +-4.363156697360E+00 -9.020797402571E-01 -1.207380380000E+00 1.080000000000E+02 +-4.299935996527E+00 -9.032168602644E-01 -1.144593485000E+00 1.080000000000E+02 +-4.242981535986E+00 -9.050687670257E-01 -1.076114245000E+00 1.080000000000E+02 +-4.192674384768E+00 -9.079528701354E-01 -1.002637062000E+00 1.080000000000E+02 +-4.149318148914E+00 -9.120013820859E-01 -9.249046690000E-01 1.080000000000E+02 +-4.113063472634E+00 -9.165569748386E-01 -8.436327263000E-01 1.080000000000E+02 +-4.084035588936E+00 -9.225945118628E-01 -7.596450919000E-01 1.080000000000E+02 +-4.062486034977E+00 -9.325472681650E-01 -6.737108263000E-01 1.080000000000E+02 +-4.048855209561E+00 -9.478612886741E-01 -5.870384289000E-01 1.080000000000E+02 +-4.043414223550E+00 -9.687495503328E-01 -5.006187195000E-01 1.080000000000E+02 +-4.046357082387E+00 -9.950306200407E-01 -4.155171011000E-01 1.080000000000E+02 +-4.057818690958E+00 -1.026556858257E+00 -3.329023539000E-01 1.080000000000E+02 +-4.077856595608E+00 -1.063254066160E+00 -2.542191153000E-01 1.080000000000E+02 +-4.106363095865E+00 -1.104759428445E+00 -1.807565333000E-01 1.080000000000E+02 +-4.143054718034E+00 -1.150384957513E+00 -1.135748529000E-01 1.080000000000E+02 +-4.187353166278E+00 -1.199495573054E+00 -5.388091285000E-02 1.080000000000E+02 +-4.238108228674E+00 -1.252855525263E+00 -3.754172340000E-03 1.080000000000E+02 +-4.293194379053E+00 -1.310844118981E+00 3.558837129000E-02 1.080000000000E+02 +-4.350785222709E+00 -1.371403257923E+00 6.642283384000E-02 1.080000000000E+02 +-4.411054542979E+00 -1.431277513911E+00 9.346268448000E-02 1.080000000000E+02 +-4.475698796728E+00 -1.485459543836E+00 1.219181286000E-01 1.080000000000E+02 +-4.546837354595E+00 -1.526978931460E+00 1.560456650000E-01 1.080000000000E+02 +-4.622976643115E+00 -1.551126642878E+00 1.954128437000E-01 1.080000000000E+02 +-4.701088244567E+00 -1.558494597331E+00 2.376983871000E-01 1.080000000000E+02 +-4.777787563506E+00 -1.549211924013E+00 2.820781068000E-01 1.080000000000E+02 +-4.849350448159E+00 -1.523130318885E+00 3.283193574000E-01 1.080000000000E+02 +-4.913320534824E+00 -1.482991990894E+00 3.756353333000E-01 1.080000000000E+02 +-4.969133789326E+00 -1.431891752693E+00 4.226801226000E-01 1.080000000000E+02 +-5.019553803223E+00 -1.374075992658E+00 4.679474510000E-01 1.080000000000E+02 +-5.069418729743E+00 -1.313359309416E+00 5.099632237000E-01 1.080000000000E+02 +-5.126735976332E+00 -1.256674228544E+00 5.479092097000E-01 1.080000000000E+02 +-5.185124433333E+00 -1.196630231436E+00 5.783904634000E-01 1.080000000000E+02 +-5.243473841106E+00 -1.133855491246E+00 6.026804297000E-01 1.080000000000E+02 +-5.299252941616E+00 -1.067454282486E+00 6.230907784000E-01 1.080000000000E+02 +-5.354117635668E+00 -9.998910479124E-01 6.421364412000E-01 1.080000000000E+02 +-5.409615243900E+00 -9.327851073440E-01 6.610368381000E-01 1.080000000000E+02 +-5.468899545991E+00 -8.690063994831E-01 6.800217467000E-01 1.080000000000E+02 +-5.534917401835E+00 -8.120194928205E-01 6.982493624000E-01 1.080000000000E+02 +-5.609406943534E+00 -7.658559508940E-01 7.142960837000E-01 1.080000000000E+02 +-5.690818339166E+00 -7.319266620531E-01 7.270540685000E-01 1.080000000000E+02 +-5.777249302699E+00 -7.125836106678E-01 7.366388673000E-01 1.080000000000E+02 +-5.865817395497E+00 -7.087698858006E-01 7.452820520000E-01 1.080000000000E+02 +-5.953076799728E+00 -7.218185868837E-01 7.578816060000E-01 1.080000000000E+02 +-6.035501359083E+00 -7.495194702662E-01 7.773689488000E-01 1.080000000000E+02 +-6.111147068669E+00 -7.901244757511E-01 8.012208021000E-01 1.080000000000E+02 +-6.178910312308E+00 -8.431354354179E-01 8.243174216000E-01 1.080000000000E+02 +-6.237135951012E+00 -9.079964125047E-01 8.427262700000E-01 1.080000000000E+02 +-6.282251886607E+00 -9.836845983054E-01 8.562220560000E-01 1.080000000000E+02 +-6.316366732510E+00 -1.065611925873E+00 8.640060786000E-01 1.080000000000E+02 +-6.347688285768E+00 -1.148993323981E+00 8.607369806000E-01 1.080000000000E+02 +-6.377429242178E+00 -1.231100523247E+00 8.432354714000E-01 1.080000000000E+02 +-6.404135131187E+00 -1.309706891409E+00 8.108473046000E-01 1.080000000000E+02 +-6.426877754613E+00 -1.382403021475E+00 7.645271884000E-01 1.080000000000E+02 +-6.445714163522E+00 -1.447082213292E+00 7.062104980000E-01 1.080000000000E+02 +-6.461354625690E+00 -1.501939981806E+00 6.378051764000E-01 1.080000000000E+02 +-6.474873094724E+00 -1.544156712690E+00 5.605003417000E-01 1.080000000000E+02 +-6.486677357143E+00 -1.571113930543E+00 4.764366174000E-01 1.080000000000E+02 +-6.496180532716E+00 -1.583184933401E+00 3.886351210000E-01 1.080000000000E+02 +-6.502764148823E+00 -1.581153917295E+00 2.997983967000E-01 1.080000000000E+02 +-6.505941072933E+00 -1.565743396939E+00 2.120822207000E-01 1.080000000000E+02 +-6.505378036944E+00 -1.537959689789E+00 1.274648788000E-01 1.080000000000E+02 +-6.500518682094E+00 -1.501403584884E+00 4.635841915000E-02 1.080000000000E+02 +-6.490955111016E+00 -1.459809917170E+00 -3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +-6.399255198605E+00 -2.018777681744E+00 -3.632685538000E-02 1.080000000000E+02 +-6.392786513762E+00 -1.993794673114E+00 -1.206362437000E-01 1.080000000000E+02 +-6.381260128288E+00 -1.968575271623E+00 -2.044325232000E-01 1.080000000000E+02 +-6.364088048491E+00 -1.945599564827E+00 -2.879184587000E-01 1.080000000000E+02 +-6.341404394176E+00 -1.925340662247E+00 -3.706549346000E-01 1.080000000000E+02 +-6.313165889127E+00 -1.909577972585E+00 -4.527156872000E-01 1.080000000000E+02 +-6.280028634902E+00 -1.897143160455E+00 -5.335701480000E-01 1.080000000000E+02 +-6.242542205634E+00 -1.887531087607E+00 -6.127886991000E-01 1.080000000000E+02 +-6.201050816668E+00 -1.880089776024E+00 -6.903510399000E-01 1.080000000000E+02 +-6.156033360213E+00 -1.873707607248E+00 -7.659096737000E-01 1.080000000000E+02 +-6.107703062878E+00 -1.867554521408E+00 -8.394336353000E-01 1.080000000000E+02 +-6.056041884050E+00 -1.863164972047E+00 -9.108702606000E-01 1.080000000000E+02 +-6.001144868070E+00 -1.861806644106E+00 -9.799657947000E-01 1.080000000000E+02 +-5.943232490397E+00 -1.862605465989E+00 -1.046417130000E+00 1.080000000000E+02 +-5.882252832622E+00 -1.864378547989E+00 -1.110182121000E+00 1.080000000000E+02 +-5.818299815750E+00 -1.865856398085E+00 -1.170998922000E+00 1.080000000000E+02 +-5.751464472298E+00 -1.865887614719E+00 -1.228575236000E+00 1.080000000000E+02 +-5.681828417148E+00 -1.863519969467E+00 -1.282612075000E+00 1.080000000000E+02 +-5.609466391429E+00 -1.857916794781E+00 -1.332770951000E+00 1.080000000000E+02 +-5.534589379343E+00 -1.848797711385E+00 -1.378577601000E+00 1.080000000000E+02 +-5.457525882539E+00 -1.836023909372E+00 -1.419493916000E+00 1.080000000000E+02 +-5.378351681544E+00 -1.819927558124E+00 -1.455093589000E+00 1.080000000000E+02 +-5.297488973136E+00 -1.800804489549E+00 -1.484797470000E+00 1.080000000000E+02 +-5.215284198922E+00 -1.779296073690E+00 -1.508093490000E+00 1.080000000000E+02 +-5.131697903997E+00 -1.756036235416E+00 -1.524583142000E+00 1.080000000000E+02 +-5.047223790435E+00 -1.732303553302E+00 -1.533750385000E+00 1.080000000000E+02 +-4.962142901860E+00 -1.709307923191E+00 -1.535219663000E+00 1.080000000000E+02 +-4.876751232219E+00 -1.687781161448E+00 -1.528680731000E+00 1.080000000000E+02 +-4.791891207169E+00 -1.668803176634E+00 -1.513978101000E+00 1.080000000000E+02 +-4.707858881022E+00 -1.654811039134E+00 -1.491069996000E+00 1.080000000000E+02 +-4.625623583588E+00 -1.647423251126E+00 -1.460188986000E+00 1.080000000000E+02 +-4.546276568305E+00 -1.644444084540E+00 -1.421583532000E+00 1.080000000000E+02 +-4.471026521022E+00 -1.643578751634E+00 -1.375655668000E+00 1.080000000000E+02 +-4.400560802767E+00 -1.641444561629E+00 -1.322504398000E+00 1.080000000000E+02 +-4.336007981876E+00 -1.635390497070E+00 -1.262691804000E+00 1.080000000000E+02 +-4.277545914347E+00 -1.630370840944E+00 -1.196814028000E+00 1.080000000000E+02 +-4.225480280017E+00 -1.632761659682E+00 -1.125601149000E+00 1.080000000000E+02 +-4.180930136357E+00 -1.642234004049E+00 -1.050138721000E+00 1.080000000000E+02 +-4.144654699884E+00 -1.657032137467E+00 -9.710448039000E-01 1.080000000000E+02 +-4.117553430723E+00 -1.678089393109E+00 -8.897856590000E-01 1.080000000000E+02 +-4.100216611807E+00 -1.704102786728E+00 -8.072828216000E-01 1.080000000000E+02 +-4.093167516923E+00 -1.735720064440E+00 -7.252260042000E-01 1.080000000000E+02 +-4.096537275408E+00 -1.773585626789E+00 -6.456312705000E-01 1.080000000000E+02 +-4.109899274600E+00 -1.816720474893E+00 -5.697936167000E-01 1.080000000000E+02 +-4.132321961495E+00 -1.864064767955E+00 -4.988404496000E-01 1.080000000000E+02 +-4.162064683787E+00 -1.916772472147E+00 -4.346658470000E-01 1.080000000000E+02 +-4.197548464413E+00 -1.972704233485E+00 -3.764466502000E-01 1.080000000000E+02 +-4.240025043462E+00 -2.024110708160E+00 -3.185973837000E-01 1.080000000000E+02 +-4.289187739588E+00 -2.069264701462E+00 -2.609630366000E-01 1.080000000000E+02 +-4.344077535693E+00 -2.107804379082E+00 -2.036424630000E-01 1.080000000000E+02 +-4.403303136645E+00 -2.138797639387E+00 -1.460500498000E-01 1.080000000000E+02 +-4.465440076926E+00 -2.158031960579E+00 -8.649636904000E-02 1.080000000000E+02 +-4.528086223431E+00 -2.162324628412E+00 -2.448555749000E-02 1.080000000000E+02 +-4.588873300583E+00 -2.151265353908E+00 3.845435998000E-02 1.080000000000E+02 +-4.647187697187E+00 -2.125906425947E+00 9.962429365000E-02 1.080000000000E+02 +-4.702490541491E+00 -2.085239653880E+00 1.550619236000E-01 1.080000000000E+02 +-4.755504579220E+00 -2.033741144271E+00 2.031942363000E-01 1.080000000000E+02 +-4.807982462663E+00 -1.977318506233E+00 2.462074493000E-01 1.080000000000E+02 +-4.865728112936E+00 -1.928529390973E+00 2.916382842000E-01 1.080000000000E+02 +-4.924699835305E+00 -1.884547706365E+00 3.403860995000E-01 1.080000000000E+02 +-4.979596673625E+00 -1.838989904372E+00 3.922509070000E-01 1.080000000000E+02 +-5.027388287963E+00 -1.788021292841E+00 4.461358974000E-01 1.080000000000E+02 +-5.068405470993E+00 -1.730679030507E+00 4.991121880000E-01 1.080000000000E+02 +-5.106776513804E+00 -1.667952176469E+00 5.478583852000E-01 1.080000000000E+02 +-5.148235669913E+00 -1.602945014898E+00 5.907387262000E-01 1.080000000000E+02 +-5.198186141910E+00 -1.542354851087E+00 6.309463669000E-01 1.080000000000E+02 +-5.257301346545E+00 -1.488562356205E+00 6.683070249000E-01 1.080000000000E+02 +-5.323116481349E+00 -1.445747890470E+00 7.085053980000E-01 1.080000000000E+02 +-5.389962920314E+00 -1.417602228306E+00 7.587395914000E-01 1.080000000000E+02 +-5.450886336670E+00 -1.403420148788E+00 8.209661657000E-01 1.080000000000E+02 +-5.504063051176E+00 -1.403475327544E+00 8.913395217000E-01 1.080000000000E+02 +-5.554415274675E+00 -1.420998666969E+00 9.616664656000E-01 1.080000000000E+02 +-5.609175004223E+00 -1.453648350018E+00 1.022604995000E+00 1.080000000000E+02 +-5.669168923254E+00 -1.497359400687E+00 1.070335916000E+00 1.080000000000E+02 +-5.726730228128E+00 -1.553591507583E+00 1.106430447000E+00 1.080000000000E+02 +-5.775064868579E+00 -1.622079551984E+00 1.133893710000E+00 1.080000000000E+02 +-5.809180789739E+00 -1.700554693752E+00 1.155518699000E+00 1.080000000000E+02 +-5.836256604612E+00 -1.782870431418E+00 1.172009822000E+00 1.080000000000E+02 +-5.870514185206E+00 -1.863743381068E+00 1.180212576000E+00 1.080000000000E+02 +-5.914847123518E+00 -1.939862574804E+00 1.175727956000E+00 1.080000000000E+02 +-5.963817304865E+00 -2.010773413262E+00 1.156570420000E+00 1.080000000000E+02 +-6.013079686787E+00 -2.075466827554E+00 1.122466283000E+00 1.080000000000E+02 +-6.060752809475E+00 -2.131893444998E+00 1.074292285000E+00 1.080000000000E+02 +-6.106189512226E+00 -2.177669486845E+00 1.014026757000E+00 1.080000000000E+02 +-6.149159899523E+00 -2.210691789373E+00 9.444199619000E-01 1.080000000000E+02 +-6.189402287163E+00 -2.230167278864E+00 8.684143517000E-01 1.080000000000E+02 +-6.226447232564E+00 -2.237240621721E+00 7.885880029000E-01 1.080000000000E+02 +-6.259492025803E+00 -2.235623464260E+00 7.068846032000E-01 1.080000000000E+02 +-6.288987103395E+00 -2.225950176269E+00 6.243033587000E-01 1.080000000000E+02 +-6.315597026060E+00 -2.207365134177E+00 5.422183342000E-01 1.080000000000E+02 +-6.339335753527E+00 -2.181927350756E+00 4.611599500000E-01 1.080000000000E+02 +-6.360179227382E+00 -2.151624032493E+00 3.810313384000E-01 1.080000000000E+02 +-6.377298851880E+00 -2.121217541200E+00 2.999547317000E-01 1.080000000000E+02 +-6.389808580793E+00 -2.093766387529E+00 2.170477619000E-01 1.080000000000E+02 +-6.397676089502E+00 -2.068158827302E+00 1.330022602000E-01 1.080000000000E+02 +-6.400573377281E+00 -2.044514942062E+00 4.805479793000E-02 1.080000000000E+02 +-6.399255198605E+00 -2.018777681744E+00 -3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +-6.185200639253E+00 -2.789637852993E+00 -2.786784824000E-03 1.080000000000E+02 +-6.174412389155E+00 -2.797761389012E+00 -9.012406132000E-02 1.080000000000E+02 +-6.159055610109E+00 -2.807144561192E+00 -1.765219348000E-01 1.080000000000E+02 +-6.139978740735E+00 -2.815147020432E+00 -2.624374443000E-01 1.080000000000E+02 +-6.118010444224E+00 -2.819229698936E+00 -3.478877549000E-01 1.080000000000E+02 +-6.092983879740E+00 -2.819959610032E+00 -4.326343739000E-01 1.080000000000E+02 +-6.064555616544E+00 -2.818655344655E+00 -5.162774167000E-01 1.080000000000E+02 +-6.032418563888E+00 -2.816542436502E+00 -5.984352213000E-01 1.080000000000E+02 +-5.996473926561E+00 -2.813814942847E+00 -6.790841041000E-01 1.080000000000E+02 +-5.957176401643E+00 -2.808997093993E+00 -7.581530132000E-01 1.080000000000E+02 +-5.915013994723E+00 -2.800936705851E+00 -8.352590367000E-01 1.080000000000E+02 +-5.869633873143E+00 -2.790291584336E+00 -9.103747398000E-01 1.080000000000E+02 +-5.820942184851E+00 -2.777913696904E+00 -9.829305340000E-01 1.080000000000E+02 +-5.768940391677E+00 -2.763250432470E+00 -1.052910239000E+00 1.080000000000E+02 +-5.713759208728E+00 -2.746624412702E+00 -1.119713595000E+00 1.080000000000E+02 +-5.654282523306E+00 -2.730991358472E+00 -1.183240350000E+00 1.080000000000E+02 +-5.590241602738E+00 -2.718711295478E+00 -1.242822431000E+00 1.080000000000E+02 +-5.522008362834E+00 -2.709335385968E+00 -1.298134958000E+00 1.080000000000E+02 +-5.450032155980E+00 -2.701948835443E+00 -1.348880339000E+00 1.080000000000E+02 +-5.374689228393E+00 -2.696561347132E+00 -1.394624322000E+00 1.080000000000E+02 +-5.296219652312E+00 -2.693111782174E+00 -1.435050927000E+00 1.080000000000E+02 +-5.215169184235E+00 -2.690366451431E+00 -1.469852265000E+00 1.080000000000E+02 +-5.131747700730E+00 -2.686728079865E+00 -1.498846663000E+00 1.080000000000E+02 +-5.046702491415E+00 -2.679647481369E+00 -1.521653119000E+00 1.080000000000E+02 +-4.960995122121E+00 -2.665951185542E+00 -1.537810757000E+00 1.080000000000E+02 +-4.875457375085E+00 -2.645544469074E+00 -1.546702180000E+00 1.080000000000E+02 +-4.790974979445E+00 -2.619687894514E+00 -1.547836060000E+00 1.080000000000E+02 +-4.708616962488E+00 -2.588738035550E+00 -1.540955846000E+00 1.080000000000E+02 +-4.629240480235E+00 -2.552830527118E+00 -1.525941209000E+00 1.080000000000E+02 +-4.554008597152E+00 -2.512836206104E+00 -1.502926011000E+00 1.080000000000E+02 +-4.483067335390E+00 -2.470238896058E+00 -1.472011314000E+00 1.080000000000E+02 +-4.414847415358E+00 -2.429973507896E+00 -1.432913650000E+00 1.080000000000E+02 +-4.348243718121E+00 -2.397231544787E+00 -1.385061074000E+00 1.080000000000E+02 +-4.285316167173E+00 -2.371816101289E+00 -1.328492129000E+00 1.080000000000E+02 +-4.228633367792E+00 -2.352119363463E+00 -1.263647540000E+00 1.080000000000E+02 +-4.179750457504E+00 -2.339323935519E+00 -1.191204722000E+00 1.080000000000E+02 +-4.140036211432E+00 -2.335304397772E+00 -1.112414355000E+00 1.080000000000E+02 +-4.110787719172E+00 -2.340577429523E+00 -1.029225643000E+00 1.080000000000E+02 +-4.092552937763E+00 -2.354843323428E+00 -9.439925506000E-01 1.080000000000E+02 +-4.084769738982E+00 -2.378668055386E+00 -8.592609358000E-01 1.080000000000E+02 +-4.086027513293E+00 -2.412659735390E+00 -7.777589224000E-01 1.080000000000E+02 +-4.094237567504E+00 -2.456877176228E+00 -7.017224202000E-01 1.080000000000E+02 +-4.107227752228E+00 -2.509463881454E+00 -6.319745517000E-01 1.080000000000E+02 +-4.124608112325E+00 -2.564354992089E+00 -5.649597706000E-01 1.080000000000E+02 +-4.148092802457E+00 -2.614288911766E+00 -4.959805589000E-01 1.080000000000E+02 +-4.179390228648E+00 -2.654458584685E+00 -4.238156204000E-01 1.080000000000E+02 +-4.219605075076E+00 -2.680893413993E+00 -3.497702850000E-01 1.080000000000E+02 +-4.268233921564E+00 -2.693529982783E+00 -2.770763044000E-01 1.080000000000E+02 +-4.323534848363E+00 -2.696702921211E+00 -2.083126740000E-01 1.080000000000E+02 +-4.383762771064E+00 -2.687131029132E+00 -1.443669380000E-01 1.080000000000E+02 +-4.444835431003E+00 -2.663923062056E+00 -8.494149535000E-02 1.080000000000E+02 +-4.502158707430E+00 -2.626423792184E+00 -2.916971350000E-02 1.080000000000E+02 +-4.553932002388E+00 -2.579572171854E+00 2.494784873000E-02 1.080000000000E+02 +-4.601300336474E+00 -2.528983940601E+00 7.966775233000E-02 1.080000000000E+02 +-4.646284842814E+00 -2.478351193358E+00 1.364003779000E-01 1.080000000000E+02 +-4.690462435968E+00 -2.428796032661E+00 1.946452353000E-01 1.080000000000E+02 +-4.734808869131E+00 -2.380217782429E+00 2.536123470000E-01 1.080000000000E+02 +-4.778507052514E+00 -2.329510526907E+00 3.112409570000E-01 1.080000000000E+02 +-4.819088087078E+00 -2.274277190437E+00 3.670458051000E-01 1.080000000000E+02 +-4.853749724095E+00 -2.215239376432E+00 4.228264178000E-01 1.080000000000E+02 +-4.881685338879E+00 -2.154358214530E+00 4.803836822000E-01 1.080000000000E+02 +-4.904609672106E+00 -2.093426032197E+00 5.400717519000E-01 1.080000000000E+02 +-4.928064329784E+00 -2.031918084324E+00 5.989634359000E-01 1.080000000000E+02 +-4.948671844402E+00 -1.979127046412E+00 6.667474988000E-01 1.080000000000E+02 +-4.973032147522E+00 -1.940104066297E+00 7.421450537000E-01 1.080000000000E+02 +-5.008976189582E+00 -1.915138651095E+00 8.188905247000E-01 1.080000000000E+02 +-5.054837707161E+00 -1.904839404754E+00 8.936981911000E-01 1.080000000000E+02 +-5.103931324573E+00 -1.911482525150E+00 9.667867241000E-01 1.080000000000E+02 +-5.152060153432E+00 -1.934750986684E+00 1.037139043000E+00 1.080000000000E+02 +-5.196442504424E+00 -1.973578202421E+00 1.102951579000E+00 1.080000000000E+02 +-5.235376961743E+00 -2.025717042657E+00 1.162638692000E+00 1.080000000000E+02 +-5.270077523386E+00 -2.087184096781E+00 1.215714425000E+00 1.080000000000E+02 +-5.300358795546E+00 -2.155943081552E+00 1.262085734000E+00 1.080000000000E+02 +-5.331073343266E+00 -2.228715664316E+00 1.301720477000E+00 1.080000000000E+02 +-5.366620058506E+00 -2.303232352352E+00 1.333014261000E+00 1.080000000000E+02 +-5.408794019215E+00 -2.378213713136E+00 1.353085167000E+00 1.080000000000E+02 +-5.458259328618E+00 -2.451216041613E+00 1.358569067000E+00 1.080000000000E+02 +-5.511832431131E+00 -2.520693765774E+00 1.348281183000E+00 1.080000000000E+02 +-5.567800482783E+00 -2.584203256573E+00 1.323067807000E+00 1.080000000000E+02 +-5.625209932722E+00 -2.639601254795E+00 1.285194785000E+00 1.080000000000E+02 +-5.684354620428E+00 -2.684195862123E+00 1.237059622000E+00 1.080000000000E+02 +-5.744257877202E+00 -2.717604511241E+00 1.181327921000E+00 1.080000000000E+02 +-5.803812966868E+00 -2.740337384015E+00 1.120196685000E+00 1.080000000000E+02 +-5.863038189406E+00 -2.750661471678E+00 1.055471471000E+00 1.080000000000E+02 +-5.920326929217E+00 -2.751440783347E+00 9.881923803000E-01 1.080000000000E+02 +-5.974040821249E+00 -2.747064634953E+00 9.182365063000E-01 1.080000000000E+02 +-6.023684332775E+00 -2.738409274062E+00 8.457732406000E-01 1.080000000000E+02 +-6.067629597608E+00 -2.731199009675E+00 7.694019289000E-01 1.080000000000E+02 +-6.104629730435E+00 -2.728319285754E+00 6.892798267000E-01 1.080000000000E+02 +-6.134938398870E+00 -2.728741224137E+00 6.062523787000E-01 1.080000000000E+02 +-6.158072651825E+00 -2.733934432363E+00 5.212198625000E-01 1.080000000000E+02 +-6.175102175986E+00 -2.741587685877E+00 4.348356053000E-01 1.080000000000E+02 +-6.186859839074E+00 -2.749879928204E+00 3.477269332000E-01 1.080000000000E+02 +-6.193393036704E+00 -2.759403634469E+00 2.600860194000E-01 1.080000000000E+02 +-6.194743443205E+00 -2.770554926826E+00 1.724869752000E-01 1.080000000000E+02 +-6.191797631515E+00 -2.781197561520E+00 8.489061568000E-02 1.080000000000E+02 +-6.185200639253E+00 -2.789637852993E+00 -2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +-5.789244663062E+00 -3.673149990695E+00 -1.744954334000E-02 1.080000000000E+02 +-5.783965857593E+00 -3.675103936170E+00 -1.063739981000E-01 1.080000000000E+02 +-5.774572862576E+00 -3.674434682558E+00 -1.949310037000E-01 1.080000000000E+02 +-5.761352680941E+00 -3.670703159217E+00 -2.829651087000E-01 1.080000000000E+02 +-5.744009721588E+00 -3.664526437129E+00 -3.701617308000E-01 1.080000000000E+02 +-5.722020493968E+00 -3.657077513997E+00 -4.560661339000E-01 1.080000000000E+02 +-5.695550411069E+00 -3.648128726882E+00 -5.407768227000E-01 1.080000000000E+02 +-5.665048386569E+00 -3.637432599697E+00 -6.236520547000E-01 1.080000000000E+02 +-5.630153212544E+00 -3.625627444386E+00 -7.047985910000E-01 1.080000000000E+02 +-5.590641027479E+00 -3.613615008263E+00 -7.837241475000E-01 1.080000000000E+02 +-5.546219827819E+00 -3.602219665256E+00 -8.601609198000E-01 1.080000000000E+02 +-5.496261345829E+00 -3.593387301672E+00 -9.334175927000E-01 1.080000000000E+02 +-5.439524025522E+00 -3.591327458130E+00 -1.002061223000E+00 1.080000000000E+02 +-5.376638575125E+00 -3.597150166436E+00 -1.064920566000E+00 1.080000000000E+02 +-5.309818565295E+00 -3.606110895709E+00 -1.123012040000E+00 1.080000000000E+02 +-5.240086111456E+00 -3.614061869634E+00 -1.177853833000E+00 1.080000000000E+02 +-5.168092509902E+00 -3.617952343467E+00 -1.230287750000E+00 1.080000000000E+02 +-5.095089486220E+00 -3.613412613711E+00 -1.280975246000E+00 1.080000000000E+02 +-5.021652185732E+00 -3.598831201791E+00 -1.329400646000E+00 1.080000000000E+02 +-4.948356703474E+00 -3.575088967382E+00 -1.374018251000E+00 1.080000000000E+02 +-4.875436231060E+00 -3.542679820495E+00 -1.413793625000E+00 1.080000000000E+02 +-4.803522397840E+00 -3.502429224377E+00 -1.447633049000E+00 1.080000000000E+02 +-4.732848750572E+00 -3.455546368438E+00 -1.474786583000E+00 1.080000000000E+02 +-4.663620125258E+00 -3.403114789892E+00 -1.494787468000E+00 1.080000000000E+02 +-4.597734628014E+00 -3.344512103091E+00 -1.507450791000E+00 1.080000000000E+02 +-4.536881660074E+00 -3.279802615009E+00 -1.512984118000E+00 1.080000000000E+02 +-4.478923778266E+00 -3.212093441455E+00 -1.511502484000E+00 1.080000000000E+02 +-4.421066063897E+00 -3.144927129157E+00 -1.502532507000E+00 1.080000000000E+02 +-4.360449028426E+00 -3.082126306899E+00 -1.484801442000E+00 1.080000000000E+02 +-4.295472075600E+00 -3.028191471348E+00 -1.456473280000E+00 1.080000000000E+02 +-4.228393034589E+00 -2.985438811670E+00 -1.416487546000E+00 1.080000000000E+02 +-4.162963347567E+00 -2.954398023914E+00 -1.364609021000E+00 1.080000000000E+02 +-4.103178720425E+00 -2.934746049668E+00 -1.301455248000E+00 1.080000000000E+02 +-4.052512203578E+00 -2.925767008760E+00 -1.228771473000E+00 1.080000000000E+02 +-4.012598312439E+00 -2.928054235666E+00 -1.149164457000E+00 1.080000000000E+02 +-3.983381660474E+00 -2.942480819057E+00 -1.066259509000E+00 1.080000000000E+02 +-3.963010684267E+00 -2.969909407782E+00 -9.840199882000E-01 1.080000000000E+02 +-3.948994221344E+00 -3.008754408769E+00 -9.050198505000E-01 1.080000000000E+02 +-3.941074821514E+00 -3.051779020136E+00 -8.274301477000E-01 1.080000000000E+02 +-3.941721171414E+00 -3.091290776949E+00 -7.475896770000E-01 1.080000000000E+02 +-3.952940653843E+00 -3.124551778260E+00 -6.657541041000E-01 1.080000000000E+02 +-3.975230690834E+00 -3.151433979212E+00 -5.837632627000E-01 1.080000000000E+02 +-4.008974636295E+00 -3.169252423319E+00 -5.032871173000E-01 1.080000000000E+02 +-4.053145888490E+00 -3.173907188474E+00 -4.260584823000E-01 1.080000000000E+02 +-4.104245059655E+00 -3.162155112620E+00 -3.540587787000E-01 1.080000000000E+02 +-4.157895538522E+00 -3.135010705548E+00 -2.882948801000E-01 1.080000000000E+02 +-4.211636484935E+00 -3.098265605432E+00 -2.275175217000E-01 1.080000000000E+02 +-4.265527159572E+00 -3.058567473285E+00 -1.687606404000E-01 1.080000000000E+02 +-4.319842882246E+00 -3.019360467640E+00 -1.100117670000E-01 1.080000000000E+02 +-4.372657401463E+00 -2.984766427525E+00 -4.718627597000E-02 1.080000000000E+02 +-4.419642245441E+00 -2.946607802128E+00 1.819661694000E-02 1.080000000000E+02 +-4.457625199199E+00 -2.901961947227E+00 8.530081591000E-02 1.080000000000E+02 +-4.489296459889E+00 -2.848915044451E+00 1.494783330000E-01 1.080000000000E+02 +-4.515260915489E+00 -2.792149457530E+00 2.130101728000E-01 1.080000000000E+02 +-4.539578898188E+00 -2.730329187064E+00 2.723890661000E-01 1.080000000000E+02 +-4.559180024532E+00 -2.666988507495E+00 3.318667032000E-01 1.080000000000E+02 +-4.579532390654E+00 -2.600538607780E+00 3.875539046000E-01 1.080000000000E+02 +-4.596913251105E+00 -2.535229467525E+00 4.456338674000E-01 1.080000000000E+02 +-4.609786322387E+00 -2.474978535235E+00 5.099892243000E-01 1.080000000000E+02 +-4.616792481848E+00 -2.424889957894E+00 5.833000314000E-01 1.080000000000E+02 +-4.619520976952E+00 -2.389044050183E+00 6.647899090000E-01 1.080000000000E+02 +-4.622173167912E+00 -2.368519503995E+00 7.514880132000E-01 1.080000000000E+02 +-4.627582512402E+00 -2.363440721210E+00 8.402099046000E-01 1.080000000000E+02 +-4.635685348353E+00 -2.374119565207E+00 9.282726209000E-01 1.080000000000E+02 +-4.644422408917E+00 -2.400220971227E+00 1.013024536000E+00 1.080000000000E+02 +-4.650187495517E+00 -2.440790090430E+00 1.092107862000E+00 1.080000000000E+02 +-4.659911117845E+00 -2.488328085269E+00 1.166812923000E+00 1.080000000000E+02 +-4.679066814169E+00 -2.539282552089E+00 1.237341473000E+00 1.080000000000E+02 +-4.709434216819E+00 -2.592733679109E+00 1.301808004000E+00 1.080000000000E+02 +-4.751021039205E+00 -2.648165306257E+00 1.357785149000E+00 1.080000000000E+02 +-4.802914475489E+00 -2.704686498341E+00 1.403042952000E+00 1.080000000000E+02 +-4.863646173486E+00 -2.760986691472E+00 1.435958561000E+00 1.080000000000E+02 +-4.931182615720E+00 -2.815572173785E+00 1.455667884000E+00 1.080000000000E+02 +-5.003626119580E+00 -2.867032560257E+00 1.462072215000E+00 1.080000000000E+02 +-5.078935349486E+00 -2.914170208002E+00 1.455639493000E+00 1.080000000000E+02 +-5.155111657306E+00 -2.956672729642E+00 1.437348696000E+00 1.080000000000E+02 +-5.229194975785E+00 -2.996805365259E+00 1.408608053000E+00 1.080000000000E+02 +-5.299317493929E+00 -3.036726496389E+00 1.370749447000E+00 1.080000000000E+02 +-5.364825174988E+00 -3.076325237034E+00 1.325285698000E+00 1.080000000000E+02 +-5.426018547185E+00 -3.115130883929E+00 1.273441742000E+00 1.080000000000E+02 +-5.484101699980E+00 -3.151134787088E+00 1.216246575000E+00 1.080000000000E+02 +-5.539072399539E+00 -3.184480150531E+00 1.154539058000E+00 1.080000000000E+02 +-5.587156822774E+00 -3.221379302650E+00 1.089263674000E+00 1.080000000000E+02 +-5.625684712672E+00 -3.265010998436E+00 1.021917209000E+00 1.080000000000E+02 +-5.654795890646E+00 -3.314380931042E+00 9.537419589000E-01 1.080000000000E+02 +-5.676388672514E+00 -3.366931350421E+00 8.850071242000E-01 1.080000000000E+02 +-5.694127100151E+00 -3.418499089608E+00 8.145657329000E-01 1.080000000000E+02 +-5.710378199217E+00 -3.466440861825E+00 7.412825815000E-01 1.080000000000E+02 +-5.725426631518E+00 -3.510030512008E+00 6.651770142000E-01 1.080000000000E+02 +-5.738996641435E+00 -3.549382304645E+00 5.863142345000E-01 1.080000000000E+02 +-5.751389032467E+00 -3.583479563765E+00 5.049593618000E-01 1.080000000000E+02 +-5.762792555558E+00 -3.611630048928E+00 4.212413326000E-01 1.080000000000E+02 +-5.772941001797E+00 -3.633771675442E+00 3.354886308000E-01 1.080000000000E+02 +-5.781209146452E+00 -3.650346571501E+00 2.484589536000E-01 1.080000000000E+02 +-5.787117198177E+00 -3.661913984471E+00 1.602254120000E-01 1.080000000000E+02 +-5.790079891250E+00 -3.669089266494E+00 7.150080869000E-02 1.080000000000E+02 +-5.789244663062E+00 -3.673149990695E+00 -1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +-4.482624223E+00 -5.402161438E+00 -7.060900000E-01 3.600000000E+01 +-4.437293075E+00 -5.395974943E+00 -8.029600000E-01 3.600000000E+01 +-4.389941621E+00 -5.385304602E+00 -8.983500000E-01 3.600000000E+01 +-4.340266598E+00 -5.369410937E+00 -9.918700000E-01 3.600000000E+01 +-4.287521413E+00 -5.346021018E+00 -1.082130000E+00 3.600000000E+01 +-4.231993453E+00 -5.314960463E+00 -1.168230000E+00 3.600000000E+01 +-4.174130646E+00 -5.276616517E+00 -1.249630000E+00 3.600000000E+01 +-4.114073803E+00 -5.230250956E+00 -1.325010000E+00 3.600000000E+01 +-4.052193986E+00 -5.175404094E+00 -1.392860000E+00 3.600000000E+01 +-3.989146999E+00 -5.112057972E+00 -1.451630000E+00 3.600000000E+01 +-3.925787429E+00 -5.040771680E+00 -1.500110000E+00 3.600000000E+01 +-3.863049505E+00 -4.962607159E+00 -1.537570000E+00 3.600000000E+01 +-3.801791869E+00 -4.878917526E+00 -1.563950000E+00 3.600000000E+01 +-3.742646010E+00 -4.791113359E+00 -1.579670000E+00 3.600000000E+01 +-3.686058795E+00 -4.700434014E+00 -1.585460000E+00 3.600000000E+01 +-3.632307891E+00 -4.607909396E+00 -1.582110000E+00 3.600000000E+01 +-3.581581911E+00 -4.514368737E+00 -1.570270000E+00 3.600000000E+01 +-3.534101002E+00 -4.420478771E+00 -1.550420000E+00 3.600000000E+01 +-3.490098520E+00 -4.326854026E+00 -1.522840000E+00 3.600000000E+01 +-3.449905599E+00 -4.234093544E+00 -1.487590000E+00 3.600000000E+01 +-3.413860007E+00 -4.142838270E+00 -1.444770000E+00 3.600000000E+01 +-3.382009028E+00 -4.053567543E+00 -1.394960000E+00 3.600000000E+01 +-3.354759578E+00 -3.966997266E+00 -1.338190000E+00 3.600000000E+01 +-3.332785548E+00 -3.884037315E+00 -1.274170000E+00 3.600000000E+01 +-3.316366688E+00 -3.805459529E+00 -1.203290000E+00 3.600000000E+01 +-3.305990187E+00 -3.732260629E+00 -1.125800000E+00 3.600000000E+01 +-3.299893147E+00 -3.663209236E+00 -1.044140000E+00 3.600000000E+01 +-3.296439769E+00 -3.596882020E+00 -9.600900000E-01 3.600000000E+01 +-3.296040571E+00 -3.533836815E+00 -8.735000000E-01 3.600000000E+01 +-3.298316768E+00 -3.473761334E+00 -7.848200000E-01 3.600000000E+01 +-3.302170873E+00 -3.415512107E+00 -6.949900000E-01 3.600000000E+01 +-3.306756194E+00 -3.358127879E+00 -6.046400000E-01 3.600000000E+01 +-3.312634749E+00 -3.302264193E+00 -5.134200000E-01 3.600000000E+01 +-3.320302381E+00 -3.248565594E+00 -4.210300000E-01 3.600000000E+01 +-3.330847163E+00 -3.198477730E+00 -3.269400000E-01 3.600000000E+01 +-3.345272600E+00 -3.153409529E+00 -2.308300000E-01 3.600000000E+01 +-3.359010178E+00 -3.107433666E+00 -1.350400000E-01 3.600000000E+01 +-3.371988538E+00 -3.060461215E+00 -3.963000000E-02 3.600000000E+01 +-3.386273472E+00 -3.015229128E+00 5.642000000E-02 3.600000000E+01 +-3.403006775E+00 -2.973296251E+00 1.535700000E-01 3.600000000E+01 +-3.421472655E+00 -2.933759345E+00 2.514000000E-01 3.600000000E+01 +-3.439961351E+00 -2.894276099E+00 3.492500000E-01 3.600000000E+01 +-3.461365696E+00 -2.858963068E+00 4.480900000E-01 3.600000000E+01 +-3.485866015E+00 -2.828235563E+00 5.477400000E-01 3.600000000E+01 +-3.512801690E+00 -2.801267518E+00 6.478600000E-01 3.600000000E+01 +-3.540653398E+00 -2.775743732E+00 7.481100000E-01 3.600000000E+01 +-3.570410047E+00 -2.753297379E+00 8.485000000E-01 3.600000000E+01 +-3.603846442E+00 -2.736997870E+00 9.489300000E-01 3.600000000E+01 +-3.640964230E+00 -2.727217220E+00 1.048900000E+00 3.600000000E+01 +-3.681801845E+00 -2.724378897E+00 1.147850000E+00 3.600000000E+01 +-3.726377940E+00 -2.729052681E+00 1.245100000E+00 3.600000000E+01 +-3.774745046E+00 -2.741931857E+00 1.339760000E+00 3.600000000E+01 +-3.826979401E+00 -2.764085388E+00 1.430550000E+00 3.600000000E+01 +-3.882869597E+00 -2.796212566E+00 1.516010000E+00 3.600000000E+01 +-3.941888580E+00 -2.838511415E+00 1.594630000E+00 3.600000000E+01 +-4.003308430E+00 -2.890860973E+00 1.664860000E+00 3.600000000E+01 +-4.066185633E+00 -2.952773507E+00 1.725230000E+00 3.600000000E+01 +-4.129474214E+00 -3.023204778E+00 1.774710000E+00 3.600000000E+01 +-4.192266102E+00 -3.100444374E+00 1.813600000E+00 3.600000000E+01 +-4.254027455E+00 -3.182794204E+00 1.843010000E+00 3.600000000E+01 +-4.313531928E+00 -3.270240886E+00 1.860050000E+00 3.600000000E+01 +-4.370693026E+00 -3.360249441E+00 1.868120000E+00 3.600000000E+01 +-4.426138853E+00 -3.451768210E+00 1.870100000E+00 3.600000000E+01 +-4.477874197E+00 -3.545127524E+00 1.860860000E+00 3.600000000E+01 +-4.527139347E+00 -3.638756372E+00 1.845540000E+00 3.600000000E+01 +-4.573500537E+00 -3.732673341E+00 1.823030000E+00 3.600000000E+01 +-4.616444920E+00 -3.826036120E+00 1.793360000E+00 3.600000000E+01 +-4.657321711E+00 -3.919046248E+00 1.759350000E+00 3.600000000E+01 +-4.693627576E+00 -4.010317572E+00 1.717120000E+00 3.600000000E+01 +-4.727634010E+00 -4.100721706E+00 1.670760000E+00 3.600000000E+01 +-4.756801395E+00 -4.188326984E+00 1.617000000E+00 3.600000000E+01 +-4.782544685E+00 -4.273976021E+00 1.558010000E+00 3.600000000E+01 +-4.805672638E+00 -4.357712543E+00 1.495580000E+00 3.600000000E+01 +-4.824809925E+00 -4.438537316E+00 1.427910000E+00 3.600000000E+01 +-4.842660051E+00 -4.518241502E+00 1.358800000E+00 3.600000000E+01 +-4.852706308E+00 -4.591163384E+00 1.280960000E+00 3.600000000E+01 +-4.862766534E+00 -4.664083054E+00 1.203110000E+00 3.600000000E+01 +-4.867052569E+00 -4.731237723E+00 1.119870000E+00 3.600000000E+01 +-4.870130069E+00 -4.797180601E+00 1.035480000E+00 3.600000000E+01 +-4.870371823E+00 -4.860000171E+00 9.488300000E-01 3.600000000E+01 +-4.867806527E+00 -4.919742002E+00 8.599400000E-01 3.600000000E+01 +-4.863629445E+00 -4.977534079E+00 7.699800000E-01 3.600000000E+01 +-4.853250197E+00 -5.027853457E+00 6.759700000E-01 3.600000000E+01 +-4.842870950E+00 -5.078172834E+00 5.819600000E-01 3.600000000E+01 +-4.827834889E+00 -5.122414210E+00 4.855600000E-01 3.600000000E+01 +-4.812690685E+00 -5.166515212E+00 3.891000000E-01 3.600000000E+01 +-4.793850315E+00 -5.205495739E+00 2.911500000E-01 3.600000000E+01 +-4.774239667E+00 -5.243409838E+00 1.928800000E-01 3.600000000E+01 +-4.750651650E+00 -5.275467646E+00 9.349000000E-02 3.600000000E+01 +-4.725860714E+00 -5.305761513E+00 -6.240000000E-03 3.600000000E+01 +-4.697272475E+00 -5.330070341E+00 -1.065300000E-01 3.600000000E+01 +-4.667832232E+00 -5.353067953E+00 -2.069400000E-01 3.600000000E+01 +-4.634564343E+00 -5.369662939E+00 -3.074100000E-01 3.600000000E+01 +-4.600320754E+00 -5.384572543E+00 -4.077700000E-01 3.600000000E+01 +-4.563080095E+00 -5.394165036E+00 -5.077700000E-01 3.600000000E+01 +-4.523681856E+00 -5.399717820E+00 -6.071600000E-01 3.600000000E+01 +-4.482624223E+00 -5.402161438E+00 -7.060900000E-01 0.000000000E+00 6 AAE14_SC +-3.011965530E+00 -6.259545787E+00 -7.213900000E-01 3.600000000E+01 +-3.032820969E+00 -6.206393034E+00 -8.084600000E-01 3.600000000E+01 +-3.051159239E+00 -6.147517837E+00 -8.923100000E-01 3.600000000E+01 +-3.066966569E+00 -6.083330452E+00 -9.726500000E-01 3.600000000E+01 +-3.080191639E+00 -6.014139695E+00 -1.049200000E+00 3.600000000E+01 +-3.090440245E+00 -5.939671518E+00 -1.121050000E+00 3.600000000E+01 +-3.096310249E+00 -5.858215012E+00 -1.185540000E+00 3.600000000E+01 +-3.097395321E+00 -5.770278403E+00 -1.241260000E+00 3.600000000E+01 +-3.094699357E+00 -5.678086708E+00 -1.289570000E+00 3.600000000E+01 +-3.087998368E+00 -5.582169387E+00 -1.329530000E+00 3.600000000E+01 +-3.077095675E+00 -5.483273514E+00 -1.360190000E+00 3.600000000E+01 +-3.061918226E+00 -5.382384310E+00 -1.380740000E+00 3.600000000E+01 +-3.042401886E+00 -5.280678885E+00 -1.390330000E+00 3.600000000E+01 +-3.018180469E+00 -5.179596965E+00 -1.387100000E+00 3.600000000E+01 +-2.990416878E+00 -5.080243020E+00 -1.373500000E+00 3.600000000E+01 +-2.959923101E+00 -4.983268800E+00 -1.351240000E+00 3.600000000E+01 +-2.927040574E+00 -4.889293192E+00 -1.320860000E+00 3.600000000E+01 +-2.892492663E+00 -4.798137192E+00 -1.284380000E+00 3.600000000E+01 +-2.856561698E+00 -4.709820517E+00 -1.242550000E+00 3.600000000E+01 +-2.819684919E+00 -4.623894477E+00 -1.196770000E+00 3.600000000E+01 +-2.782324269E+00 -4.539297936E+00 -1.148930000E+00 3.600000000E+01 +-2.744762449E+00 -4.455284516E+00 -1.100210000E+00 3.600000000E+01 +-2.706861491E+00 -4.372384374E+00 -1.049910000E+00 3.600000000E+01 +-2.668556805E+00 -4.290822515E+00 -9.977300000E-01 3.600000000E+01 +-2.629969547E+00 -4.210279064E+00 -9.442200000E-01 3.600000000E+01 +-2.591166522E+00 -4.130542981E+00 -8.896400000E-01 3.600000000E+01 +-2.552182997E+00 -4.051565727E+00 -8.341100000E-01 3.600000000E+01 +-2.512952168E+00 -3.973558338E+00 -7.773900000E-01 3.600000000E+01 +-2.473557018E+00 -3.896321533E+00 -7.197400000E-01 3.600000000E+01 +-2.434032751E+00 -3.819670756E+00 -6.614000000E-01 3.600000000E+01 +-2.394129286E+00 -3.744919955E+00 -6.009100000E-01 3.600000000E+01 +-2.353797582E+00 -3.672527928E+00 -5.378800000E-01 3.600000000E+01 +-2.313024691E+00 -3.603090939E+00 -4.719100000E-01 3.600000000E+01 +-2.271818268E+00 -3.537244945E+00 -4.026100000E-01 3.600000000E+01 +-2.230213971E+00 -3.475757495E+00 -3.296700000E-01 3.600000000E+01 +-2.188320268E+00 -3.419449035E+00 -2.528300000E-01 3.600000000E+01 +-2.146286079E+00 -3.369169403E+00 -1.720200000E-01 3.600000000E+01 +-2.104349314E+00 -3.325833092E+00 -8.727000000E-02 3.600000000E+01 +-2.062749208E+00 -3.290046540E+00 1.130000000E-03 3.600000000E+01 +-2.021922022E+00 -3.263931369E+00 9.328000000E-02 3.600000000E+01 +-1.982438687E+00 -3.248335007E+00 1.882300000E-01 3.600000000E+01 +-1.944165426E+00 -3.240243139E+00 2.844900000E-01 3.600000000E+01 +-1.907306898E+00 -3.240224723E+00 3.818700000E-01 3.600000000E+01 +-1.873577328E+00 -3.253814371E+00 4.791500000E-01 3.600000000E+01 +-1.840723751E+00 -3.271217160E+00 5.764100000E-01 3.600000000E+01 +-1.811430037E+00 -3.300835310E+00 6.716100000E-01 3.600000000E+01 +-1.783033290E+00 -3.333540199E+00 7.663000000E-01 3.600000000E+01 +-1.757555529E+00 -3.374323702E+00 8.581300000E-01 3.600000000E+01 +-1.735549617E+00 -3.424687601E+00 9.465600000E-01 3.600000000E+01 +-1.713535615E+00 -3.475045621E+00 1.034990000E+00 3.600000000E+01 +-1.697099010E+00 -3.537836398E+00 1.116160000E+00 3.600000000E+01 +-1.681639059E+00 -3.602770595E+00 1.196060000E+00 3.600000000E+01 +-1.669326290E+00 -3.673291655E+00 1.270980000E+00 3.600000000E+01 +-1.662048835E+00 -3.752687292E+00 1.337940000E+00 3.600000000E+01 +-1.656662094E+00 -3.834618516E+00 1.401440000E+00 3.600000000E+01 +-1.657023275E+00 -3.924273366E+00 1.454390000E+00 3.600000000E+01 +-1.660759835E+00 -4.017023327E+00 1.500280000E+00 3.600000000E+01 +-1.670182092E+00 -4.114979568E+00 1.534290000E+00 3.600000000E+01 +-1.683870385E+00 -4.215145297E+00 1.558340000E+00 3.600000000E+01 +-1.700043424E+00 -4.316263412E+00 1.576410000E+00 3.600000000E+01 +-1.720103888E+00 -4.418104592E+00 1.584630000E+00 3.600000000E+01 +-1.743110152E+00 -4.519514999E+00 1.584800000E+00 3.600000000E+01 +-1.768201187E+00 -4.620301683E+00 1.579120000E+00 3.600000000E+01 +-1.795522356E+00 -4.720026387E+00 1.566880000E+00 3.600000000E+01 +-1.825224704E+00 -4.817834719E+00 1.547210000E+00 3.600000000E+01 +-1.856294576E+00 -4.914152117E+00 1.523040000E+00 3.600000000E+01 +-1.888652521E+00 -5.008883777E+00 1.494500000E+00 3.600000000E+01 +-1.922295438E+00 -5.101693707E+00 1.461420000E+00 3.600000000E+01 +-1.957193743E+00 -5.192214314E+00 1.423650000E+00 3.600000000E+01 +-1.992913170E+00 -5.280958250E+00 1.382610000E+00 3.600000000E+01 +-2.029414720E+00 -5.367860099E+00 1.338430000E+00 3.600000000E+01 +-2.066629248E+00 -5.452844903E+00 1.291210000E+00 3.600000000E+01 +-2.104547840E+00 -5.535720775E+00 1.240850000E+00 3.600000000E+01 +-2.143142428E+00 -5.616220110E+00 1.187270000E+00 3.600000000E+01 +-2.182278583E+00 -5.694578976E+00 1.131000000E+00 3.600000000E+01 +-2.221912122E+00 -5.770654028E+00 1.072020000E+00 3.600000000E+01 +-2.262022375E+00 -5.844269558E+00 1.010300000E+00 3.600000000E+01 +-2.302583489E+00 -5.915171932E+00 9.457800000E-01 3.600000000E+01 +-2.343549765E+00 -5.983117813E+00 8.783800000E-01 3.600000000E+01 +-2.384887952E+00 -6.047761667E+00 8.080400000E-01 3.600000000E+01 +-2.426536865E+00 -6.108762384E+00 7.346800000E-01 3.600000000E+01 +-2.468417619E+00 -6.165667109E+00 6.582400000E-01 3.600000000E+01 +-2.510438121E+00 -6.218075194E+00 5.787300000E-01 3.600000000E+01 +-2.552484914E+00 -6.265496305E+00 4.961700000E-01 3.600000000E+01 +-2.594397518E+00 -6.307504830E+00 4.106700000E-01 3.600000000E+01 +-2.636037510E+00 -6.343678821E+00 3.224100000E-01 3.600000000E+01 +-2.677197324E+00 -6.373521372E+00 2.316100000E-01 3.600000000E+01 +-2.717603020E+00 -6.396116538E+00 1.384300000E-01 3.600000000E+01 +-2.757005128E+00 -6.410974047E+00 4.327000000E-02 3.600000000E+01 +-2.795176493E+00 -6.418151357E+00 -5.326000000E-02 3.600000000E+01 +-2.831906837E+00 -6.417631657E+00 -1.506200000E-01 3.600000000E+01 +-2.867005789E+00 -6.409523851E+00 -2.482300000E-01 3.600000000E+01 +-2.900343344E+00 -6.394091942E+00 -3.455700000E-01 3.600000000E+01 +-2.931802769E+00 -6.371683742E+00 -4.421800000E-01 3.600000000E+01 +-2.961243689E+00 -6.342407396E+00 -5.375700000E-01 3.600000000E+01 +-2.988237130E+00 -6.305543333E+00 -6.310500000E-01 3.600000000E+01 +-3.011965530E+00 -6.259545787E+00 -7.213900000E-01 0.000000000E+00 7 AAE23_SC +-1.242532087E+00 -6.834469578E+00 7.213900000E-01 3.600000000E+01 +-1.288772772E+00 -6.857744235E+00 6.310500000E-01 3.600000000E+01 +-1.332275471E+00 -6.871687384E+00 5.375700000E-01 3.600000000E+01 +-1.373307179E+00 -6.878075177E+00 4.421800000E-01 3.600000000E+01 +-1.411930038E+00 -6.877706763E+00 3.455700000E-01 3.600000000E+01 +-1.447968339E+00 -6.870602811E+00 2.482300000E-01 3.600000000E+01 +-1.481126413E+00 -6.856523782E+00 1.506200000E-01 3.600000000E+01 +-1.511150557E+00 -6.835359517E+00 5.326000000E-02 3.600000000E+01 +-1.537818738E+00 -6.807109385E+00 -4.327000000E-02 3.600000000E+01 +-1.560949434E+00 -6.771938161E+00 -1.384300000E-01 3.600000000E+01 +-1.580365487E+00 -6.729902542E+00 -2.316100000E-01 3.600000000E+01 +-1.596127454E+00 -6.681565673E+00 -3.224100000E-01 3.600000000E+01 +-1.608543085E+00 -6.627830985E+00 -4.106700000E-01 3.600000000E+01 +-1.617764077E+00 -6.569204236E+00 -4.961600000E-01 3.600000000E+01 +-1.623903127E+00 -6.506125763E+00 -5.787300000E-01 3.600000000E+01 +-1.627100871E+00 -6.439031482E+00 -6.582400000E-01 3.600000000E+01 +-1.627528090E+00 -6.368366851E+00 -7.346800000E-01 3.600000000E+01 +-1.625373201E+00 -6.294553059E+00 -8.080400000E-01 3.600000000E+01 +-1.620815771E+00 -6.217955422E+00 -8.783800000E-01 3.600000000E+01 +-1.614022852E+00 -6.138905442E+00 -9.457800000E-01 3.600000000E+01 +-1.605154858E+00 -6.057692715E+00 -1.010300000E+00 3.600000000E+01 +-1.594337633E+00 -5.974569362E+00 -1.072020000E+00 3.600000000E+01 +-1.581694047E+00 -5.889723538E+00 -1.131000000E+00 3.600000000E+01 +-1.567286674E+00 -5.803324313E+00 -1.187270000E+00 3.600000000E+01 +-1.551195722E+00 -5.715516486E+00 -1.240850000E+00 3.600000000E+01 +-1.533159398E+00 -5.626184017E+00 -1.291210000E+00 3.600000000E+01 +-1.513313088E+00 -5.535548878E+00 -1.338430000E+00 3.600000000E+01 +-1.491763483E+00 -5.443787468E+00 -1.382610000E+00 3.600000000E+01 +-1.468512101E+00 -5.350999776E+00 -1.423650000E+00 3.600000000E+01 +-1.443525887E+00 -5.257248312E+00 -1.461420000E+00 3.600000000E+01 +-1.416194543E+00 -5.162386323E+00 -1.494500000E+00 3.600000000E+01 +-1.386690999E+00 -5.066737222E+00 -1.523040000E+00 3.600000000E+01 +-1.355205058E+00 -4.970550155E+00 -1.547210000E+00 3.600000000E+01 +-1.321744877E+00 -4.873967016E+00 -1.566880000E+00 3.600000000E+01 +-1.285237889E+00 -4.777222115E+00 -1.579120000E+00 3.600000000E+01 +-1.246291681E+00 -4.680942299E+00 -1.584800000E+00 3.600000000E+01 +-1.205301911E+00 -4.585365590E+00 -1.584630000E+00 3.600000000E+01 +-1.161677065E+00 -4.491187048E+00 -1.576410000E+00 3.600000000E+01 +-1.115321534E+00 -4.399882294E+00 -1.558340000E+00 3.600000000E+01 +-1.067527513E+00 -4.310795636E+00 -1.534290000E+00 3.600000000E+01 +-1.017564454E+00 -4.226004402E+00 -1.500280000E+00 3.600000000E+01 +-9.660720879E-01 -4.148779258E+00 -1.454390000E+00 3.600000000E+01 +-9.136716672E-01 -4.076036417E+00 -1.401440000E+00 3.600000000E+01 +-8.611493888E-01 -4.012920536E+00 -1.337940000E+00 3.600000000E+01 +-8.085911256E-01 -3.952967566E+00 -1.270980000E+00 3.600000000E+01 +-7.571868444E-01 -3.903148243E+00 -1.196060000E+00 3.600000000E+01 +-7.065053826E-01 -3.859700682E+00 -1.116160000E+00 3.600000000E+01 +-6.563051219E-01 -3.818568081E+00 -1.034990000E+00 3.600000000E+01 +-6.088954855E-01 -3.790760649E+00 -9.465600000E-01 3.600000000E+01 +-5.614777590E-01 -3.762947339E+00 -8.581200000E-01 3.600000000E+01 +-5.169011737E-01 -3.744936025E+00 -7.663000000E-01 3.600000000E+01 +-4.747098830E-01 -3.735159446E+00 -6.716100000E-01 3.600000000E+01 +-4.335949306E-01 -3.728426877E+00 -5.764100000E-01 3.600000000E+01 +-3.967859600E-01 -3.733648312E+00 -4.791500000E-01 3.600000000E+01 +-3.615160506E-01 -3.742484798E+00 -3.818700000E-01 3.600000000E+01 +-3.317016862E-01 -3.764159938E+00 -2.844900000E-01 3.600000000E+01 +-3.054955997E-01 -3.793203146E+00 -1.882300000E-01 3.600000000E+01 +-2.827188533E-01 -3.829027071E+00 -9.328000000E-02 3.600000000E+01 +-2.650379126E-01 -3.874152704E+00 -1.130000000E-03 3.600000000E+01 +-2.524214154E-01 -3.927568404E+00 8.727000000E-02 3.600000000E+01 +-2.439589473E-01 -3.987277763E+00 1.720200000E-01 3.600000000E+01 +-2.395090498E-01 -4.052658856E+00 2.528300000E-01 3.600000000E+01 +-2.387184021E-01 -4.122836948E+00 3.296700000E-01 3.600000000E+01 +-2.412050530E-01 -4.197027747E+00 4.026200000E-01 3.600000000E+01 +-2.465620868E-01 -4.274515347E+00 4.719100000E-01 3.600000000E+01 +-2.543958615E-01 -4.354667652E+00 5.378800000E-01 3.600000000E+01 +-2.643179192E-01 -4.436930497E+00 6.009100000E-01 3.600000000E+01 +-2.759655902E-01 -4.520867336E+00 6.614000000E-01 3.600000000E+01 +-2.890453514E-01 -4.606116584E+00 7.197400000E-01 3.600000000E+01 +-3.025730433E-01 -4.691753077E+00 7.773900000E-01 3.600000000E+01 +-3.166928358E-01 -4.777918641E+00 8.341100000E-01 3.600000000E+01 +-3.315746224E-01 -4.864736712E+00 8.896400000E-01 3.600000000E+01 +-3.470558408E-01 -4.952039738E+00 9.442200000E-01 3.600000000E+01 +-3.631813663E-01 -5.039885045E+00 9.977300000E-01 3.600000000E+01 +-3.801269704E-01 -5.128387977E+00 1.049910000E+00 3.600000000E+01 +-3.981956549E-01 -5.217743957E+00 1.100210000E+00 3.600000000E+01 +-4.171807409E-01 -5.307778102E+00 1.148930000E+00 3.600000000E+01 +-4.366894756E-01 -5.398180340E+00 1.196770000E+00 3.600000000E+01 +-4.573543456E-01 -5.489373116E+00 1.242550000E+00 3.600000000E+01 +-4.801983127E-01 -5.581938968E+00 1.284380000E+00 3.600000000E+01 +-5.058272507E-01 -5.675996710E+00 1.320860000E+00 3.600000000E+01 +-5.344601582E-01 -5.771346994E+00 1.351240000E+00 3.600000000E+01 +-5.667931592E-01 -5.867729223E+00 1.373500000E+00 3.600000000E+01 +-6.027332713E-01 -5.964420725E+00 1.387100000E+00 3.600000000E+01 +-6.425476443E-01 -6.060441330E+00 1.390330000E+00 3.600000000E+01 +-6.865479788E-01 -6.154188122E+00 1.380740000E+00 3.600000000E+01 +-7.335641065E-01 -6.244736759E+00 1.360180000E+00 3.600000000E+01 +-7.828735950E-01 -6.331142101E+00 1.329530000E+00 3.600000000E+01 +-8.338254353E-01 -6.412683948E+00 1.289570000E+00 3.600000000E+01 +-8.858378292E-01 -6.488853075E+00 1.241260000E+00 3.600000000E+01 +-9.384004018E-01 -6.559365197E+00 1.185540000E+00 3.600000000E+01 +-9.910304339E-01 -6.621805365E+00 1.121050000E+00 3.600000000E+01 +-1.043089691E+00 -6.676031251E+00 1.049200000E+00 3.600000000E+01 +-1.094467469E+00 -6.724236790E+00 9.726500000E-01 3.600000000E+01 +-1.144978712E+00 -6.766880843E+00 8.923100000E-01 3.600000000E+01 +-1.194421861E+00 -6.803730445E+00 8.084600000E-01 3.600000000E+01 +-1.242532087E+00 -6.834469578E+00 7.213900000E-01 0.000000000E+00 7 AAE23_SC +4.511982196E-01 -7.005257467E+00 7.060900000E-01 3.600000000E+01 +4.858537399E-01 -7.027420161E+00 6.071600000E-01 3.600000000E+01 +5.209924994E-01 -7.046079788E+00 5.077700000E-01 3.600000000E+01 +5.567701194E-01 -7.060208592E+00 4.077700000E-01 3.600000000E+01 +5.932358559E-01 -7.068275144E+00 3.074100000E-01 3.600000000E+01 +6.299010258E-01 -7.074404501E+00 2.069400000E-01 3.600000000E+01 +6.672270258E-01 -7.073107035E+00 1.065300000E-01 3.600000000E+01 +7.046567006E-01 -7.070250963E+00 6.240000000E-03 3.600000000E+01 +7.425139788E-01 -7.060310566E+00 -9.349000000E-02 3.600000000E+01 +7.804377122E-01 -7.048232932E+00 -1.928800000E-01 3.600000000E+01 +8.185927377E-01 -7.029089995E+00 -2.911500000E-01 3.600000000E+01 +8.567498662E-01 -7.008622938E+00 -3.891000000E-01 3.600000000E+01 +8.949166208E-01 -6.981857300E+00 -4.855600000E-01 3.600000000E+01 +9.330864118E-01 -6.954891686E+00 -5.819600000E-01 3.600000000E+01 +9.710561993E-01 -6.920284155E+00 -6.759700000E-01 3.600000000E+01 +1.009039955E+00 -6.885678835E+00 -7.699800000E-01 3.600000000E+01 +1.046388701E+00 -6.841386759E+00 -8.599400000E-01 3.600000000E+01 +1.083573973E+00 -6.794555908E+00 -9.488300000E-01 3.600000000E+01 +1.120312005E+00 -6.743587791E+00 -1.035480000E+00 3.600000000E+01 +1.156581498E+00 -6.688436077E+00 -1.119870000E+00 3.600000000E+01 +1.192582713E+00 -6.631588096E+00 -1.203110000E+00 3.600000000E+01 +1.227312182E+00 -6.566677877E+00 -1.280960000E+00 3.600000000E+01 +1.262039439E+00 -6.501781627E+00 -1.358800000E+00 3.600000000E+01 +1.294447499E+00 -6.426803004E+00 -1.427910000E+00 3.600000000E+01 +1.326466688E+00 -6.350166287E+00 -1.495580000E+00 3.600000000E+01 +1.356975050E+00 -6.268830090E+00 -1.558010000E+00 3.600000000E+01 +1.386490140E+00 -6.184408458E+00 -1.617000000E+00 3.600000000E+01 +1.414399774E+00 -6.096382037E+00 -1.670760000E+00 3.600000000E+01 +1.440016501E+00 -6.003260218E+00 -1.717120000E+00 3.600000000E+01 +1.464298327E+00 -5.908079894E+00 -1.759350000E+00 3.600000000E+01 +1.485900047E+00 -5.808802409E+00 -1.793360000E+00 3.600000000E+01 +1.506026166E+00 -5.708038351E+00 -1.823030000E+00 3.600000000E+01 +1.523723583E+00 -5.604799134E+00 -1.845540000E+00 3.600000000E+01 +1.538896973E+00 -5.500093429E+00 -1.860860000E+00 3.600000000E+01 +1.551930739E+00 -5.394161098E+00 -1.870100000E+00 3.600000000E+01 +1.560858666E+00 -5.287528352E+00 -1.868120000E+00 3.600000000E+01 +1.567519089E+00 -5.181109206E+00 -1.860050000E+00 3.600000000E+01 +1.570782484E+00 -5.075390566E+00 -1.843010000E+00 3.600000000E+01 +1.569214921E+00 -4.972464905E+00 -1.813600000E+00 3.600000000E+01 +1.563817410E+00 -4.873063504E+00 -1.774710000E+00 3.600000000E+01 +1.554020085E+00 -4.778885906E+00 -1.725230000E+00 3.600000000E+01 +1.539541915E+00 -4.691842067E+00 -1.664860000E+00 3.600000000E+01 +1.520624827E+00 -4.613387826E+00 -1.594630000E+00 3.600000000E+01 +1.497740371E+00 -4.544478452E+00 -1.516010000E+00 3.600000000E+01 +1.471400745E+00 -4.485631782E+00 -1.430550000E+00 3.600000000E+01 +1.442167577E+00 -4.437008360E+00 -1.339760000E+00 3.600000000E+01 +1.410605724E+00 -4.398160711E+00 -1.245100000E+00 3.600000000E+01 +1.377289090E+00 -4.368177442E+00 -1.147850000E+00 3.600000000E+01 +1.342590711E+00 -4.346466149E+00 -1.048900000E+00 3.600000000E+01 +1.306805630E+00 -4.332565258E+00 -9.489300000E-01 3.600000000E+01 +1.270171498E+00 -4.326104334E+00 -8.485000000E-01 3.600000000E+01 +1.232909026E+00 -4.326774693E+00 -7.481100000E-01 3.600000000E+01 +1.195369863E+00 -4.331045266E+00 -6.478600000E-01 3.600000000E+01 +1.157730627E+00 -4.337032517E+00 -5.477400000E-01 3.600000000E+01 +1.119855455E+00 -4.347492702E+00 -4.480900000E-01 3.600000000E+01 +1.081778401E+00 -4.363476458E+00 -3.492500000E-01 3.600000000E+01 +1.043604074E+00 -4.384549325E+00 -2.514000000E-01 3.600000000E+01 +1.005432652E+00 -4.405694243E+00 -1.535700000E-01 3.600000000E+01 +9.672546824E-01 -4.429773401E+00 -5.642000000E-02 3.600000000E+01 +9.290982746E-01 -4.457965360E+00 3.963000000E-02 3.600000000E+01 +8.909886090E-01 -4.488348281E+00 1.350400000E-01 3.600000000E+01 +8.528582291E-01 -4.517460741E+00 2.308300000E-01 3.600000000E+01 +8.146989799E-01 -4.545444632E+00 3.269400000E-01 3.600000000E+01 +7.767234445E-01 -4.579772044E+00 4.210300000E-01 3.600000000E+01 +7.389501013E-01 -4.618699056E+00 5.134100000E-01 3.600000000E+01 +7.013680394E-01 -4.660441296E+00 6.046400000E-01 3.600000000E+01 +6.639217765E-01 -4.704173828E+00 6.949900000E-01 3.600000000E+01 +6.265683453E-01 -4.749037899E+00 7.848200000E-01 3.600000000E+01 +5.894166928E-01 -4.796289308E+00 8.735000000E-01 3.600000000E+01 +5.526844088E-01 -4.847537546E+00 9.600900000E-01 3.600000000E+01 +5.164947983E-01 -4.903224533E+00 1.044140000E+00 3.600000000E+01 +4.808400960E-01 -4.962676076E+00 1.125800000E+00 3.600000000E+01 +4.461964522E-01 -5.027993644E+00 1.203290000E+00 3.600000000E+01 +4.132929600E-01 -5.101218543E+00 1.274170000E+00 3.600000000E+01 +3.823124825E-01 -5.181241420E+00 1.338190000E+00 3.600000000E+01 +3.534766856E-01 -5.267295553E+00 1.394960000E+00 3.600000000E+01 +3.267787583E-01 -5.358248708E+00 1.444770000E+00 3.600000000E+01 +3.022955674E-01 -5.453253954E+00 1.487590000E+00 3.600000000E+01 +2.802890347E-01 -5.551923223E+00 1.522840000E+00 3.600000000E+01 +2.608521427E-01 -5.653533843E+00 1.550420000E+00 3.600000000E+01 +2.440793267E-01 -5.757399169E+00 1.570270000E+00 3.600000000E+01 +2.301341034E-01 -5.862893612E+00 1.582110000E+00 3.600000000E+01 +2.192388328E-01 -5.969336467E+00 1.585460000E+00 3.600000000E+01 +2.117151693E-01 -6.075962532E+00 1.579670000E+00 3.600000000E+01 +2.079584030E-01 -6.181767691E+00 1.563950000E+00 3.600000000E+01 +2.083279275E-01 -6.285477254E+00 1.537570000E+00 3.600000000E+01 +2.131325133E-01 -6.385593736E+00 1.500110000E+00 3.600000000E+01 +2.224986525E-01 -6.480504872E+00 1.451630000E+00 3.600000000E+01 +2.362755587E-01 -6.568812210E+00 1.392860000E+00 3.600000000E+01 +2.540857913E-01 -6.649553911E+00 1.325020000E+00 3.600000000E+01 +2.754288438E-01 -6.722364333E+00 1.249630000E+00 3.600000000E+01 +2.996944176E-01 -6.787390227E+00 1.168230000E+00 3.600000000E+01 +3.263624649E-01 -6.845157759E+00 1.082140000E+00 3.600000000E+01 +3.552876872E-01 -6.895092657E+00 9.918700000E-01 3.600000000E+01 +3.861348522E-01 -6.937141825E+00 8.983500000E-01 3.600000000E+01 +4.181749998E-01 -6.973602460E+00 8.029600000E-01 3.600000000E+01 +4.511982196E-01 -7.005257467E+00 7.060900000E-01 0.000000000E+00 6 AAE14_SC +2.524573923022E+00 -6.374473400221E+00 1.744954334000E-02 1.080000000000E+02 +2.527636470621E+00 -6.371679140144E+00 -7.150080869000E-02 1.080000000000E+02 +2.529457126529E+00 -6.364132787753E+00 -1.602254120000E-01 1.080000000000E+02 +2.531476567031E+00 -6.351301888405E+00 -2.484589536000E-01 1.080000000000E+02 +2.534529976955E+00 -6.333032622321E+00 -3.354886308000E-01 1.080000000000E+02 +2.539334233008E+00 -6.309154563156E+00 -4.212413326000E-01 1.080000000000E+02 +2.546655029055E+00 -6.279677519562E+00 -5.049593618000E-01 1.080000000000E+02 +2.556671240163E+00 -6.244808192783E+00 -5.863142345000E-01 1.080000000000E+02 +2.568823274890E+00 -6.204995672078E+00 -6.651770142000E-01 1.080000000000E+02 +2.582270190950E+00 -6.160885657725E+00 -7.412825815000E-01 1.080000000000E+02 +2.597302242307E+00 -6.112547792896E+00 -8.145657329000E-01 1.080000000000E+02 +2.613262309483E+00 -6.060402229368E+00 -8.850071242000E-01 1.080000000000E+02 +2.626681743508E+00 -6.005196128291E+00 -9.537419589000E-01 1.080000000000E+02 +2.632149224093E+00 -5.948143892711E+00 -1.021917209000E+00 1.080000000000E+02 +2.626625573724E+00 -5.890198983843E+00 -1.089263674000E+00 1.080000000000E+02 +2.609413235600E+00 -5.832083627858E+00 -1.154539058000E+00 1.080000000000E+02 +2.584540918328E+00 -5.772795695640E+00 -1.216246575000E+00 1.080000000000E+02 +2.558713223932E+00 -5.709527505501E+00 -1.273441742000E+00 1.080000000000E+02 +2.532016132832E+00 -5.642164515971E+00 -1.325285698000E+00 1.080000000000E+02 +2.502294861354E+00 -5.571624012994E+00 -1.370749447000E+00 1.080000000000E+02 +2.469029604620E+00 -5.498110157456E+00 -1.408608053000E+00 1.080000000000E+02 +2.432684312322E+00 -5.422097091171E+00 -1.437348696000E+00 1.080000000000E+02 +2.396038740132E+00 -5.342936518550E+00 -1.455639493000E+00 1.080000000000E+02 +2.362819107477E+00 -5.260535705749E+00 -1.462072215000E+00 1.080000000000E+02 +2.334458737968E+00 -5.176322155363E+00 -1.455667884000E+00 1.080000000000E+02 +2.311905149954E+00 -5.092464647788E+00 -1.435958561000E+00 1.080000000000E+02 +2.295864597401E+00 -5.011219638329E+00 -1.403042952000E+00 1.080000000000E+02 +2.287104248699E+00 -4.934990836852E+00 -1.357785149000E+00 1.080000000000E+02 +2.286041695595E+00 -4.865701587576E+00 -1.301808004000E+00 1.080000000000E+02 +2.292891734957E+00 -4.804609206019E+00 -1.237341473000E+00 1.080000000000E+02 +2.307344735227E+00 -4.752126740626E+00 -1.166812923000E+00 1.080000000000E+02 +2.327420291807E+00 -4.707952293120E+00 -1.092107862000E+00 1.080000000000E+02 +2.346602168739E+00 -4.671742553356E+00 -1.013024536000E+00 1.080000000000E+02 +2.354875759785E+00 -4.645490556960E+00 -9.282726209000E-01 1.080000000000E+02 +2.354597294811E+00 -4.632088463213E+00 -8.402099046000E-01 1.080000000000E+02 +2.347235809569E+00 -4.633017751881E+00 -7.514880132000E-01 1.080000000000E+02 +2.333026116451E+00 -4.648063539816E+00 -6.647899090000E-01 1.080000000000E+02 +2.309749021636E+00 -4.675459719151E+00 -5.833000314000E-01 1.080000000000E+02 +2.274639592496E+00 -4.711864112237E+00 -5.099892243000E-01 1.080000000000E+02 +2.228810449623E+00 -4.753041538935E+00 -4.456338674000E-01 1.080000000000E+02 +2.176361288659E+00 -4.795661529844E+00 -3.875539046000E-01 1.080000000000E+02 +2.120837607522E+00 -4.837457807332E+00 -3.318667032000E-01 1.080000000000E+02 +2.067749245880E+00 -4.877180240546E+00 -2.723890661000E-01 1.080000000000E+02 +2.011738541335E+00 -4.912900138354E+00 -2.130101728000E-01 1.080000000000E+02 +1.957366880675E+00 -4.943562938783E+00 -1.494783330000E-01 1.080000000000E+02 +1.900564105412E+00 -4.967862884673E+00 -8.530081591000E-02 1.080000000000E+02 +1.843593075239E+00 -4.981656319958E+00 -1.819661694000E-02 1.080000000000E+02 +1.783152460726E+00 -4.984910298015E+00 4.718627597000E-02 1.080000000000E+02 +1.720090750533E+00 -4.981853868869E+00 1.100117670000E-01 1.080000000000E+02 +1.653103108124E+00 -4.981647021979E+00 1.687606404000E-01 1.080000000000E+02 +1.586170659884E+00 -4.982087341744E+00 2.275175217000E-01 1.080000000000E+02 +1.521095093000E+00 -4.980226616451E+00 2.882948801000E-01 1.080000000000E+02 +1.461735861681E+00 -4.970651942819E+00 3.540587787000E-01 1.080000000000E+02 +1.413488066939E+00 -4.950124232689E+00 4.260584823000E-01 1.080000000000E+02 +1.380488775562E+00 -4.920395237958E+00 5.032871173000E-01 1.080000000000E+02 +1.363662768892E+00 -4.886145620366E+00 5.837632627000E-01 1.080000000000E+02 +1.361430711430E+00 -4.851295707933E+00 6.657541041000E-01 1.080000000000E+02 +1.371904285523E+00 -4.817792346313E+00 7.475896770000E-01 1.080000000000E+02 +1.394605805416E+00 -4.785446748635E+00 8.274301477000E-01 1.080000000000E+02 +1.426301966512E+00 -4.755294013289E+00 9.050198505000E-01 1.080000000000E+02 +1.460474041922E+00 -4.732106417539E+00 9.840199882000E-01 1.080000000000E+02 +1.493076627810E+00 -4.721889982518E+00 1.066259509000E+00 1.080000000000E+02 +1.525193128726E+00 -4.727391748530E+00 1.149164457000E+00 1.080000000000E+02 +1.558828543214E+00 -4.749002139667E+00 1.228771473000E+00 1.080000000000E+02 +1.594540868563E+00 -4.786047367742E+00 1.301455248000E+00 1.080000000000E+02 +1.631356507283E+00 -4.837086671028E+00 1.364609021000E+00 1.080000000000E+02 +1.666044918758E+00 -4.900657800935E+00 1.416487546000E+00 1.080000000000E+02 +1.695183620047E+00 -4.974673500214E+00 1.456473280000E+00 1.080000000000E+02 +1.716048978204E+00 -5.056500193373E+00 1.484801442000E+00 1.080000000000E+02 +1.728175792893E+00 -5.142936925328E+00 1.502532507000E+00 1.080000000000E+02 +1.735504299255E+00 -5.231283524664E+00 1.511502484000E+00 1.080000000000E+02 +1.742594756935E+00 -5.320128184925E+00 1.512984118000E+00 1.080000000000E+02 +1.753790559379E+00 -5.408247737594E+00 1.507450791000E+00 1.080000000000E+02 +1.772647251286E+00 -5.494384830753E+00 1.494787468000E+00 1.080000000000E+02 +1.797835877038E+00 -5.577494433834E+00 1.474786583000E+00 1.080000000000E+02 +1.827455007426E+00 -5.656964388623E+00 1.447633049000E+00 1.080000000000E+02 +1.861975813837E+00 -5.731797695519E+00 1.413793625000E+00 1.080000000000E+02 +1.901920096679E+00 -5.800878824399E+00 1.374018251000E+00 1.080000000000E+02 +1.947262052195E+00 -5.863168699051E+00 1.329400646000E+00 1.080000000000E+02 +1.998103337427E+00 -5.918130671291E+00 1.280975246000E+00 1.080000000000E+02 +2.054495638026E+00 -5.964713490508E+00 1.230287750000E+00 1.080000000000E+02 +2.115026448313E+00 -6.003882808313E+00 1.177853833000E+00 1.080000000000E+02 +2.176114653742E+00 -6.038438043258E+00 1.123012040000E+00 1.080000000000E+02 +2.235440161775E+00 -6.070464477330E+00 1.064920566000E+00 1.080000000000E+02 +2.289738061916E+00 -6.102716947685E+00 1.002061223000E+00 1.080000000000E+02 +2.334428772604E+00 -6.137732756248E+00 9.334175927000E-01 1.080000000000E+02 +2.369654500489E+00 -6.174243147428E+00 8.601609198000E-01 1.080000000000E+02 +2.398893991360E+00 -6.209572299627E+00 7.837241475000E-01 1.080000000000E+02 +2.423799287766E+00 -6.242515244261E+00 7.047985910000E-01 1.080000000000E+02 +2.445091180381E+00 -6.272576684196E+00 6.236520547000E-01 1.080000000000E+02 +2.463480810749E+00 -6.299158673030E+00 5.407768227000E-01 1.080000000000E+02 +2.479635592564E+00 -6.321957118240E+00 4.560661339000E-01 1.080000000000E+02 +2.493046884239E+00 -6.340908367348E+00 3.701617308000E-01 1.080000000000E+02 +2.503447046937E+00 -6.356099376225E+00 2.829651087000E-01 1.080000000000E+02 +2.511949064160E+00 -6.366888869821E+00 1.949310037000E-01 1.080000000000E+02 +2.519154779354E+00 -6.372951371312E+00 1.063739981000E-01 1.080000000000E+02 +2.524573923022E+00 -6.374473400221E+00 1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +3.364224441548E+00 -5.892434149445E+00 2.786784824000E-03 1.080000000000E+02 +3.374522599253E+00 -5.889483424968E+00 -8.489061568000E-02 1.080000000000E+02 +3.383161394691E+00 -5.882604857303E+00 -1.724869752000E-01 1.080000000000E+02 +3.388623458074E+00 -5.872789523251E+00 -2.600860194000E-01 1.080000000000E+02 +3.388935884253E+00 -5.861244565816E+00 -3.477269332000E-01 1.080000000000E+02 +3.384297792749E+00 -5.847625019888E+00 -4.348356053000E-01 1.080000000000E+02 +3.375019087845E+00 -5.831423704577E+00 -5.212198625000E-01 1.080000000000E+02 +3.359355575259E+00 -5.813624338157E+00 -6.062523787000E-01 1.080000000000E+02 +3.335083356577E+00 -5.795467994512E+00 -6.892798267000E-01 1.080000000000E+02 +3.303456961074E+00 -5.776049607694E+00 -7.694019289000E-01 1.080000000000E+02 +3.263666407930E+00 -5.756052455541E+00 -8.457732406000E-01 1.080000000000E+02 +3.218416469961E+00 -5.733875065647E+00 -9.182365063000E-01 1.080000000000E+02 +3.172388782985E+00 -5.705843210488E+00 -9.881923803000E-01 1.080000000000E+02 +3.126499286797E+00 -5.671539257720E+00 -1.055471471000E+00 1.080000000000E+02 +3.084653421741E+00 -5.628375182978E+00 -1.120196685000E+00 1.080000000000E+02 +3.049834389458E+00 -5.574978299169E+00 -1.181327921000E+00 1.080000000000E+02 +3.021008747960E+00 -5.512739883376E+00 -1.237059622000E+00 1.080000000000E+02 +2.999371742997E+00 -5.441897713006E+00 -1.285194785000E+00 1.080000000000E+02 +2.985488648720E+00 -5.363335362973E+00 -1.323067807000E+00 1.080000000000E+02 +2.977539485865E+00 -5.279057910253E+00 -1.348281183000E+00 1.080000000000E+02 +2.975035917115E+00 -5.191359771099E+00 -1.358569067000E+00 1.080000000000E+02 +2.977927333238E+00 -5.103224667365E+00 -1.353085167000E+00 1.080000000000E+02 +2.987880820369E+00 -5.017774240093E+00 -1.333014261000E+00 1.080000000000E+02 +3.002922733923E+00 -4.936595138123E+00 -1.301720477000E+00 1.080000000000E+02 +3.020848793763E+00 -4.859667323762E+00 -1.262085734000E+00 1.080000000000E+02 +3.036766247186E+00 -4.786241251369E+00 -1.215714425000E+00 1.080000000000E+02 +3.044822331018E+00 -4.716116881608E+00 -1.162638692000E+00 1.080000000000E+02 +3.043970134743E+00 -4.651050573972E+00 -1.102951579000E+00 1.080000000000E+02 +3.030886123337E+00 -4.593551405222E+00 -1.037139043000E+00 1.080000000000E+02 +3.005625941404E+00 -4.546437408595E+00 -9.667867241000E-01 1.080000000000E+02 +2.969813098800E+00 -4.512206507002E+00 -8.936981911000E-01 1.080000000000E+02 +2.926656606582E+00 -4.493582048640E+00 -8.188905247000E-01 1.080000000000E+02 +2.882902962837E+00 -4.492652115980E+00 -7.421450537000E-01 1.080000000000E+02 +2.840257931412E+00 -4.509903743149E+00 -6.667474988000E-01 1.080000000000E+02 +2.792556308336E+00 -4.540499796791E+00 -5.989634359000E-01 1.080000000000E+02 +2.737427627018E+00 -4.576474470029E+00 -5.400717519000E-01 1.080000000000E+02 +2.683066413689E+00 -4.612295056051E+00 -4.803836822000E-01 1.080000000000E+02 +2.624680977472E+00 -4.645128808284E+00 -4.228264178000E-01 1.080000000000E+02 +2.561937567672E+00 -4.672517804066E+00 -3.670458051000E-01 1.080000000000E+02 +2.496641480448E+00 -4.693349578286E+00 -3.112409570000E-01 1.080000000000E+02 +2.431483930488E+00 -4.708687461997E+00 -2.536123470000E-01 1.080000000000E+02 +2.367053333350E+00 -4.721921912587E+00 -1.946452353000E-01 1.080000000000E+02 +2.302185117086E+00 -4.736045942012E+00 -1.364003779000E-01 1.080000000000E+02 +2.236030704860E+00 -4.750567465595E+00 -7.966775233000E-02 1.080000000000E+02 +2.167973901320E+00 -4.763651796193E+00 -2.494784873000E-02 1.080000000000E+02 +2.098549734368E+00 -4.771123974015E+00 2.916971350000E-02 1.080000000000E+02 +2.030132711763E+00 -4.767767744122E+00 8.494149535000E-02 1.080000000000E+02 +1.967082591197E+00 -4.750645775060E+00 1.443669380000E-01 1.080000000000E+02 +1.912730961196E+00 -4.722988513681E+00 2.083126740000E-01 1.080000000000E+02 +1.869856578025E+00 -4.687916483359E+00 2.770763044000E-01 1.080000000000E+02 +1.837942603574E+00 -4.649109965656E+00 3.497702850000E-01 1.080000000000E+02 +1.820946112202E+00 -4.604086045849E+00 4.238156204000E-01 1.080000000000E+02 +1.819237103864E+00 -4.553191932250E+00 4.959805589000E-01 1.080000000000E+02 +1.829588012015E+00 -4.498990588121E+00 5.649597706000E-01 1.080000000000E+02 +1.847791190642E+00 -4.444366827432E+00 6.319745517000E-01 1.080000000000E+02 +1.868191600238E+00 -4.394187850221E+00 7.017224202000E-01 1.080000000000E+02 +1.887539886475E+00 -4.353589440350E+00 7.777589224000E-01 1.080000000000E+02 +1.906502133890E+00 -4.325350292368E+00 8.592609358000E-01 1.080000000000E+02 +1.926802700059E+00 -4.310650528787E+00 9.439925506000E-01 1.080000000000E+02 +1.949940230156E+00 -4.309827313769E+00 1.029225643000E+00 1.080000000000E+02 +1.976702167752E+00 -4.322753173872E+00 1.112414355000E+00 1.080000000000E+02 +2.006469042734E+00 -4.349348496367E+00 1.191204722000E+00 1.080000000000E+02 +2.038495184050E+00 -4.388432868780E+00 1.263647540000E+00 1.080000000000E+02 +2.072775080025E+00 -4.437685177950E+00 1.328492129000E+00 1.080000000000E+02 +2.108745715287E+00 -4.495234590069E+00 1.385061074000E+00 1.080000000000E+02 +2.143383995194E+00 -4.560872065638E+00 1.432913650000E+00 1.080000000000E+02 +2.174907668516E+00 -4.633546111853E+00 1.472011314000E+00 1.080000000000E+02 +2.207262284251E+00 -4.709706287038E+00 1.502926011000E+00 1.080000000000E+02 +2.244618084117E+00 -4.786282563795E+00 1.525941209000E+00 1.080000000000E+02 +2.287729103310E+00 -4.861988673990E+00 1.540955846000E+00 1.080000000000E+02 +2.336166267992E+00 -4.935436463640E+00 1.547836060000E+00 1.080000000000E+02 +2.389315848589E+00 -5.006012378111E+00 1.546702180000E+00 1.080000000000E+02 +2.446522572614E+00 -5.072799584755E+00 1.537810757000E+00 1.080000000000E+02 +2.507810810218E+00 -5.134257648522E+00 1.521653119000E+00 1.080000000000E+02 +2.572451958471E+00 -5.189974292850E+00 1.498846663000E+00 1.080000000000E+02 +2.637802775173E+00 -5.241951715007E+00 1.469852265000E+00 1.080000000000E+02 +2.701760316326E+00 -5.291813004061E+00 1.435050927000E+00 1.080000000000E+02 +2.763215933508E+00 -5.340727020309E+00 1.394624322000E+00 1.080000000000E+02 +2.821002956156E+00 -5.389371051610E+00 1.348880339000E+00 1.080000000000E+02 +2.874891225227E+00 -5.437653449420E+00 1.298134958000E+00 1.080000000000E+02 +2.924582054554E+00 -5.485345211682E+00 1.242822431000E+00 1.080000000000E+02 +2.969174207704E+00 -5.532922299989E+00 1.183240350000E+00 1.080000000000E+02 +3.008102978255E+00 -5.580529225082E+00 1.119713595000E+00 1.080000000000E+02 +3.042972963806E+00 -5.626414643165E+00 1.052910239000E+00 1.080000000000E+02 +3.076424447637E+00 -5.668843360405E+00 9.829305340000E-01 1.080000000000E+02 +3.108541311262E+00 -5.707477537979E+00 9.103747398000E-01 1.080000000000E+02 +3.138997555393E+00 -5.742763388403E+00 8.352590367000E-01 1.080000000000E+02 +3.168369881837E+00 -5.774066820381E+00 7.581530132000E-01 1.080000000000E+02 +3.197330386829E+00 -5.801063047578E+00 6.790841041000E-01 1.080000000000E+02 +3.224807028736E+00 -5.824397364017E+00 5.984352213000E-01 1.080000000000E+02 +3.249564514232E+00 -5.844996428224E+00 5.162774167000E-01 1.080000000000E+02 +3.271796834325E+00 -5.862761314934E+00 4.326343739000E-01 1.080000000000E+02 +3.292472781281E+00 -5.876881049972E+00 3.478877549000E-01 1.080000000000E+02 +3.312645244710E+00 -5.886490734386E+00 2.624374443000E-01 1.080000000000E+02 +3.332782483757E+00 -5.891229711343E+00 1.765219348000E-01 1.080000000000E+02 +3.350721669211E+00 -5.892665053834E+00 9.012406132000E-02 1.080000000000E+02 +3.364224441548E+00 -5.892434149445E+00 2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +3.990498458027E+00 -5.394613283792E+00 3.632685538000E-02 1.080000000000E+02 +3.976436904929E+00 -5.416209970763E+00 -4.805479793000E-02 1.080000000000E+02 +3.960195422827E+00 -5.433635292707E+00 -1.330022602000E-01 1.080000000000E+02 +3.938778728329E+00 -5.449727838524E+00 -2.170477619000E-01 1.080000000000E+02 +3.912522761757E+00 -5.464583254194E+00 -2.999547317000E-01 1.080000000000E+02 +3.880800207445E+00 -5.479119959584E+00 -3.810313384000E-01 1.080000000000E+02 +3.846125639304E+00 -5.491384372507E+00 -4.611599500000E-01 1.080000000000E+02 +3.811968651412E+00 -5.498010697680E+00 -5.422183342000E-01 1.080000000000E+02 +3.779516758103E+00 -5.497405392466E+00 -6.243033587000E-01 1.080000000000E+02 +3.749968923058E+00 -5.487894475219E+00 -7.068846032000E-01 1.080000000000E+02 +3.722284582446E+00 -5.469779540956E+00 -7.885880029000E-01 1.080000000000E+02 +3.696472198677E+00 -5.442282613800E+00 -8.684143517000E-01 1.080000000000E+02 +3.675362828685E+00 -5.402872729855E+00 -9.444199619000E-01 1.080000000000E+02 +3.660009077530E+00 -5.350899765979E+00 -1.014026757000E+00 1.080000000000E+02 +3.650156495143E+00 -5.287159146400E+00 -1.074292285000E+00 1.080000000000E+02 +3.644754862283E+00 -5.213487495506E+00 -1.122466283000E+00 1.080000000000E+02 +3.642926592966E+00 -5.132193722332E+00 -1.156570420000E+00 1.080000000000E+02 +3.644989229112E+00 -5.046041698537E+00 -1.175727956000E+00 1.080000000000E+02 +3.653864868101E+00 -4.958401729875E+00 -1.180212576000E+00 1.080000000000E+02 +3.673685830329E+00 -4.872838038571E+00 -1.172009822000E+00 1.080000000000E+02 +3.700165012591E+00 -4.790328443219E+00 -1.155518699000E+00 1.080000000000E+02 +3.718691183597E+00 -4.706787884567E+00 -1.133893710000E+00 1.080000000000E+02 +3.719843900512E+00 -4.622969503902E+00 -1.106430447000E+00 1.080000000000E+02 +3.706328229789E+00 -4.543643087686E+00 -1.070335916000E+00 1.080000000000E+02 +3.683484840680E+00 -4.473016564020E+00 -1.022604995000E+00 1.080000000000E+02 +3.658374291056E+00 -4.414415454125E+00 -9.616664656000E-01 1.080000000000E+02 +3.627938447026E+00 -4.370642480339E+00 -8.913395217000E-01 1.080000000000E+02 +3.584950014545E+00 -4.339341351235E+00 -8.209661657000E-01 1.080000000000E+02 +3.527325918169E+00 -4.315005008927E+00 -7.587395914000E-01 1.080000000000E+02 +3.456702407898E+00 -4.298483976944E+00 -7.085053980000E-01 1.080000000000E+02 +3.378291133810E+00 -4.294436441713E+00 -6.683070249000E-01 1.080000000000E+02 +3.298847493459E+00 -4.303208438772E+00 -6.309463669000E-01 1.080000000000E+02 +3.222822708014E+00 -4.322866760202E+00 -5.907387262000E-01 1.080000000000E+02 +3.151071295285E+00 -4.351089578136E+00 -5.478583852000E-01 1.080000000000E+02 +3.083158549833E+00 -4.379282735976E+00 -4.991121880000E-01 1.080000000000E+02 +3.016270015567E+00 -4.401564305425E+00 -4.461358974000E-01 1.080000000000E+02 +2.947647189190E+00 -4.414707572242E+00 -3.922509070000E-01 1.080000000000E+02 +2.876456509914E+00 -4.419297056319E+00 -3.403860995000E-01 1.080000000000E+02 +2.802895598747E+00 -4.420216277898E+00 -2.916382842000E-01 1.080000000000E+02 +2.727500863903E+00 -4.425745459669E+00 -2.462074493000E-01 1.080000000000E+02 +2.651880969834E+00 -4.440546606750E+00 -2.031942363000E-01 1.080000000000E+02 +2.578721647908E+00 -4.451048906667E+00 -1.550619236000E-01 1.080000000000E+02 +2.510077378150E+00 -4.451442820084E+00 -9.962429365000E-02 1.080000000000E+02 +2.447994436410E+00 -4.437682281443E+00 -3.845435998000E-02 1.080000000000E+02 +2.392316179501E+00 -4.410899674982E+00 2.448555749000E-02 1.080000000000E+02 +2.344157549192E+00 -4.370604352725E+00 8.649636904000E-02 1.080000000000E+02 +2.305193358861E+00 -4.318520282886E+00 1.460500498000E-01 1.080000000000E+02 +2.275496222516E+00 -4.258634273791E+00 2.036424630000E-01 1.080000000000E+02 +2.253742498782E+00 -4.195191606987E+00 2.609630366000E-01 1.080000000000E+02 +2.240509893472E+00 -4.129764151296E+00 3.185973837000E-01 1.080000000000E+02 +2.236361586845E+00 -4.063208332930E+00 3.764466502000E-01 1.080000000000E+02 +2.240530469743E+00 -3.997101744535E+00 4.346658470000E-01 1.080000000000E+02 +2.247448913156E+00 -3.936977982582E+00 4.988404496000E-01 1.080000000000E+02 +2.257136855641E+00 -3.885495920234E+00 5.697936167000E-01 1.080000000000E+02 +2.271680798791E+00 -3.842745109003E+00 6.456312705000E-01 1.080000000000E+02 +2.291211426028E+00 -3.810130531219E+00 7.252260042000E-01 1.080000000000E+02 +2.315498433141E+00 -3.788694970250E+00 8.072828216000E-01 1.080000000000E+02 +2.344814503404E+00 -3.777840019211E+00 8.897856590000E-01 1.080000000000E+02 +2.379117035044E+00 -3.776734067873E+00 9.710448039000E-01 1.080000000000E+02 +2.417162604214E+00 -3.786084293031E+00 1.050138721000E+00 1.080000000000E+02 +2.458772131860E+00 -3.804606922894E+00 1.125601149000E+00 1.080000000000E+02 +2.502299402851E+00 -3.833276121914E+00 1.196814028000E+00 1.080000000000E+02 +2.546645729166E+00 -3.871700250138E+00 1.262691804000E+00 1.080000000000E+02 +2.595311568437E+00 -3.914541287365E+00 1.322504398000E+00 1.080000000000E+02 +2.651065086616E+00 -3.957686593331E+00 1.375655668000E+00 1.080000000000E+02 +2.711435023775E+00 -4.002617530385E+00 1.421583532000E+00 1.080000000000E+02 +2.773876997409E+00 -4.051666732179E+00 1.460188986000E+00 1.080000000000E+02 +2.836064317732E+00 -4.105980273278E+00 1.491069996000E+00 1.080000000000E+02 +2.895823525591E+00 -4.166693112328E+00 1.513978101000E+00 1.080000000000E+02 +2.953321748408E+00 -4.231926095795E+00 1.528680731000E+00 1.080000000000E+02 +3.009751947244E+00 -4.299533575962E+00 1.535219663000E+00 1.080000000000E+02 +3.065067339751E+00 -4.368146723075E+00 1.533750385000E+00 1.080000000000E+02 +3.119458612663E+00 -4.436999504379E+00 1.524583142000E+00 1.080000000000E+02 +3.173409555846E+00 -4.504947900280E+00 1.508093490000E+00 1.080000000000E+02 +3.227272285562E+00 -4.570667328183E+00 1.484797470000E+00 1.080000000000E+02 +3.281451333188E+00 -4.633668123108E+00 1.455093589000E+00 1.080000000000E+02 +3.336043409430E+00 -4.693227772521E+00 1.419493916000E+00 1.080000000000E+02 +3.390880835551E+00 -4.748858782345E+00 1.378577601000E+00 1.080000000000E+02 +3.446097548083E+00 -4.800247879225E+00 1.332770951000E+00 1.080000000000E+02 +3.501346193190E+00 -4.847314274311E+00 1.282612075000E+00 1.080000000000E+02 +3.556291278266E+00 -4.890160785802E+00 1.228575236000E+00 1.080000000000E+02 +3.610380555620E+00 -4.929420360228E+00 1.170998922000E+00 1.080000000000E+02 +3.662988291603E+00 -4.965815394542E+00 1.110182121000E+00 1.080000000000E+02 +3.713364062505E+00 -5.000223884601E+00 1.046417130000E+00 1.080000000000E+02 +3.760685695949E+00 -5.033617665644E+00 9.799657947000E-01 1.080000000000E+02 +3.804299909686E+00 -5.066984232420E+00 9.108702606000E-01 1.080000000000E+02 +3.843514568928E+00 -5.100901131482E+00 8.394336353000E-01 1.080000000000E+02 +3.878997907702E+00 -5.134286918507E+00 7.659096737000E-01 1.080000000000E+02 +3.911666450335E+00 -5.165910798508E+00 6.903510399000E-01 1.080000000000E+02 +3.940859795922E+00 -5.196318972570E+00 6.127886991000E-01 1.080000000000E+02 +3.965537119594E+00 -5.226129273140E+00 5.335701480000E-01 1.080000000000E+02 +3.985036722224E+00 -5.255666836810E+00 4.527156872000E-01 1.080000000000E+02 +3.998617076184E+00 -5.285017297438E+00 3.706549346000E-01 1.080000000000E+02 +4.005060653856E+00 -5.314740211388E+00 2.879184587000E-01 1.080000000000E+02 +4.005448376624E+00 -5.343421443899E+00 2.044325232000E-01 1.080000000000E+02 +3.999949826089E+00 -5.370599407687E+00 1.206362437000E-01 1.080000000000E+02 +3.990498458027E+00 -5.394613283792E+00 3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +4.393238254074E+00 -4.996298719096E+00 3.187537464000E-02 1.080000000000E+02 +4.376527201132E+00 -5.035570029173E+00 -4.635841915000E-02 1.080000000000E+02 +4.358971362443E+00 -5.068000796406E+00 -1.274648788000E-01 1.080000000000E+02 +4.343096014810E+00 -5.090809231908E+00 -2.120822207000E-01 1.080000000000E+02 +4.331467752619E+00 -5.101409255628E+00 -2.997983967000E-01 1.080000000000E+02 +4.324947693990E+00 -5.099182629720E+00 -3.886351210000E-01 1.080000000000E+02 +4.324354620912E+00 -5.083831156816E+00 -4.764366174000E-01 1.080000000000E+02 +4.330649827105E+00 -5.055083938088E+00 -5.605003417000E-01 1.080000000000E+02 +4.344527527732E+00 -5.012983928624E+00 -6.378051764000E-01 1.080000000000E+02 +4.364118715345E+00 -4.959409828622E+00 -7.062104980000E-01 1.080000000000E+02 +4.386897215505E+00 -4.896011499897E+00 -7.645271884000E-01 1.080000000000E+02 +4.411227759808E+00 -4.823831316600E+00 -8.108473046000E-01 1.080000000000E+02 +4.435825905691E+00 -4.744540101182E+00 -8.432354714000E-01 1.080000000000E+02 +4.460026367363E+00 -4.660632686049E+00 -8.607369806000E-01 1.080000000000E+02 +4.483697054610E+00 -4.574765370880E+00 -8.640060786000E-01 1.080000000000E+02 +4.504253239418E+00 -4.488432567268E+00 -8.562220560000E-01 1.080000000000E+02 +4.512242080191E+00 -4.400681057096E+00 -8.427262700000E-01 1.080000000000E+02 +4.503260874752E+00 -4.313983252626E+00 -8.243174216000E-01 1.080000000000E+02 +4.479598319356E+00 -4.231266250108E+00 -8.012208021000E-01 1.080000000000E+02 +4.442266678143E+00 -4.153952678121E+00 -7.773689488000E-01 1.080000000000E+02 +4.391865979598E+00 -4.083094252289E+00 -7.578816060000E-01 1.080000000000E+02 +4.328941472715E+00 -4.021247840428E+00 -7.452820520000E-01 1.080000000000E+02 +4.255046729248E+00 -3.972274189887E+00 -7.366388673000E-01 1.080000000000E+02 +4.173753050571E+00 -3.937120201474E+00 -7.270540685000E-01 1.080000000000E+02 +4.087946712368E+00 -3.916717155033E+00 -7.142960837000E-01 1.080000000000E+02 +4.000549158092E+00 -3.910280390911E+00 -6.982493624000E-01 1.080000000000E+02 +3.913643527472E+00 -3.917579444805E+00 -6.800217467000E-01 1.080000000000E+02 +3.828193335690E+00 -3.934331064882E+00 -6.610368381000E-01 1.080000000000E+02 +3.743850945276E+00 -3.956000235569E+00 -6.421364412000E-01 1.080000000000E+02 +3.659751802517E+00 -3.978411382498E+00 -6.230907784000E-01 1.080000000000E+02 +3.575595911030E+00 -3.999344956166E+00 -6.026804297000E-01 1.080000000000E+02 +3.491492182030E+00 -4.015833866428E+00 -5.783904634000E-01 1.080000000000E+02 +3.408961952052E+00 -4.030090606570E+00 -5.479092097000E-01 1.080000000000E+02 +3.329272670929E+00 -4.042259568076E+00 -5.099632237000E-01 1.080000000000E+02 +3.253242726973E+00 -4.062070528246E+00 -4.679474510000E-01 1.080000000000E+02 +3.178468827775E+00 -4.079208320068E+00 -4.226801226000E-01 1.080000000000E+02 +3.103278989969E+00 -4.087743073311E+00 -3.756353333000E-01 1.080000000000E+02 +3.027933385480E+00 -4.082614989251E+00 -3.283193574000E-01 1.080000000000E+02 +2.954707412779E+00 -4.061651842830E+00 -2.820781068000E-01 1.080000000000E+02 +2.887200141823E+00 -4.024078954765E+00 -2.376983871000E-01 1.080000000000E+02 +2.828337303757E+00 -3.972205307031E+00 -1.954128437000E-01 1.080000000000E+02 +2.780932994053E+00 -3.907915847207E+00 -1.560456650000E-01 1.080000000000E+02 +2.747785175512E+00 -3.832511761839E+00 -1.219181286000E-01 1.080000000000E+02 +2.727334273770E+00 -3.750680639842E+00 -9.346268448000E-02 1.080000000000E+02 +2.713768574094E+00 -3.666815931601E+00 -6.642283384000E-02 1.080000000000E+02 +2.702772371617E+00 -3.583971510464E+00 -3.558837129000E-02 1.080000000000E+02 +2.692291579995E+00 -3.504678925868E+00 3.754172340000E-03 1.080000000000E+02 +2.682594064937E+00 -3.431676740557E+00 5.388091285000E-02 1.080000000000E+02 +2.675622363030E+00 -3.365907443402E+00 1.135748529000E-01 1.080000000000E+02 +2.672756230258E+00 -3.307428820615E+00 1.807565333000E-01 1.080000000000E+02 +2.674090226942E+00 -3.257094576724E+00 2.542191153000E-01 1.080000000000E+02 +2.679449299154E+00 -3.215627927043E+00 3.329023539000E-01 1.080000000000E+02 +2.688707320921E+00 -3.183385700073E+00 4.155171011000E-01 1.080000000000E+02 +2.701774123299E+00 -3.160394099025E+00 5.006187195000E-01 1.080000000000E+02 +2.718453785597E+00 -3.146693271695E+00 5.870384289000E-01 1.080000000000E+02 +2.738482710414E+00 -3.142315967007E+00 6.737108263000E-01 1.080000000000E+02 +2.761766749162E+00 -3.146930528028E+00 7.596450919000E-01 1.080000000000E+02 +2.788799575608E+00 -3.159108219915E+00 8.436327263000E-01 1.080000000000E+02 +2.820807935079E+00 -3.176732632002E+00 9.249046690000E-01 1.080000000000E+02 +2.858263522316E+00 -3.198941473062E+00 1.002637062000E+00 1.080000000000E+02 +2.900658095863E+00 -3.226177986204E+00 1.076114245000E+00 1.080000000000E+02 +2.947823745829E+00 -3.258156754120E+00 1.144593485000E+00 1.080000000000E+02 +2.999638749570E+00 -3.294397000299E+00 1.207380380000E+00 1.080000000000E+02 +3.054836334607E+00 -3.335516660913E+00 1.263842748000E+00 1.080000000000E+02 +3.111514029475E+00 -3.382949641299E+00 1.313751841000E+00 1.080000000000E+02 +3.169043371250E+00 -3.435779986137E+00 1.356669215000E+00 1.080000000000E+02 +3.228730198483E+00 -3.491412081747E+00 1.392276244000E+00 1.080000000000E+02 +3.292418860622E+00 -3.547293432791E+00 1.420151472000E+00 1.080000000000E+02 +3.360738556697E+00 -3.600976199260E+00 1.439465232000E+00 1.080000000000E+02 +3.433076191772E+00 -3.652082033241E+00 1.449884186000E+00 1.080000000000E+02 +3.507619522681E+00 -3.700882995263E+00 1.451432017000E+00 1.080000000000E+02 +3.583971663384E+00 -3.746021926788E+00 1.443978096000E+00 1.080000000000E+02 +3.661827819993E+00 -3.786131856994E+00 1.427519630000E+00 1.080000000000E+02 +3.739780335342E+00 -3.821594679051E+00 1.402784195000E+00 1.080000000000E+02 +3.816180900622E+00 -3.854545606164E+00 1.371062779000E+00 1.080000000000E+02 +3.889998703809E+00 -3.887457481317E+00 1.333595471000E+00 1.080000000000E+02 +3.959867910449E+00 -3.923806641616E+00 1.291888617000E+00 1.080000000000E+02 +4.024550213336E+00 -3.965909069271E+00 1.247327499000E+00 1.080000000000E+02 +4.082788928556E+00 -4.015014516178E+00 1.201173169000E+00 1.080000000000E+02 +4.133710402775E+00 -4.071124724323E+00 1.154170635000E+00 1.080000000000E+02 +4.177147414390E+00 -4.132454017827E+00 1.106391465000E+00 1.080000000000E+02 +4.214205102526E+00 -4.196659767482E+00 1.056863518000E+00 1.080000000000E+02 +4.246428468108E+00 -4.261182182678E+00 1.004521395000E+00 1.080000000000E+02 +4.276471430112E+00 -4.323047954240E+00 9.479798854000E-01 1.080000000000E+02 +4.304414352279E+00 -4.382357803036E+00 8.876176364000E-01 1.080000000000E+02 +4.330978826186E+00 -4.438428712811E+00 8.236903164000E-01 1.080000000000E+02 +4.354577690919E+00 -4.493123290744E+00 7.574711850000E-01 1.080000000000E+02 +4.374505887636E+00 -4.547410587727E+00 6.895838911000E-01 1.080000000000E+02 +4.390344459058E+00 -4.601572125324E+00 6.207042323000E-01 1.080000000000E+02 +4.402674298577E+00 -4.655320166765E+00 5.506192747000E-01 1.080000000000E+02 +4.411934386879E+00 -4.708063522691E+00 4.794354850000E-01 1.080000000000E+02 +4.418145424603E+00 -4.759685958319E+00 4.071715453000E-01 1.080000000000E+02 +4.421231971513E+00 -4.810075253518E+00 3.337124203000E-01 1.080000000000E+02 +4.420710884426E+00 -4.859156378526E+00 2.593013285000E-01 1.080000000000E+02 +4.416133218095E+00 -4.906761522821E+00 1.840910744000E-01 1.080000000000E+02 +4.406872868997E+00 -4.952761263631E+00 1.084250821000E-01 1.080000000000E+02 +4.393238254074E+00 -4.996298719096E+00 3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +4.907460575322E+00 -4.453735327424E+00 -3.206635964000E-02 1.080000000000E+02 +4.959066778177E+00 -4.419745988049E+00 -9.558959151000E-02 1.080000000000E+02 +5.011085761312E+00 -4.373407568550E+00 -1.502609002000E-01 1.080000000000E+02 +5.059790252514E+00 -4.316413097081E+00 -1.975103298000E-01 1.080000000000E+02 +5.101032650061E+00 -4.249827467682E+00 -2.389271858000E-01 1.080000000000E+02 +5.133069600946E+00 -4.175437202689E+00 -2.748207179000E-01 1.080000000000E+02 +5.157462896632E+00 -4.097013143090E+00 -3.080563152000E-01 1.080000000000E+02 +5.170757976348E+00 -4.016994334249E+00 -3.436690988000E-01 1.080000000000E+02 +5.171108142103E+00 -3.934651841635E+00 -3.763048784000E-01 1.080000000000E+02 +5.164334441219E+00 -3.851171078976E+00 -4.052293645000E-01 1.080000000000E+02 +5.146873712156E+00 -3.771236986014E+00 -4.392283960000E-01 1.080000000000E+02 +5.115723189724E+00 -3.699041832510E+00 -4.800337212000E-01 1.080000000000E+02 +5.071974017332E+00 -3.636341463795E+00 -5.247345144000E-01 1.080000000000E+02 +5.016506945385E+00 -3.584466985996E+00 -5.704365727000E-01 1.080000000000E+02 +4.950977147073E+00 -3.544227196848E+00 -6.144560156000E-01 1.080000000000E+02 +4.877091841788E+00 -3.516610110394E+00 -6.547457037000E-01 1.080000000000E+02 +4.797003416183E+00 -3.502386711255E+00 -6.898657429000E-01 1.080000000000E+02 +4.713453992684E+00 -3.501132528935E+00 -7.191623664000E-01 1.080000000000E+02 +4.628588136164E+00 -3.511486578077E+00 -7.426294678000E-01 1.080000000000E+02 +4.543500898094E+00 -3.526221482184E+00 -7.624802322000E-01 1.080000000000E+02 +4.458116054306E+00 -3.543930650361E+00 -7.779139702000E-01 1.080000000000E+02 +4.372088273101E+00 -3.562821006583E+00 -7.877001548000E-01 1.080000000000E+02 +4.285077479337E+00 -3.579070600275E+00 -7.913832776000E-01 1.080000000000E+02 +4.197003910484E+00 -3.588503768942E+00 -7.895526386000E-01 1.080000000000E+02 +4.109103036962E+00 -3.595312298854E+00 -7.811847600000E-01 1.080000000000E+02 +4.022274832662E+00 -3.604471987653E+00 -7.661370968000E-01 1.080000000000E+02 +3.936198009477E+00 -3.613620168689E+00 -7.471733717000E-01 1.080000000000E+02 +3.850166173763E+00 -3.619281287876E+00 -7.269319722000E-01 1.080000000000E+02 +3.763800659974E+00 -3.619052236808E+00 -7.069563165000E-01 1.080000000000E+02 +3.677691230054E+00 -3.609466927604E+00 -6.885508517000E-01 1.080000000000E+02 +3.593433236314E+00 -3.587387433207E+00 -6.723087025000E-01 1.080000000000E+02 +3.513146048669E+00 -3.553105143955E+00 -6.572772207000E-01 1.080000000000E+02 +3.438863183651E+00 -3.507122793201E+00 -6.427120602000E-01 1.080000000000E+02 +3.372676401819E+00 -3.449753430103E+00 -6.291917806000E-01 1.080000000000E+02 +3.317392419320E+00 -3.381200298113E+00 -6.193379278000E-01 1.080000000000E+02 +3.274477117178E+00 -3.303823217931E+00 -6.153164653000E-01 1.080000000000E+02 +3.236671900847E+00 -3.223844421324E+00 -6.108406342000E-01 1.080000000000E+02 +3.197009303092E+00 -3.145757253022E+00 -5.976498684000E-01 1.080000000000E+02 +3.155503309665E+00 -3.071457502743E+00 -5.730609127000E-01 1.080000000000E+02 +3.114977823205E+00 -3.000686233291E+00 -5.383970067000E-01 1.080000000000E+02 +3.077208966331E+00 -2.933443900925E+00 -4.947621310000E-01 1.080000000000E+02 +3.042763483865E+00 -2.870974933497E+00 -4.421942386000E-01 1.080000000000E+02 +3.012099211897E+00 -2.814549866298E+00 -3.812203306000E-01 1.080000000000E+02 +2.985161658160E+00 -2.765861838494E+00 -3.122472237000E-01 1.080000000000E+02 +2.963690976194E+00 -2.721566866881E+00 -2.386307155000E-01 1.080000000000E+02 +2.949524974269E+00 -2.677296225819E+00 -1.632283249000E-01 1.080000000000E+02 +2.941005735309E+00 -2.637516721937E+00 -8.452815995000E-02 1.080000000000E+02 +2.938151241569E+00 -2.602163734656E+00 -3.268188411000E-03 1.080000000000E+02 +2.941562679634E+00 -2.569844746446E+00 7.911508161000E-02 1.080000000000E+02 +2.950603513827E+00 -2.542000573197E+00 1.627636593000E-01 1.080000000000E+02 +2.965785980487E+00 -2.517527142002E+00 2.465256910000E-01 1.080000000000E+02 +2.985752847298E+00 -2.499368389211E+00 3.309221835000E-01 1.080000000000E+02 +3.010430977370E+00 -2.487451560519E+00 4.151413601000E-01 1.080000000000E+02 +3.039905109033E+00 -2.481485247812E+00 4.985211599000E-01 1.080000000000E+02 +3.073589279501E+00 -2.482192852326E+00 5.804104256000E-01 1.080000000000E+02 +3.110538655603E+00 -2.490728055769E+00 6.604511422000E-01 1.080000000000E+02 +3.148777158031E+00 -2.509096537149E+00 7.382277411000E-01 1.080000000000E+02 +3.187062958290E+00 -2.537510303958E+00 8.130003965000E-01 1.080000000000E+02 +3.227796922300E+00 -2.571731670738E+00 8.837344519000E-01 1.080000000000E+02 +3.275607662844E+00 -2.606596492219E+00 9.496690099000E-01 1.080000000000E+02 +3.332148681971E+00 -2.640051702992E+00 1.009152163000E+00 1.080000000000E+02 +3.396162959134E+00 -2.672962331265E+00 1.060859533000E+00 1.080000000000E+02 +3.466186127947E+00 -2.706133636331E+00 1.103835896000E+00 1.080000000000E+02 +3.540762040450E+00 -2.740016784297E+00 1.137456428000E+00 1.080000000000E+02 +3.618657721980E+00 -2.774791520658E+00 1.161466271000E+00 1.080000000000E+02 +3.698899169690E+00 -2.809547126069E+00 1.175425951000E+00 1.080000000000E+02 +3.780682263299E+00 -2.843373990899E+00 1.179281333000E+00 1.080000000000E+02 +3.863284478754E+00 -2.874982405474E+00 1.173138038000E+00 1.080000000000E+02 +3.945651810243E+00 -2.903741931664E+00 1.157882812000E+00 1.080000000000E+02 +4.026842236787E+00 -2.931551800966E+00 1.135668523000E+00 1.080000000000E+02 +4.105989640522E+00 -2.960766689577E+00 1.108680995000E+00 1.080000000000E+02 +4.182035961102E+00 -2.995359355751E+00 1.079331268000E+00 1.080000000000E+02 +4.252995837974E+00 -3.039397213028E+00 1.049719473000E+00 1.080000000000E+02 +4.317952776776E+00 -3.091478173685E+00 1.019495947000E+00 1.080000000000E+02 +4.376055939559E+00 -3.150828762537E+00 9.885700701000E-01 1.080000000000E+02 +4.426868504276E+00 -3.216137898125E+00 9.570750472000E-01 1.080000000000E+02 +4.469875305135E+00 -3.287112037415E+00 9.259972860000E-01 1.080000000000E+02 +4.504123599565E+00 -3.363594247196E+00 8.971800023000E-01 1.080000000000E+02 +4.529765677911E+00 -3.444593694338E+00 8.719921484000E-01 1.080000000000E+02 +4.547557423184E+00 -3.528819797601E+00 8.511651264000E-01 1.080000000000E+02 +4.559597438573E+00 -3.614887219705E+00 8.338806698000E-01 1.080000000000E+02 +4.571225380675E+00 -3.700881267251E+00 8.161032666000E-01 1.080000000000E+02 +4.585540893236E+00 -3.785633636804E+00 7.945068161000E-01 1.080000000000E+02 +4.601425261161E+00 -3.868789819440E+00 7.685448264000E-01 1.080000000000E+02 +4.616865484276E+00 -3.950606675040E+00 7.382924668000E-01 1.080000000000E+02 +4.631248009768E+00 -4.030539264637E+00 7.029154360000E-01 1.080000000000E+02 +4.644592736858E+00 -4.107743405806E+00 6.614534371000E-01 1.080000000000E+02 +4.657913462566E+00 -4.180633118658E+00 6.129080743000E-01 1.080000000000E+02 +4.672597874194E+00 -4.247553529974E+00 5.567854442000E-01 1.080000000000E+02 +4.688379672207E+00 -4.308286765299E+00 4.941808118000E-01 1.080000000000E+02 +4.705438550920E+00 -4.362399510116E+00 4.262021665000E-01 1.080000000000E+02 +4.725687358862E+00 -4.408193702663E+00 3.530417735000E-01 1.080000000000E+02 +4.749403434601E+00 -4.444960536135E+00 2.760107546000E-01 1.080000000000E+02 +4.778690869817E+00 -4.469892974313E+00 1.962732381000E-01 1.080000000000E+02 +4.815582060035E+00 -4.479615804788E+00 1.162295333000E-01 1.080000000000E+02 +4.858957742460E+00 -4.474054658924E+00 3.922229480000E-02 1.080000000000E+02 +4.907460575322E+00 -4.453735327424E+00 -3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +-1.352379061587E+00 -6.487680520715E+00 3.206635964000E-02 1.080000000000E+02 +-1.301196042135E+00 -6.475609955362E+00 -3.922229480000E-02 1.080000000000E+02 +-1.262835618385E+00 -6.454613430437E+00 -1.162295333000E-01 1.080000000000E+02 +-1.238704954920E+00 -6.425063397799E+00 -1.962732381000E-01 1.080000000000E+02 +-1.229665841573E+00 -6.387677909104E+00 -2.760107546000E-01 1.080000000000E+02 +-1.232090135749E+00 -6.343992956435E+00 -3.530417735000E-01 1.080000000000E+02 +-1.242625657027E+00 -6.295042725736E+00 -4.262021665000E-01 1.080000000000E+02 +-1.260631407608E+00 -6.241237638239E+00 -4.941808118000E-01 1.080000000000E+02 +-1.283561764862E+00 -6.182827110610E+00 -5.567854442000E-01 1.080000000000E+02 +-1.311016657151E+00 -6.120056079992E+00 -6.129080743000E-01 1.080000000000E+02 +-1.343083461934E+00 -6.053257337459E+00 -6.614534371000E-01 1.080000000000E+02 +-1.377666806528E+00 -5.982954041437E+00 -7.029154360000E-01 1.080000000000E+02 +-1.413014296325E+00 -5.909833381674E+00 -7.382924668000E-01 1.080000000000E+02 +-1.448613634539E+00 -5.834566619628E+00 -7.685448264000E-01 1.080000000000E+02 +-1.484640888733E+00 -5.757955257480E+00 -7.945068161000E-01 1.080000000000E+02 +-1.522875588708E+00 -5.680974703035E+00 -8.161032666000E-01 1.080000000000E+02 +-1.564014418871E+00 -5.604569324274E+00 -8.338806698000E-01 1.080000000000E+02 +-1.604863003224E+00 -5.527862373647E+00 -8.511651264000E-01 1.080000000000E+02 +-1.639976040295E+00 -5.449264299253E+00 -8.719921484000E-01 1.080000000000E+02 +-1.666841443616E+00 -5.368662334491E+00 -8.971800023000E-01 1.080000000000E+02 +-1.684089106366E+00 -5.286656284629E+00 -9.259972860000E-01 1.080000000000E+02 +-1.691013425966E+00 -5.203958236488E+00 -9.570750472000E-01 1.080000000000E+02 +-1.688292944320E+00 -5.121255159737E+00 -9.885700701000E-01 1.080000000000E+02 +-1.676171899044E+00 -5.039087342535E+00 -1.019495947000E+00 1.080000000000E+02 +-1.654233052250E+00 -4.958772229618E+00 -1.049719473000E+00 1.080000000000E+02 +-1.622710108992E+00 -4.881435685555E+00 -1.079331268000E+00 1.080000000000E+02 +-1.581520402298E+00 -4.808750725011E+00 -1.108680995000E+00 1.080000000000E+02 +-1.534660888288E+00 -4.738593706964E+00 -1.135668523000E+00 1.080000000000E+02 +-1.485322684477E+00 -4.668372514737E+00 -1.157882812000E+00 1.080000000000E+02 +-1.435590538879E+00 -4.596691266579E+00 -1.173138038000E+00 1.080000000000E+02 +-1.387342902738E+00 -4.522567157972E+00 -1.179281333000E+00 1.080000000000E+02 +-1.341061922435E+00 -4.447129753148E+00 -1.175425951000E+00 1.080000000000E+02 +-1.296574059879E+00 -4.371847138134E+00 -1.161466271000E+00 1.080000000000E+02 +-1.253995206918E+00 -4.297927852622E+00 -1.137456428000E+00 1.080000000000E+02 +-1.213578041008E+00 -4.226681188549E+00 -1.103835896000E+00 1.080000000000E+02 +-1.176425711356E+00 -4.158686453078E+00 -1.060859533000E+00 1.080000000000E+02 +-1.143981455190E+00 -4.094434547458E+00 -1.009152163000E+00 1.080000000000E+02 +-1.117903289342E+00 -4.034134736199E+00 -9.496690099000E-01 1.080000000000E+02 +-1.099716615618E+00 -3.977826054922E+00 -8.837344519000E-01 1.080000000000E+02 +-1.086876961193E+00 -3.926197564314E+00 -8.130003965000E-01 1.080000000000E+02 +-1.072604291232E+00 -3.880706515326E+00 -7.382277411000E-01 1.080000000000E+02 +-1.052465415391E+00 -3.843370073933E+00 -6.604511422000E-01 1.080000000000E+02 +-1.027589608902E+00 -3.814746650942E+00 -5.804104256000E-01 1.080000000000E+02 +-1.000754462050E+00 -3.794375128228E+00 -4.985211599000E-01 1.080000000000E+02 +-9.734024780205E-01 -3.781877516687E+00 -4.151413601000E-01 1.080000000000E+02 +-9.464329152433E-01 -3.777012992708E+00 -3.309221835000E-01 1.080000000000E+02 +-9.196059335781E-01 -3.779967502465E+00 -2.465256910000E-01 1.080000000000E+02 +-8.929379381044E-01 -3.790842894217E+00 -1.627636593000E-01 1.080000000000E+02 +-8.692573552013E-01 -3.808055234563E+00 -7.911508161000E-02 1.080000000000E+02 +-8.475008191921E-01 -3.832196652282E+00 3.268188411000E-03 1.080000000000E+02 +-8.290301885895E-01 -3.862475649117E+00 8.452815995000E-02 1.080000000000E+02 +-8.125405919624E-01 -3.899665426807E+00 1.632283249000E-01 1.080000000000E+02 +-7.979794983357E-01 -3.943807694794E+00 2.386307155000E-01 1.080000000000E+02 +-7.893137138628E-01 -3.992263229810E+00 3.122472237000E-01 1.080000000000E+02 +-7.824885479160E-01 -4.047486168546E+00 3.812203306000E-01 1.080000000000E+02 +-7.741306426998E-01 -4.111159013653E+00 4.421942386000E-01 1.080000000000E+02 +-7.652792856142E-01 -4.181944016525E+00 4.947621310000E-01 1.080000000000E+02 +-7.563108813883E-01 -4.258544183217E+00 5.383970067000E-01 1.080000000000E+02 +-7.474983801702E-01 -4.339619626201E+00 5.730609127000E-01 1.080000000000E+02 +-7.374051367578E-01 -4.424125997673E+00 5.976498684000E-01 1.080000000000E+02 +-7.235943664614E-01 -4.510612933900E+00 6.108406342000E-01 1.080000000000E+02 +-7.071690718074E-01 -4.597538488163E+00 6.153164653000E-01 1.080000000000E+02 +-6.964071739629E-01 -4.685362842702E+00 6.193379278000E-01 1.080000000000E+02 +-7.008383353394E-01 -4.773318601100E+00 6.291917806000E-01 1.080000000000E+02 +-7.206637010816E-01 -4.858635005061E+00 6.427120602000E-01 1.080000000000E+02 +-7.537320536331E-01 -4.939497880818E+00 6.572772207000E-01 1.080000000000E+02 +-7.985351288313E-01 -5.014424460275E+00 6.723087025000E-01 1.080000000000E+02 +-8.537232764939E-01 -5.081812752577E+00 6.885508517000E-01 1.080000000000E+02 +-9.177531652870E-01 -5.140181283609E+00 7.069563165000E-01 1.080000000000E+02 +-9.874897008306E-01 -5.191130965128E+00 7.269319722000E-01 1.080000000000E+02 +-1.060418440350E+00 -5.237119267759E+00 7.471733717000E-01 1.080000000000E+02 +-1.135433219026E+00 -5.280312921066E+00 7.661370968000E-01 1.080000000000E+02 +-1.211062641888E+00 -5.323938915135E+00 7.811847600000E-01 1.080000000000E+02 +-1.286177895859E+00 -5.370097535849E+00 7.895526386000E-01 1.080000000000E+02 +-1.362975587242E+00 -5.414234286975E+00 7.913832776000E-01 1.080000000000E+02 +-1.442920069619E+00 -5.452231750892E+00 7.877001548000E-01 1.080000000000E+02 +-1.523621479400E+00 -5.487514992757E+00 7.779139702000E-01 1.080000000000E+02 +-1.603108456971E+00 -5.523375926694E+00 7.624802322000E-01 1.080000000000E+02 +-1.680606437902E+00 -5.561468162557E+00 7.426294678000E-01 1.080000000000E+02 +-1.755350315457E+00 -5.602974459726E+00 7.191623664000E-01 1.080000000000E+02 +-1.822206029066E+00 -5.653098233507E+00 6.898657429000E-01 1.080000000000E+02 +-1.878638622182E+00 -5.711680000579E+00 6.547457037000E-01 1.080000000000E+02 +-1.922180173663E+00 -5.777451385662E+00 6.144560156000E-01 1.080000000000E+02 +-1.951542539519E+00 -5.848523507967E+00 5.704365727000E-01 1.080000000000E+02 +-1.965925290331E+00 -5.923093568958E+00 5.247345144000E-01 1.080000000000E+02 +-1.964464762243E+00 -5.999534351135E+00 4.800337212000E-01 1.080000000000E+02 +-1.947230817756E+00 -6.076251274918E+00 4.392283960000E-01 1.080000000000E+02 +-1.914372763305E+00 -6.151182473591E+00 4.052293645000E-01 1.080000000000E+02 +-1.870784041293E+00 -6.222701310769E+00 3.763048784000E-01 1.080000000000E+02 +-1.822101048451E+00 -6.289111964387E+00 3.436690988000E-01 1.080000000000E+02 +-1.764311227277E+00 -6.346033888823E+00 3.080563152000E-01 1.080000000000E+02 +-1.698480130861E+00 -6.395142266347E+00 2.748207179000E-01 1.080000000000E+02 +-1.628836192470E+00 -6.436494407685E+00 2.389271858000E-01 1.080000000000E+02 +-1.556332340991E+00 -6.466121640402E+00 1.975103298000E-01 1.080000000000E+02 +-1.483429070114E+00 -6.483603354757E+00 1.502609002000E-01 1.080000000000E+02 +-1.414107789131E+00 -6.490515932498E+00 9.558959151000E-02 1.080000000000E+02 +-1.352379061587E+00 -6.487680520715E+00 3.206635964000E-02 0.000000000000E+00 5 AAE56_SC +-6.174537047519E-01 -6.624371228274E+00 -3.187537464000E-02 1.080000000000E+02 +-6.540750141809E-01 -6.597162912483E+00 -1.084250821000E-01 1.080000000000E+02 +-6.886047632324E-01 -6.565391437062E+00 -1.840910744000E-01 1.080000000000E+02 +-7.202897748382E-01 -6.529568751067E+00 -2.593013285000E-01 1.080000000000E+02 +-7.495605045925E-01 -6.490167574138E+00 -3.337124203000E-01 1.080000000000E+02 +-7.766815202804E-01 -6.447587551233E+00 -4.071715453000E-01 1.080000000000E+02 +-8.019995915586E-01 -6.402173367144E+00 -4.794354850000E-01 1.080000000000E+02 +-8.255097895224E-01 -6.354060152520E+00 -5.506192747000E-01 1.080000000000E+02 +-8.471270459121E-01 -6.303329775747E+00 -6.207042323000E-01 1.080000000000E+02 +-8.661487255067E-01 -6.250202492691E+00 -6.895838911000E-01 1.080000000000E+02 +-8.819357482480E-01 -6.194569646718E+00 -7.574711850000E-01 1.080000000000E+02 +-8.949925319206E-01 -6.136449739009E+00 -8.236903164000E-01 1.080000000000E+02 +-9.064590749322E-01 -6.075473214114E+00 -8.876176364000E-01 1.080000000000E+02 +-9.187142304640E-01 -6.011066100948E+00 -9.479798854000E-01 1.080000000000E+02 +-9.307727517871E-01 -5.943356830383E+00 -1.004521395000E+00 1.080000000000E+02 +-9.426288255099E-01 -5.872216680903E+00 -1.056863518000E+00 1.080000000000E+02 +-9.503877187960E-01 -5.798491175725E+00 -1.106391465000E+00 1.080000000000E+02 +-9.512948924687E-01 -5.723343100197E+00 -1.154170635000E+00 1.080000000000E+02 +-9.430793072984E-01 -5.648018096678E+00 -1.201173169000E+00 1.080000000000E+02 +-9.248266544540E-01 -5.574059097695E+00 -1.247327499000E+00 1.080000000000E+02 +-8.972447582441E-01 -5.501978214497E+00 -1.291888617000E+00 1.080000000000E+02 +-8.620848830457E-01 -5.431503036831E+00 -1.333595471000E+00 1.080000000000E+02 +-8.217101406208E-01 -5.361487754445E+00 -1.371062779000E+00 1.080000000000E+02 +-7.792688539356E-01 -5.289922768892E+00 -1.402784195000E+00 1.080000000000E+02 +-7.370484680737E-01 -5.215413404279E+00 -1.427519630000E+00 1.080000000000E+02 +-6.976375397059E-01 -5.137201088444E+00 -1.443978096000E+00 1.080000000000E+02 +-6.623993585745E-01 -5.055804263445E+00 -1.451432017000E+00 1.080000000000E+02 +-6.307770228265E-01 -4.972507985264E+00 -1.449884186000E+00 1.080000000000E+02 +-6.022939022379E-01 -4.888643501978E+00 -1.439465232000E+00 1.080000000000E+02 +-5.785760454947E-01 -4.805055921806E+00 -1.420151472000E+00 1.080000000000E+02 +-5.598970694973E-01 -4.722411702799E+00 -1.392276244000E+00 1.080000000000E+02 +-5.443091372798E-01 -4.642321355215E+00 -1.356669215000E+00 1.080000000000E+02 +-5.288198196776E-01 -4.565765809752E+00 -1.313751841000E+00 1.080000000000E+02 +-5.108470076704E-01 -4.494077409348E+00 -1.263842748000E+00 1.080000000000E+02 +-4.903607534158E-01 -4.428366578662E+00 -1.207380380000E+00 1.080000000000E+02 +-4.697430170692E-01 -4.368591508576E+00 -1.144593485000E+00 1.080000000000E+02 +-4.503818528637E-01 -4.314996868408E+00 -1.076114245000E+00 1.080000000000E+02 +-4.320931431427E-01 -4.268043161301E+00 -1.002637062000E+00 1.080000000000E+02 +-4.148449657797E-01 -4.228059989664E+00 -9.249046690000E-01 1.080000000000E+02 +-3.993090285108E-01 -4.194987499123E+00 -8.436327263000E-01 1.080000000000E+02 +-3.845968802080E-01 -4.169246042721E+00 -7.596450919000E-01 1.080000000000E+02 +-3.684720680771E-01 -4.151826769843E+00 -6.737108263000E-01 1.080000000000E+02 +-3.496954123804E-01 -4.143595377099E+00 -5.870384289000E-01 1.080000000000E+02 +-3.281481378723E-01 -4.144875519734E+00 -5.006187195000E-01 1.080000000000E+02 +-3.040627486641E-01 -4.155795641977E+00 -4.155171011000E-01 1.080000000000E+02 +-2.776213462059E-01 -4.176438422873E+00 -3.329023539000E-01 1.080000000000E+02 +-2.489122805677E-01 -4.206835663552E+00 -2.542191153000E-01 1.080000000000E+02 +-2.182473283357E-01 -4.246772818682E+00 -1.807565333000E-01 1.080000000000E+02 +-1.861932064073E-01 -4.295767688898E+00 -1.135748529000E-01 1.080000000000E+02 +-1.531752088092E-01 -4.353074031569E+00 -5.388091285000E-02 1.080000000000E+02 +-1.181110553833E-01 -4.417834096447E+00 -3.754172340000E-03 1.080000000000E+02 +-7.998318207819E-02 -4.488143599661E+00 3.558837129000E-02 1.080000000000E+02 +-4.018456777687E-02 -4.561629549898E+00 6.642283384000E-02 1.080000000000E+02 +-1.865010663361E-03 -4.637451242299E+00 9.346268448000E-02 1.080000000000E+02 +2.968898896559E-02 -4.715674749104E+00 1.219181286000E-01 1.080000000000E+02 +4.719324978169E-02 -4.796161734496E+00 1.560456650000E-01 1.080000000000E+02 +4.663075398666E-02 -4.876036554192E+00 1.954128437000E-01 1.080000000000E+02 +2.950028277474E-02 -4.952601924891E+00 2.376983871000E-01 1.080000000000E+02 +-3.029457181580E-03 -5.022678808154E+00 2.820781068000E-01 1.080000000000E+02 +-4.994868521872E-02 -5.082679496703E+00 3.283193574000E-01 1.080000000000E+02 +-1.078903475184E-01 -5.131115239000E+00 3.756353333000E-01 1.080000000000E+02 +-1.737368061964E-01 -5.168405956369E+00 4.226801226000E-01 1.080000000000E+02 +-2.443035026732E-01 -5.198492186743E+00 4.679474510000E-01 1.080000000000E+02 +-3.174576096363E-01 -5.227154063080E+00 5.099632237000E-01 1.080000000000E+02 +-3.890803284431E-01 -5.264149350628E+00 5.479092097000E-01 1.080000000000E+02 +-4.642285886459E-01 -5.301125457619E+00 5.783904634000E-01 1.080000000000E+02 +-5.419618729757E-01 -5.337220580567E+00 6.026804297000E-01 1.080000000000E+02 +-6.223498652455E-01 -5.369750555626E+00 6.230907784000E-01 1.080000000000E+02 +-7.035604426016E-01 -5.401051792741E+00 6.421364412000E-01 1.080000000000E+02 +-7.845316887524E-01 -5.433096278630E+00 6.610368381000E-01 1.080000000000E+02 +-8.635087013100E-01 -5.469770295839E+00 6.800217467000E-01 1.080000000000E+02 +-9.381071096230E-01 -5.514947085216E+00 6.982493624000E-01 1.080000000000E+02 +-1.005029781276E+00 -5.571525530269E+00 7.142960837000E-01 1.080000000000E+02 +-1.062455957307E+00 -5.638467641726E+00 7.270540685000E-01 1.080000000000E+02 +-1.107560928944E+00 -5.714691041203E+00 7.366388673000E-01 1.080000000000E+02 +-1.138557042664E+00 -5.797745797199E+00 7.452820520000E-01 1.080000000000E+02 +-1.153111629297E+00 -5.884766692590E+00 7.578816060000E-01 1.080000000000E+02 +-1.152237113243E+00 -5.971717150592E+00 7.773689488000E-01 1.080000000000E+02 +-1.136995267996E+00 -6.056208132375E+00 8.012208021000E-01 1.080000000000E+02 +-1.107518843248E+00 -6.137036094228E+00 8.243174216000E-01 1.080000000000E+02 +-1.063825100204E+00 -6.212455111524E+00 8.427262700000E-01 1.080000000000E+02 +-1.005782948708E+00 -6.278751851746E+00 8.562220560000E-01 1.080000000000E+02 +-9.384074971066E-01 -6.336513934767E+00 8.640060786000E-01 1.080000000000E+02 +-8.687859673451E-01 -6.392068771124E+00 8.607369806000E-01 1.080000000000E+02 +-7.998878414080E-01 -6.445726621452E+00 8.432354714000E-01 1.080000000000E+02 +-7.333813162992E-01 -6.495416134846E+00 8.108473046000E-01 1.080000000000E+02 +-6.712710452262E-01 -6.539509994668E+00 7.645271884000E-01 1.080000000000E+02 +-6.155782488455E-01 -6.577411453558E+00 7.062104980000E-01 1.080000000000E+02 +-5.682385792406E-01 -6.609238399765E+00 6.378051764000E-01 1.080000000000E+02 +-5.322655189065E-01 -6.635140915120E+00 5.605003417000E-01 1.080000000000E+02 +-5.102753988998E-01 -6.654697674252E+00 4.764366174000E-01 1.080000000000E+02 +-5.017318357254E-01 -6.667465876329E+00 3.886351210000E-01 1.080000000000E+02 +-5.056978960894E-01 -6.673099648835E+00 2.997983967000E-01 1.080000000000E+02 +-5.213358954334E-01 -6.671358970530E+00 2.120822207000E-01 1.080000000000E+02 +-5.475857834759E-01 -6.662237853808E+00 1.274648788000E-01 1.080000000000E+02 +-5.808510820260E-01 -6.646319875049E+00 4.635841915000E-02 1.080000000000E+02 +-6.174537047519E-01 -6.624371228274E+00 -3.187537464000E-02 0.000000000000E+00 4 AAE47_SC +-5.750693853712E-02 -6.709889967593E+00 -3.632685538000E-02 1.080000000000E+02 +-7.926825814379E-02 -6.696017708483E+00 -1.206362437000E-01 1.080000000000E+02 +-9.969148527330E-02 -6.677262240821E+00 -2.044325232000E-01 1.080000000000E+02 +-1.162362164521E-01 -6.653830738574E+00 -2.879184587000E-01 1.080000000000E+02 +-1.284939430860E-01 -6.625996956139E+00 -3.706549346000E-01 1.080000000000E+02 +-1.347589738484E-01 -6.594269602920E+00 -4.527156872000E-01 1.080000000000E+02 +-1.363452082510E-01 -6.558911633087E+00 -5.335701480000E-01 1.080000000000E+02 +-1.339028890655E-01 -6.520289626398E+00 -6.127886991000E-01 1.080000000000E+02 +-1.281584526258E-01 -6.478529478812E+00 -6.903510399000E-01 1.080000000000E+02 +-1.203170967395E-01 -6.433743134890E+00 -7.659096737000E-01 1.080000000000E+02 +-1.112341459033E-01 -6.385876882583E+00 -8.394336353000E-01 1.080000000000E+02 +-9.944467321980E-02 -6.335387736469E+00 -9.108702606000E-01 1.080000000000E+02 +-8.377240898085E-02 -6.282757825278E+00 -9.799657947000E-01 1.080000000000E+02 +-6.511677533821E-02 -6.227926730655E+00 -1.046417130000E+00 1.080000000000E+02 +-4.458672358480E-02 -6.170479542238E+00 -1.110182121000E+00 1.080000000000E+02 +-2.341863556585E-02 -6.110113289599E+00 -1.170998922000E+00 1.080000000000E+02 +-2.735689831347E-03 -6.046558747161E+00 -1.228575236000E+00 1.080000000000E+02 +1.653127018635E-02 -5.979599280522E+00 -1.282612075000E+00 1.080000000000E+02 +3.356343008381E-02 -5.909047428229E+00 -1.332770951000E+00 1.080000000000E+02 +4.802893562064E-02 -5.835017206222E+00 -1.378577601000E+00 1.080000000000E+02 +5.969425813633E-02 -5.757778143512E+00 -1.419493916000E+00 1.080000000000E+02 +6.885189201710E-02 -5.677504957651E+00 -1.455093589000E+00 1.080000000000E+02 +7.565272414578E-02 -5.594690598720E+00 -1.484797470000E+00 1.080000000000E+02 +8.059967733971E-02 -5.509862746511E+00 -1.508093490000E+00 1.080000000000E+02 +8.430784220913E-02 -5.423179770736E+00 -1.524583142000E+00 1.080000000000E+02 +8.784065691108E-02 -5.335506312479E+00 -1.533750385000E+00 1.080000000000E+02 +9.226195351377E-02 -5.247483538487E+00 -1.535219663000E+00 1.080000000000E+02 +9.817626358073E-02 -5.159619099425E+00 -1.528680731000E+00 1.080000000000E+02 +1.063503173409E-01 -5.073047899802E+00 -1.513978101000E+00 1.080000000000E+02 +1.190104206511E-01 -4.988804600166E+00 -1.491069996000E+00 1.080000000000E+02 +1.373963211693E-01 -4.908311232626E+00 -1.460188986000E+00 1.080000000000E+02 +1.590825415503E-01 -4.831927123589E+00 -1.421583532000E+00 1.080000000000E+02 +1.815131044888E-01 -4.760092673195E+00 -1.375655668000E+00 1.080000000000E+02 +2.012584736398E-01 -4.692416291692E+00 -1.322504398000E+00 1.080000000000E+02 +2.154486347807E-01 -4.629152101905E+00 -1.262691804000E+00 1.080000000000E+02 +2.287404305049E-01 -4.572000212576E+00 -1.196814028000E+00 1.080000000000E+02 +2.471034000762E-01 -4.523221655393E+00 -1.125601149000E+00 1.080000000000E+02 +2.698788864032E-01 -4.483779066348E+00 -1.050138721000E+00 1.080000000000E+02 +2.951624739686E-01 -4.453851950821E+00 -9.710448039000E-01 1.080000000000E+02 +3.235638669017E-01 -4.434584162034E+00 -8.897856590000E-01 1.080000000000E+02 +3.536614460878E-01 -4.426134448142E+00 -8.072828216000E-01 1.080000000000E+02 +3.859095541975E-01 -4.429200636647E+00 -7.252260042000E-01 1.080000000000E+02 +4.208805313734E-01 -4.444106569680E+00 -6.456312705000E-01 1.080000000000E+02 +4.577751249130E-01 -4.470143987195E+00 -5.697936167000E-01 1.080000000000E+02 +4.958732320289E-01 -4.506099420823E+00 -4.988404496000E-01 1.080000000000E+02 +5.368102309130E-01 -4.550674007001E+00 -4.346658470000E-01 1.080000000000E+02 +5.790394057630E-01 -4.601704952567E+00 -3.764466502000E-01 1.080000000000E+02 +6.148038836932E-01 -4.657988054157E+00 -3.185973837000E-01 1.080000000000E+02 +6.425557746681E-01 -4.718697907960E+00 -2.609630366000E-01 1.080000000000E+02 +6.622473063899E-01 -4.782810621566E+00 -2.036424630000E-01 1.080000000000E+02 +6.734219313679E-01 -4.848714959429E+00 -1.460500498000E-01 1.080000000000E+02 +6.725134873488E-01 -4.913754433509E+00 -8.649636904000E-02 1.080000000000E+02 +6.572373331621E-01 -4.974660966675E+00 -2.448555749000E-02 1.080000000000E+02 +6.279350982004E-01 -5.029055408740E+00 3.845435998000E-02 1.080000000000E+02 +5.857971849492E-01 -5.076679355925E+00 9.962429365000E-02 1.080000000000E+02 +5.300312676513E-01 -5.116708762695E+00 1.550619236000E-01 1.080000000000E+02 +4.646710359097E-01 -5.151214194078E+00 2.031942363000E-01 1.080000000000E+02 +3.947933605240E-01 -5.183688073067E+00 2.462074493000E-01 1.080000000000E+02 +3.305477672465E-01 -5.223530784291E+00 2.916382842000E-01 1.080000000000E+02 +2.704954351026E-01 -5.266025137141E+00 3.403860995000E-01 1.080000000000E+02 +2.102033346713E-01 -5.304156997907E+00 3.922509070000E-01 1.080000000000E+02 +1.469608835286E-01 -5.333859357005E+00 4.461358974000E-01 1.080000000000E+02 +7.975014465889E-02 -5.355149282649E+00 4.991121880000E-01 1.080000000000E+02 +8.236057058758E-03 -5.372258649050E+00 5.478583852000E-01 1.080000000000E+02 +-6.640101136890E-02 -5.391600331946E+00 5.907387262000E-01 1.080000000000E+02 +-1.394612262091E-01 -5.420382663521E+00 6.309463669000E-01 1.080000000000E+02 +-2.088885318525E-01 -5.459981769013E+00 6.683070249000E-01 1.080000000000E+02 +-2.699455036227E-01 -5.509345284322E+00 7.085053980000E-01 1.080000000000E+02 +-3.173703046824E-01 -5.564222537764E+00 7.587395914000E-01 1.080000000000E+02 +-3.496846348330E-01 -5.617781646298E+00 8.209661657000E-01 1.080000000000E+02 +-3.660646652041E-01 -5.668372758318E+00 8.913395217000E-01 1.080000000000E+02 +-3.649586718227E-01 -5.721675578267E+00 9.616664656000E-01 1.080000000000E+02 +-3.508286650414E-01 -5.783844482807E+00 1.022604995000E+00 1.080000000000E+02 +-3.277961260081E-01 -5.854409547938E+00 1.070335916000E+00 1.080000000000E+02 +-2.921036357449E-01 -5.926530278685E+00 1.106430447000E+00 1.080000000000E+02 +-2.419038601450E-01 -5.993663223081E+00 1.133893710000E+00 1.080000000000E+02 +-1.778119646166E-01 -6.050359544652E+00 1.155518699000E+00 1.080000000000E+02 +-1.078919328483E-01 -6.101547136664E+00 1.172009822000E+00 1.080000000000E+02 +-4.156336168126E-02 -6.159119147747E+00 1.180212576000E+00 1.080000000000E+02 +1.713066218774E-02 -6.224804402078E+00 1.175727956000E+00 1.080000000000E+02 +6.943825892508E-02 -6.293290466321E+00 1.156570420000E+00 1.080000000000E+02 +1.157424389519E-01 -6.360133140096E+00 1.122466283000E+00 1.080000000000E+02 +1.546755360785E-01 -6.422909757807E+00 1.074292285000E+00 1.080000000000E+02 +1.841704256493E-01 -6.480268204903E+00 1.014026757000E+00 1.080000000000E+02 +2.022979217216E-01 -6.531339924423E+00 9.444199619000E-01 1.080000000000E+02 +2.083846312353E-01 -6.575630966647E+00 8.684143517000E-01 1.080000000000E+02 +2.036642623669E-01 -6.613048586515E+00 7.885880029000E-01 1.080000000000E+02 +1.919148515388E-01 -6.643976323317E+00 7.068846032000E-01 1.080000000000E+02 +1.736005277346E-01 -6.669038598679E+00 6.243033587000E-01 1.080000000000E+02 +1.477021840256E-01 -6.688603045180E+00 5.422183342000E-01 1.080000000000E+02 +1.161737441310E-01 -6.703319209250E+00 4.611599500000E-01 1.080000000000E+02 +8.091258818786E-02 -6.713778290553E+00 3.810313384000E-01 1.080000000000E+02 +4.670404159877E-02 -6.720663898439E+00 2.999547317000E-01 1.080000000000E+02 +1.673072419145E-02 -6.724078484640E+00 2.170477619000E-01 1.080000000000E+02 +-1.005470672386E-02 -6.723647758770E+00 1.330022602000E-01 1.080000000000E+02 +-3.343668901282E-02 -6.719096880839E+00 4.805479793000E-02 1.080000000000E+02 +-5.750693853712E-02 -6.709889967593E+00 -3.632685538000E-02 0.000000000000E+00 3 AAE38_SC +7.417711470444E-01 -6.744520877280E+00 -2.786784824000E-03 1.080000000000E+02 +7.528308415311E-01 -6.736770952410E+00 -9.012406132000E-02 1.080000000000E+02 +7.665002742798E-01 -6.725065347294E+00 -1.765219348000E-01 1.080000000000E+02 +7.800061421224E-01 -6.709395062267E+00 -2.624374443000E-01 1.080000000000E+02 +7.906775770776E-01 -6.689763587759E+00 -3.478877549000E-01 1.080000000000E+02 +7.991053975181E-01 -6.666187465459E+00 -4.326343739000E-01 1.080000000000E+02 +8.066497838806E-01 -6.638747540333E+00 -5.162774167000E-01 1.080000000000E+02 +8.145711842331E-01 -6.607530462463E+00 -5.984352213000E-01 1.080000000000E+02 +8.230846874093E-01 -6.572502239016E+00 -6.790841041000E-01 1.080000000000E+02 +8.306462438994E-01 -6.533639274696E+00 -7.581530132000E-01 1.080000000000E+02 +8.360092594944E-01 -6.491049645935E+00 -8.352590367000E-01 1.080000000000E+02 +8.399083760868E-01 -6.444601062140E+00 -9.103747398000E-01 1.080000000000E+02 +8.431828647534E-01 -6.394467537130E+00 -9.829305340000E-01 1.080000000000E+02 +8.453067093919E-01 -6.340479694970E+00 -1.052910239000E+00 1.080000000000E+02 +8.465463482519E-01 -6.282861548692E+00 -1.119713595000E+00 1.080000000000E+02 +8.500577367212E-01 -6.221464980023E+00 -1.183240350000E+00 1.080000000000E+02 +8.581684355821E-01 -6.156763697050E+00 -1.242822431000E+00 1.080000000000E+02 +8.703366464578E-01 -6.088972714236E+00 -1.298134958000E+00 1.080000000000E+02 +8.855534905562E-01 -6.018236704046E+00 -1.348880339000E+00 1.080000000000E+02 +9.037119297223E-01 -5.944916496363E+00 -1.394624322000E+00 1.080000000000E+02 +9.246796310412E-01 -5.869221520505E+00 -1.435050927000E+00 1.080000000000E+02 +9.471146383857E-01 -5.791289590837E+00 -1.469852265000E+00 1.080000000000E+02 +9.694329974984E-01 -5.710826726705E+00 -1.498846663000E+00 1.080000000000E+02 +9.889793631280E-01 -5.627755900940E+00 -1.521653119000E+00 1.080000000000E+02 +1.002438445388E+00 -5.542010960708E+00 -1.537810757000E+00 1.080000000000E+02 +1.009463122209E+00 -5.454353706812E+00 -1.546702180000E+00 1.080000000000E+02 +1.010978554463E+00 -5.366016052971E+00 -1.547836060000E+00 1.080000000000E+02 +1.006993516280E+00 -5.278124891882E+00 -1.540955846000E+00 1.080000000000E+02 +9.973721283714E-01 -5.191537340863E+00 -1.525941209000E+00 1.080000000000E+02 +9.825831991483E-01 -5.107628643352E+00 -1.502926011000E+00 1.080000000000E+02 +9.639928053385E-01 -5.026996201361E+00 -1.472011314000E+00 1.080000000000E+02 +9.467792601915E-01 -4.949672512646E+00 -1.432913650000E+00 1.080000000000E+02 +9.362214771549E-01 -4.876210809349E+00 -1.385061074000E+00 1.080000000000E+02 +9.314956366583E-01 -4.808509348005E+00 -1.328492129000E+00 1.080000000000E+02 +9.302788740969E-01 -4.748514175570E+00 -1.263647540000E+00 1.080000000000E+02 +9.332153489859E-01 -4.698069760520E+00 -1.191204722000E+00 1.080000000000E+02 +9.416649183739E-01 -4.659057162530E+00 -1.112414355000E+00 1.080000000000E+02 +9.557181507490E-01 -4.632869649798E+00 -1.029225643000E+00 1.080000000000E+02 +9.749206794522E-01 -4.619935745772E+00 -9.439925506000E-01 1.080000000000E+02 +9.999844867241E-01 -4.619895730915E+00 -8.592609358000E-01 1.080000000000E+02 +1.031923821855E+00 -4.631595952158E+00 -7.777589224000E-01 1.080000000000E+02 +1.071440060822E+00 -4.653068118382E+00 -7.017224202000E-01 1.080000000000E+02 +1.117438801657E+00 -4.681672703804E+00 -6.319745517000E-01 1.080000000000E+02 +1.164272523475E+00 -4.715164694556E+00 -5.649597706000E-01 1.080000000000E+02 +1.204505334810E+00 -4.752930391915E+00 -4.959805589000E-01 1.080000000000E+02 +1.233037527423E+00 -4.795109124628E+00 -4.238156204000E-01 1.080000000000E+02 +1.245751473121E+00 -4.841524527875E+00 -3.497702850000E-01 1.080000000000E+02 +1.242742424231E+00 -4.891678223714E+00 -2.770763044000E-01 1.080000000000E+02 +1.228671141814E+00 -4.945253022400E+00 -2.083126740000E-01 1.080000000000E+02 +1.200956279828E+00 -4.999575303426E+00 -1.443669380000E-01 1.080000000000E+02 +1.160011701698E+00 -5.050487198398E+00 -8.494149535000E-02 1.080000000000E+02 +1.106633910140E+00 -5.093416962312E+00 -2.916971350000E-02 1.080000000000E+02 +1.046076543329E+00 -5.128178344956E+00 2.494784873000E-02 1.080000000000E+02 +9.833266561209E-01 -5.157595684581E+00 7.966775233000E-02 1.080000000000E+02 +9.212710749746E-01 -5.184732113098E+00 1.364003779000E-01 1.080000000000E+02 +8.604896894232E-01 -5.211434114127E+00 1.946452353000E-01 1.080000000000E+02 +8.005852265022E-01 -5.238598573483E+00 2.536123470000E-01 1.080000000000E+02 +7.388562794258E-01 -5.264488611845E+00 3.112409570000E-01 1.080000000000E+02 +6.737860255295E-01 -5.286015429580E+00 3.670458051000E-01 1.080000000000E+02 +6.069266929209E-01 -5.300736917493E+00 4.228264178000E-01 1.080000000000E+02 +5.403926874576E-01 -5.308491952305E+00 4.803836822000E-01 1.080000000000E+02 +4.753587298470E-01 -5.311465208956E+00 5.400717519000E-01 1.080000000000E+02 +4.096133073977E-01 -5.314764912797E+00 5.989634359000E-01 1.080000000000E+02 +3.530379745611E-01 -5.318050495993E+00 6.667474988000E-01 1.080000000000E+02 +3.083971673848E-01 -5.329159756988E+00 7.421450537000E-01 1.080000000000E+02 +2.735463267325E-01 -5.355629834842E+00 8.188905247000E-01 1.080000000000E+02 +2.495791730670E-01 -5.396064087833E+00 8.936981911000E-01 1.080000000000E+02 +2.407263939130E-01 -5.444807729680E+00 9.667867241000E-01 1.080000000000E+02 +2.479833898419E-01 -5.497771316036E+00 1.037139043000E+00 1.080000000000E+02 +2.711953656708E-01 -5.551979709661E+00 1.102951579000E+00 1.080000000000E+02 +3.087509404511E-01 -5.605120366703E+00 1.162638692000E+00 1.080000000000E+02 +3.564865195509E-01 -5.657116926292E+00 1.215714425000E+00 1.080000000000E+02 +4.125227723631E-01 -5.707163822311E+00 1.262085734000E+00 1.080000000000E+02 +4.722422941885E-01 -5.758863057864E+00 1.301720477000E+00 1.080000000000E+02 +5.321273368141E-01 -5.815696915993E+00 1.333014261000E+00 1.080000000000E+02 +5.904063780094E-01 -5.878977250888E+00 1.353085167000E+00 1.080000000000E+02 +6.445500969746E-01 -5.948580515853E+00 1.358569067000E+00 1.080000000000E+02 +6.940723401576E-01 -6.021001361594E+00 1.348281183000E+00 1.080000000000E+02 +7.371783761260E-01 -6.093855653782E+00 1.323067807000E+00 1.080000000000E+02 +7.721245076563E-01 -6.165574208148E+00 1.285194785000E+00 1.080000000000E+02 +7.962597859182E-01 -6.235604640317E+00 1.237059622000E+00 1.080000000000E+02 +8.095221750016E-01 -6.302899863357E+00 1.181327921000E+00 1.080000000000E+02 +8.127388869786E-01 -6.366564963480E+00 1.120196685000E+00 1.080000000000E+02 +8.042560775660E-01 -6.426081815842E+00 1.055471471000E+00 1.080000000000E+02 +7.872940528185E-01 -6.480807465701E+00 9.881923803000E-01 1.080000000000E+02 +7.665335829005E-01 -6.530540108509E+00 9.182365063000E-01 1.080000000000E+02 +7.429611568025E-01 -6.575079240030E+00 8.457732406000E-01 1.080000000000E+02 +7.225239542171E-01 -6.614645576280E+00 7.694019289000E-01 1.080000000000E+02 +7.083515041791E-01 -6.648944910078E+00 6.892798267000E-01 1.080000000000E+02 +6.993868978048E-01 -6.677900552825E+00 6.062523787000E-01 1.080000000000E+02 +6.971770550130E-01 -6.701507324445E+00 5.212198625000E-01 1.080000000000E+02 +6.991933192668E-01 -6.720068349765E+00 4.348356053000E-01 1.080000000000E+02 +7.034463926586E-01 -6.733812995661E+00 3.477269332000E-01 1.080000000000E+02 +7.104851064653E-01 -6.742969422925E+00 2.600860194000E-01 1.080000000000E+02 +7.206733171683E-01 -6.747699674675E+00 1.724869752000E-01 1.080000000000E+02 +7.317053701194E-01 -6.748186796258E+00 8.489061568000E-02 1.080000000000E+02 +7.417711470444E-01 -6.744520877280E+00 -2.786784824000E-03 0.000000000000E+00 2 AAE29_SC +1.704398248500E+00 -6.640964631245E+00 -1.744954334000E-02 1.080000000000E+02 +1.707887801676E+00 -6.636547991263E+00 -1.063739981000E-01 1.080000000000E+02 +1.710153898756E+00 -6.627407911405E+00 -1.949310037000E-01 1.080000000000E+02 +1.710690269961E+00 -6.613681667387E+00 -2.829651087000E-01 1.080000000000E+02 +1.710175127342E+00 -6.595278820788E+00 -3.701617308000E-01 1.080000000000E+02 +1.709885825485E+00 -6.572063978735E+00 -4.560661339000E-01 1.080000000000E+02 +1.709554728645E+00 -6.544124106609E+00 -5.407768227000E-01 1.080000000000E+02 +1.708807751120E+00 -6.511809672373E+00 -6.236520547000E-01 1.080000000000E+02 +1.708363583031E+00 -6.474974396118E+00 -7.047985910000E-01 1.080000000000E+02 +1.709149014050E+00 -6.433684028132E+00 -7.837241475000E-01 1.080000000000E+02 +1.712038304433E+00 -6.387915602088E+00 -8.601609198000E-01 1.080000000000E+02 +1.719076247440E+00 -6.337672911800E+00 -9.334175927000E-01 1.080000000000E+02 +1.734650016007E+00 -6.283075986944E+00 -1.002061223000E+00 1.080000000000E+02 +1.759620413555E+00 -6.225067685383E+00 -1.064920566000E+00 1.080000000000E+02 +1.788791092123E+00 -6.164287097243E+00 -1.123012040000E+00 1.080000000000E+02 +1.817901430981E+00 -6.100424578688E+00 -1.177853833000E+00 1.080000000000E+02 +1.843848737838E+00 -6.033156817329E+00 -1.230287750000E+00 1.080000000000E+02 +1.862090373229E+00 -5.962323962302E+00 -1.280975246000E+00 1.080000000000E+02 +1.870916000278E+00 -5.887975035048E+00 -1.329400646000E+00 1.080000000000E+02 +1.870985343161E+00 -5.810930135115E+00 -1.374018251000E+00 1.080000000000E+02 +1.862696078041E+00 -5.731563667493E+00 -1.413793625000E+00 1.080000000000E+02 +1.846638082913E+00 -5.650731429563E+00 -1.447633049000E+00 1.080000000000E+02 +1.823889195330E+00 -5.569029197569E+00 -1.474786583000E+00 1.080000000000E+02 +1.795416622613E+00 -5.486986613538E+00 -1.494787468000E+00 1.080000000000E+02 +1.760041893790E+00 -5.406216555916E+00 -1.507450791000E+00 1.080000000000E+02 +1.717304114735E+00 -5.328345612706E+00 -1.512984118000E+00 1.080000000000E+02 +1.670818834450E+00 -5.252301106239E+00 -1.511502484000E+00 1.080000000000E+02 +1.624818892460E+00 -5.176519618021E+00 -1.502532507000E+00 1.080000000000E+02 +1.583823455332E+00 -5.099462870099E+00 -1.484801442000E+00 1.080000000000E+02 +1.552607361192E+00 -5.020999334931E+00 -1.456473280000E+00 1.080000000000E+02 +1.532675729254E+00 -4.943992077475E+00 -1.416487546000E+00 1.080000000000E+02 +1.523373071014E+00 -4.872172616338E+00 -1.364609021000E+00 1.080000000000E+02 +1.523157398639E+00 -4.809241263106E+00 -1.301455248000E+00 1.080000000000E+02 +1.530274638025E+00 -4.758279865867E+00 -1.228771473000E+00 1.080000000000E+02 +1.544783990752E+00 -4.721026291592E+00 -1.149164457000E+00 1.080000000000E+02 +1.567532928869E+00 -4.697697663795E+00 -1.066259509000E+00 1.080000000000E+02 +1.599914044749E+00 -4.686799614178E+00 -9.840199882000E-01 1.080000000000E+02 +1.641189161307E+00 -4.685472931231E+00 -9.050198505000E-01 1.080000000000E+02 +1.684555227442E+00 -4.691236470507E+00 -8.274301477000E-01 1.080000000000E+02 +1.721933408126E+00 -4.704060990124E+00 -7.475896770000E-01 1.080000000000E+02 +1.750099489422E+00 -4.725009566652E+00 -6.657541041000E-01 1.080000000000E+02 +1.768777981575E+00 -4.754515708522E+00 -5.837632627000E-01 1.080000000000E+02 +1.775296876348E+00 -4.792114309780E+00 -5.032871173000E-01 1.080000000000E+02 +1.766074153490E+00 -4.835562068551E+00 -4.260584823000E-01 1.080000000000E+02 +1.739106752881E+00 -4.880528677107E+00 -3.540587787000E-01 1.080000000000E+02 +1.696711977928E+00 -4.923165231547E+00 -2.882948801000E-01 1.080000000000E+02 +1.645158445285E+00 -4.962921048430E+00 -2.275175217000E-01 1.080000000000E+02 +1.590750143720E+00 -5.001906728233E+00 -1.687606404000E-01 1.080000000000E+02 +1.536677584149E+00 -5.041448419176E+00 -1.100117670000E-01 1.080000000000E+02 +1.487456112885E+00 -5.080987865533E+00 -4.718627597000E-02 1.080000000000E+02 +1.436645988281E+00 -5.113881443835E+00 1.819661694000E-02 1.080000000000E+02 +1.382447878845E+00 -5.136209051622E+00 8.530081591000E-02 1.080000000000E+02 +1.322210318504E+00 -5.149937816024E+00 1.494783330000E-01 1.080000000000E+02 +1.260199579131E+00 -5.157089949660E+00 2.130101728000E-01 1.080000000000E+02 +1.193890338142E+00 -5.161114211398E+00 2.723890661000E-01 1.080000000000E+02 +1.127592690942E+00 -5.160182643912E+00 3.318667032000E-01 1.080000000000E+02 +1.058105853804E+00 -5.159004746049E+00 3.875539046000E-01 1.080000000000E+02 +9.906221891339E-01 -5.155353292413E+00 4.456338674000E-01 1.080000000000E+02 +9.293421495714E-01 -5.148977748735E+00 5.099892243000E-01 1.080000000000E+02 +8.795400593600E-01 -5.140162780723E+00 5.833000314000E-01 1.080000000000E+02 +8.446054238926E-01 -5.131680739109E+00 6.647899090000E-01 1.080000000000E+02 +8.242658484181E-01 -5.127860689030E+00 7.514880132000E-01 1.080000000000E+02 +8.177640595793E-01 -5.131435851165E+00 8.402099046000E-01 1.080000000000E+02 +8.254163297375E-01 -5.142442050372E+00 9.282726209000E-01 1.080000000000E+02 +8.475403418228E-01 -5.158817266792E+00 1.013024536000E+00 1.080000000000E+02 +8.843423572675E-01 -5.176836737251E+00 1.092107862000E+00 1.080000000000E+02 +9.265489124845E-01 -5.200774499912E+00 1.166812923000E+00 1.080000000000E+02 +9.690900544846E-01 -5.234738445911E+00 1.237341473000E+00 1.080000000000E+02 +1.010541053647E+00 -5.280136868702E+00 1.301808004000E+00 1.080000000000E+02 +1.050408628995E+00 -5.336817601939E+00 1.357785149000E+00 1.080000000000E+02 +1.088127523327E+00 -5.403637201566E+00 1.403042952000E+00 1.080000000000E+02 +1.122905062095E+00 -5.478794195156E+00 1.435958561000E+00 1.080000000000E+02 +1.153949032354E+00 -5.559893010311E+00 1.455667884000E+00 1.080000000000E+02 +1.180504494415E+00 -5.644693010677E+00 1.462072215000E+00 1.080000000000E+02 +1.202063229591E+00 -5.730882678745E+00 1.455639493000E+00 1.080000000000E+02 +1.218945756070E+00 -5.816464654174E+00 1.437348696000E+00 1.080000000000E+02 +1.234221156280E+00 -5.899323743397E+00 1.408608053000E+00 1.080000000000E+02 +1.250519358384E+00 -5.978350529171E+00 1.370749447000E+00 1.080000000000E+02 +1.267937012003E+00 -6.052888719925E+00 1.325285698000E+00 1.080000000000E+02 +1.285933583399E+00 -6.123078679674E+00 1.273441742000E+00 1.080000000000E+02 +1.302226648810E+00 -6.189444858567E+00 1.216246575000E+00 1.080000000000E+02 +1.316953093644E+00 -6.252029384575E+00 1.154539058000E+00 1.080000000000E+02 +1.337187368769E+00 -6.309162853709E+00 1.089263674000E+00 1.080000000000E+02 +1.366777804627E+00 -6.359287989946E+00 1.021917209000E+00 1.080000000000E+02 +1.404735552021E+00 -6.402230513642E+00 9.537419589000E-01 1.080000000000E+02 +1.448041434252E+00 -6.439005442193E+00 8.850071242000E-01 1.080000000000E+02 +1.491603793043E+00 -6.471810997156E+00 8.145657329000E-01 1.080000000000E+02 +1.532177262124E+00 -6.502081533175E+00 7.412825815000E-01 1.080000000000E+02 +1.568983261654E+00 -6.529863385460E+00 6.651770142000E-01 1.080000000000E+02 +1.602215676791E+00 -6.554929604502E+00 5.863142345000E-01 1.080000000000E+02 +1.630814637835E+00 -6.577252101275E+00 5.049593618000E-01 1.080000000000E+02 +1.654063457755E+00 -6.596796474535E+00 4.212413326000E-01 1.080000000000E+02 +1.671985353578E+00 -6.613290359336E+00 3.354886308000E-01 1.080000000000E+02 +1.685194019272E+00 -6.626275756750E+00 2.484589536000E-01 1.080000000000E+02 +1.694369594367E+00 -6.635469175030E+00 1.602254120000E-01 1.080000000000E+02 +1.700278170583E+00 -6.640504147669E+00 7.150080869000E-02 1.080000000000E+02 +1.704398248500E+00 -6.640964631245E+00 -1.744954334000E-02 0.000000000000E+00 1 AAE10_SC +3.752553774E+00 -5.932588668E+00 -7.060900000E-01 3.600000000E+01 +3.760678162E+00 -5.887564453E+00 -8.029600000E-01 3.600000000E+01 +3.765162469E+00 -5.839233227E+00 -8.983500000E-01 3.600000000E+01 +3.765397121E+00 -5.787078060E+00 -9.918700000E-01 3.600000000E+01 +3.759451145E+00 -5.729686526E+00 -1.082130000E+00 3.600000000E+01 +3.747069886E+00 -5.667278058E+00 -1.168230000E+00 3.600000000E+01 +3.728483216E+00 -5.600398327E+00 -1.249630000E+00 3.600000000E+01 +3.702945532E+00 -5.528953129E+00 -1.325010000E+00 3.600000000E+01 +3.669904981E+00 -5.453153313E+00 -1.392860000E+00 3.600000000E+01 +3.629141830E+00 -5.373617037E+00 -1.451630000E+00 3.600000000E+01 +3.580923722E+00 -5.291329830E+00 -1.500110000E+00 3.600000000E+01 +3.525971929E+00 -5.207508352E+00 -1.537570000E+00 3.600000000E+01 +3.465308009E+00 -5.123387360E+00 -1.563950000E+00 3.600000000E+01 +3.400078359E+00 -5.040003325E+00 -1.579670000E+00 3.600000000E+01 +3.331323589E+00 -4.958164227E+00 -1.585460000E+00 3.600000000E+01 +3.259937391E+00 -4.878452401E+00 -1.582110000E+00 3.600000000E+01 +3.186650127E+00 -4.801303474E+00 -1.570270000E+00 3.600000000E+01 +3.112027871E+00 -4.727132851E+00 -1.550420000E+00 3.600000000E+01 +3.036582962E+00 -4.656352366E+00 -1.522840000E+00 3.600000000E+01 +2.960782796E+00 -4.589462061E+00 -1.487590000E+00 3.600000000E+01 +2.885132574E+00 -4.526981236E+00 -1.444770000E+00 3.600000000E+01 +2.810073561E+00 -4.469102983E+00 -1.394960000E+00 3.600000000E+01 +2.736160879E+00 -4.416435530E+00 -1.338190000E+00 3.600000000E+01 +2.664051625E+00 -4.369900950E+00 -1.274170000E+00 3.600000000E+01 +2.594393417E+00 -4.330003815E+00 -1.203290000E+00 3.600000000E+01 +2.527983641E+00 -4.297515472E+00 -1.125800000E+00 3.600000000E+01 +2.464195952E+00 -4.270378788E+00 -1.044140000E+00 3.600000000E+01 +2.402182174E+00 -4.246598194E+00 -9.600900000E-01 3.600000000E+01 +2.342345980E+00 -4.226736494E+00 -8.735000000E-01 3.600000000E+01 +2.284507419E+00 -4.210336941E+00 -7.848200000E-01 3.600000000E+01 +2.227918128E+00 -4.196002412E+00 -6.949900000E-01 3.600000000E+01 +2.171925542E+00 -4.182630610E+00 -6.046400000E-01 3.600000000E+01 +2.116979445E+00 -4.170958620E+00 -5.134200000E-01 3.600000000E+01 +2.063539614E+00 -4.161657192E+00 -4.210300000E-01 3.600000000E+01 +2.012644709E+00 -4.156207874E+00 -3.269400000E-01 3.600000000E+01 +1.965324597E+00 -4.156000440E+00 -2.308300000E-01 3.600000000E+01 +1.917353808E+00 -4.154858330E+00 -1.350400000E-01 3.600000000E+01 +1.868669818E+00 -4.152686199E+00 -3.963000000E-02 3.600000000E+01 +1.821237260E+00 -4.152294494E+00 5.642000000E-02 3.600000000E+01 +1.776185848E+00 -4.155250839E+00 1.535700000E-01 3.600000000E+01 +1.732877746E+00 -4.160595358E+00 2.514000000E-01 3.600000000E+01 +1.689613627E+00 -4.165978160E+00 3.492500000E-01 3.600000000E+01 +1.649414632E+00 -4.175422575E+00 4.480900000E-01 3.600000000E+01 +1.612620023E+00 -4.189228441E+00 5.477400000E-01 3.600000000E+01 +1.578648307E+00 -4.206512207E+00 6.478600000E-01 3.600000000E+01 +1.545767092E+00 -4.225113471E+00 7.481100000E-01 3.600000000E+01 +1.515224032E+00 -4.246477422E+00 8.485000000E-01 3.600000000E+01 +1.489389863E+00 -4.273240498E+00 9.489300000E-01 3.600000000E+01 +1.468617886E+00 -4.305519225E+00 1.048900000E+00 3.600000000E+01 +1.453298962E+00 -4.343481015E+00 1.147850000E+00 3.600000000E+01 +1.443969225E+00 -4.387319679E+00 1.245100000E+00 3.600000000E+01 +1.441271791E+00 -4.437299415E+00 1.339760000E+00 3.600000000E+01 +1.446199748E+00 -4.493823056E+00 1.430550000E+00 3.600000000E+01 +1.459483490E+00 -4.556905635E+00 1.516010000E+00 3.600000000E+01 +1.481474217E+00 -4.626107087E+00 1.594630000E+00 3.600000000E+01 +1.512281827E+00 -4.700697738E+00 1.664860000E+00 3.600000000E+01 +1.551734022E+00 -4.779629537E+00 1.725230000E+00 3.600000000E+01 +1.599160894E+00 -4.861585014E+00 1.774710000E+00 3.600000000E+01 +1.653216355E+00 -4.945171996E+00 1.813600000E+00 3.600000000E+01 +1.712450390E+00 -5.029358030E+00 1.843010000E+00 3.600000000E+01 +1.777229233E+00 -5.112972658E+00 1.860050000E+00 3.600000000E+01 +1.845168705E+00 -5.195150265E+00 1.868120000E+00 3.600000000E+01 +1.915074524E+00 -5.276163236E+00 1.870100000E+00 3.600000000E+01 +1.987877408E+00 -5.354216086E+00 1.860860000E+00 3.600000000E+01 +2.061699965E+00 -5.430002934E+00 1.845540000E+00 3.600000000E+01 +2.136693914E+00 -5.503116985E+00 1.823030000E+00 3.600000000E+01 +2.212216649E+00 -5.572810206E+00 1.793360000E+00 3.600000000E+01 +2.288042915E+00 -5.640428054E+00 1.759350000E+00 3.600000000E+01 +2.363627973E+00 -5.703161374E+00 1.717120000E+00 3.600000000E+01 +2.439098848E+00 -5.763439828E+00 1.670760000E+00 3.600000000E+01 +2.513403200E+00 -5.818251179E+00 1.617000000E+00 3.600000000E+01 +2.586905161E+00 -5.869201511E+00 1.558010000E+00 3.600000000E+01 +2.659396396E+00 -5.917073510E+00 1.495580000E+00 3.600000000E+01 +2.730351576E+00 -5.960250380E+00 1.427910000E+00 3.600000000E+01 +2.800638769E+00 -6.001856806E+00 1.358800000E+00 3.600000000E+01 +2.866887136E+00 -6.033945466E+00 1.280960000E+00 3.600000000E+01 +2.933129082E+00 -6.066046726E+00 1.203110000E+00 3.600000000E+01 +2.995672510E+00 -6.090874922E+00 1.119870000E+00 3.600000000E+01 +3.057436914E+00 -6.114179268E+00 1.035480000E+00 3.600000000E+01 +3.117107169E+00 -6.133821504E+00 9.488300000E-01 3.600000000E+01 +3.174717747E+00 -6.149843005E+00 8.599400000E-01 3.600000000E+01 +3.230972069E+00 -6.163729097E+00 7.699800000E-01 3.600000000E+01 +3.282036004E+00 -6.169407389E+00 6.759700000E-01 3.600000000E+01 +3.333099939E+00 -6.175085680E+00 5.819600000E-01 3.600000000E+01 +3.379822387E+00 -6.174456874E+00 4.855600000E-01 3.600000000E+01 +3.426444749E+00 -6.173681839E+00 3.891000000E-01 3.600000000E+01 +3.469339427E+00 -6.167809228E+00 2.911500000E-01 3.600000000E+01 +3.511457901E+00 -6.160874494E+00 1.928800000E-01 3.600000000E+01 +3.549235787E+00 -6.148347364E+00 9.349000000E-02 3.600000000E+01 +3.585707787E+00 -6.134131103E+00 -6.240000000E-03 3.600000000E+01 +3.617661108E+00 -6.114453913E+00 -1.065300000E-01 3.600000000E+01 +3.648630672E+00 -6.093561231E+00 -2.069400000E-01 3.600000000E+01 +3.674693785E+00 -6.067049721E+00 -3.074100000E-01 3.600000000E+01 +3.699455512E+00 -6.039089453E+00 -4.077700000E-01 3.600000000E+01 +3.720086512E+00 -6.006635725E+00 -5.077700000E-01 3.600000000E+01 +3.737542248E+00 -5.970881678E+00 -6.071600000E-01 3.600000000E+01 +3.752553774E+00 -5.932588668E+00 -7.060900000E-01 0.000000000E+00 6 AAE14_SC +5.022433275E+00 -4.798855469E+00 -7.213900000E-01 3.600000000E+01 +4.965437317E+00 -4.802265066E+00 -8.084600000E-01 3.600000000E+01 +4.903776840E+00 -4.801512362E+00 -8.923100000E-01 3.600000000E+01 +4.837846277E+00 -4.796711033E+00 -9.726500000E-01 3.600000000E+01 +4.767955184E+00 -4.787907702E+00 -1.049200000E+00 3.600000000E+01 +4.693964746E+00 -4.774642773E+00 -1.121050000E+00 3.600000000E+01 +4.614681074E+00 -4.755054034E+00 -1.185540000E+00 3.600000000E+01 +4.530713083E+00 -4.728912093E+00 -1.241260000E+00 3.600000000E+01 +4.443866670E+00 -4.697859277E+00 -1.289570000E+00 3.600000000E+01 +4.354714597E+00 -4.661846176E+00 -1.329530000E+00 3.600000000E+01 +4.264028149E+00 -4.620916593E+00 -1.360190000E+00 3.600000000E+01 +4.172766904E+00 -4.575305503E+00 -1.380740000E+00 3.600000000E+01 +4.082070178E+00 -4.525315656E+00 -1.390330000E+00 3.600000000E+01 +3.993420388E+00 -4.471043688E+00 -1.387100000E+00 3.600000000E+01 +3.907508593E+00 -4.413936887E+00 -1.373500000E+00 3.600000000E+01 +3.824703725E+00 -4.354968900E+00 -1.351240000E+00 3.600000000E+01 +3.745488869E+00 -4.294655698E+00 -1.320860000E+00 3.600000000E+01 +3.669470253E+00 -4.233629929E+00 -1.284380000E+00 3.600000000E+01 +3.596579383E+00 -4.172166197E+00 -1.242550000E+00 3.600000000E+01 +3.526254414E+00 -4.110541690E+00 -1.196770000E+00 3.600000000E+01 +3.457343398E+00 -4.048867831E+00 -1.148930000E+00 3.600000000E+01 +3.389049129E+00 -3.987182843E+00 -1.100210000E+00 3.600000000E+01 +3.321918448E+00 -3.925519337E+00 -1.049910000E+00 3.600000000E+01 +3.256185310E+00 -3.863885415E+00 -9.977300000E-01 3.600000000E+01 +3.191508054E+00 -3.802297457E+00 -9.442200000E-01 3.600000000E+01 +3.127665328E+00 -3.740753783E+00 -8.896400000E-01 3.600000000E+01 +3.064600067E+00 -3.679272933E+00 -8.341100000E-01 3.600000000E+01 +3.002533625E+00 -3.617856589E+00 -7.773900000E-01 3.600000000E+01 +2.941250829E+00 -3.556522090E+00 -7.197400000E-01 3.600000000E+01 +2.880565278E+00 -3.495245886E+00 -6.614000000E-01 3.600000000E+01 +2.821803890E+00 -3.434196167E+00 -6.009100000E-01 3.600000000E+01 +2.765418163E+00 -3.373468071E+00 -5.378800000E-01 3.600000000E+01 +2.711979178E+00 -3.313233537E+00 -4.719100000E-01 3.600000000E+01 +2.662089402E+00 -3.253696369E+00 -4.026100000E-01 3.600000000E+01 +2.616467796E+00 -3.195127664E+00 -3.296700000E-01 3.600000000E+01 +2.575861135E+00 -3.137884114E+00 -2.528300000E-01 3.600000000E+01 +2.541031642E+00 -3.082369963E+00 -1.720200000E-01 3.600000000E+01 +2.512775535E+00 -3.029094073E+00 -8.727000000E-02 3.600000000E+01 +2.491595641E+00 -2.978471369E+00 1.130000000E-03 3.600000000E+01 +2.479374931E+00 -2.931572376E+00 9.328000000E-02 3.600000000E+01 +2.476742931E+00 -2.889201952E+00 1.882300000E-01 3.600000000E+01 +2.480874195E+00 -2.850301393E+00 2.844900000E-01 3.600000000E+01 +2.492246592E+00 -2.815241159E+00 3.818700000E-01 3.600000000E+01 +2.515594126E+00 -2.787361864E+00 4.791500000E-01 3.600000000E+01 +2.542297475E+00 -2.761494013E+00 5.764100000E-01 3.600000000E+01 +2.579518265E+00 -2.742786547E+00 6.716100000E-01 3.600000000E+01 +2.619397540E+00 -2.725886002E+00 7.663000000E-01 3.600000000E+01 +2.666058018E+00 -2.714258007E+00 8.581300000E-01 3.600000000E+01 +2.720757133E+00 -2.708892441E+00 9.465600000E-01 3.600000000E+01 +2.775453157E+00 -2.703517366E+00 1.034990000E+00 3.600000000E+01 +2.840249925E+00 -2.707288642E+00 1.116160000E+00 3.600000000E+01 +2.906783404E+00 -2.712651125E+00 1.196060000E+00 3.600000000E+01 +2.977657772E+00 -2.722733193E+00 1.270980000E+00 3.600000000E+01 +3.055416367E+00 -2.740346523E+00 1.337940000E+00 3.600000000E+01 +3.135002187E+00 -2.760541568E+00 1.401440000E+00 3.600000000E+01 +3.220157404E+00 -2.788589944E+00 1.454390000E+00 3.600000000E+01 +3.307213199E+00 -2.820804938E+00 1.500280000E+00 3.600000000E+01 +3.397463483E+00 -2.860036180E+00 1.534290000E+00 3.600000000E+01 +3.488496837E+00 -2.904007433E+00 1.558340000E+00 3.600000000E+01 +3.579668135E+00 -2.950636123E+00 1.576410000E+00 3.600000000E+01 +3.670325828E+00 -3.001185414E+00 1.584630000E+00 3.600000000E+01 +3.759663530E+00 -3.054403210E+00 1.584800000E+00 3.600000000E+01 +3.847763807E+00 -3.109411000E+00 1.579120000E+00 3.600000000E+01 +3.934164931E+00 -3.166211604E+00 1.566880000E+00 3.600000000E+01 +4.018007651E+00 -3.224684653E+00 1.547210000E+00 3.600000000E+01 +4.100009822E+00 -3.283997569E+00 1.523040000E+00 3.600000000E+01 +4.180105830E+00 -3.344045497E+00 1.494500000E+00 3.600000000E+01 +4.257977086E+00 -3.404721658E+00 1.461420000E+00 3.600000000E+01 +4.333283129E+00 -3.465884325E+00 1.423650000E+00 3.600000000E+01 +4.406645718E+00 -3.527278903E+00 1.382610000E+00 3.600000000E+01 +4.478014688E+00 -3.588848088E+00 1.338430000E+00 3.600000000E+01 +4.547340118E+00 -3.650502956E+00 1.291210000E+00 3.600000000E+01 +4.614442267E+00 -3.712175732E+00 1.240850000E+00 3.600000000E+01 +4.679075301E+00 -3.773757030E+00 1.187270000E+00 3.600000000E+01 +4.741505274E+00 -3.835191946E+00 1.131000000E+00 3.600000000E+01 +4.801609511E+00 -3.896394165E+00 1.072020000E+00 3.600000000E+01 +4.859227291E+00 -3.957289733E+00 1.010300000E+00 3.600000000E+01 +4.914125381E+00 -4.017775683E+00 9.457800000E-01 3.600000000E+01 +4.966086479E+00 -4.077733359E+00 8.783800000E-01 3.600000000E+01 +5.014792236E+00 -4.137024360E+00 8.080400000E-01 3.600000000E+01 +5.059937143E+00 -4.195485088E+00 7.346800000E-01 3.600000000E+01 +5.101114888E+00 -4.252900580E+00 6.582400000E-01 3.600000000E+01 +5.137972889E+00 -4.309059441E+00 5.787300000E-01 3.600000000E+01 +5.170079873E+00 -4.363702247E+00 4.961700000E-01 3.600000000E+01 +5.197080647E+00 -4.416544850E+00 4.106700000E-01 3.600000000E+01 +5.218616692E+00 -4.467325214E+00 3.224100000E-01 3.600000000E+01 +5.234279563E+00 -4.515692378E+00 2.316100000E-01 3.600000000E+01 +5.243282795E+00 -4.561102769E+00 1.384300000E-01 3.600000000E+01 +5.245237205E+00 -4.603167624E+00 4.327000000E-02 3.600000000E+01 +5.240267632E+00 -4.641688660E+00 -5.326000000E-02 3.600000000E+01 +5.228423068E+00 -4.676460696E+00 -1.506200000E-01 3.600000000E+01 +5.209865913E+00 -4.707336334E+00 -2.482300000E-01 3.600000000E+01 +5.184887424E+00 -4.734273511E+00 -3.455700000E-01 3.600000000E+01 +5.153854463E+00 -4.757268687E+00 -4.421800000E-01 3.600000000E+01 +5.116913259E+00 -4.776221777E+00 -5.375700000E-01 3.600000000E+01 +5.073512019E+00 -4.790502443E+00 -6.310500000E-01 3.600000000E+01 +5.022433275E+00 -4.798855469E+00 -7.213900000E-01 0.000000000E+00 7 AAE23_SC +6.116003297E+00 -3.293685486E+00 7.213900000E-01 3.600000000E+01 +6.123849653E+00 -3.344855255E+00 6.310500000E-01 3.600000000E+01 +6.123667303E+00 -3.390537450E+00 5.375700000E-01 3.600000000E+01 +6.117062960E+00 -3.431534860E+00 4.421800000E-01 3.600000000E+01 +6.104777457E+00 -3.468153535E+00 3.455700000E-01 3.600000000E+01 +6.086884750E+00 -3.500232754E+00 2.482300000E-01 3.600000000E+01 +6.063248390E+00 -3.527417297E+00 1.506200000E-01 3.600000000E+01 +6.033842006E+00 -3.549431838E+00 5.326000000E-02 3.600000000E+01 +5.998733613E+00 -3.566065014E+00 -4.327000000E-02 3.600000000E+01 +5.958136013E+00 -3.577195108E+00 -1.384300000E-01 3.600000000E+01 +5.912157873E+00 -3.582671151E+00 -2.316100000E-01 3.600000000E+01 +5.861316064E+00 -3.582724758E+00 -3.224100000E-01 3.600000000E+01 +5.806374698E+00 -3.577927793E+00 -4.106700000E-01 3.600000000E+01 +5.747767902E+00 -3.568580815E+00 -4.961600000E-01 3.600000000E+01 +5.685879639E+00 -3.554927079E+00 -5.787300000E-01 3.600000000E+01 +5.621081028E+00 -3.537235041E+00 -6.582400000E-01 3.600000000E+01 +5.553742953E+00 -3.515804779E+00 -7.346800000E-01 3.600000000E+01 +5.484207763E+00 -3.490945642E+00 -8.080400000E-01 3.600000000E+01 +5.412767404E+00 -3.462941296E+00 -8.783800000E-01 3.600000000E+01 +5.339685533E+00 -3.432053059E+00 -9.457800000E-01 3.600000000E+01 +5.265188001E+00 -3.398522983E+00 -1.010300000E+00 3.600000000E+01 +5.189475700E+00 -3.362548662E+00 -1.072020000E+00 3.600000000E+01 +5.112689610E+00 -3.324305096E+00 -1.131000000E+00 3.600000000E+01 +5.034971187E+00 -3.283904041E+00 -1.187270000E+00 3.600000000E+01 +4.956433358E+00 -3.241466525E+00 -1.240850000E+00 3.600000000E+01 +4.877046663E+00 -3.196707711E+00 -1.291210000E+00 3.600000000E+01 +4.796980369E+00 -3.149824950E+00 -1.338430000E+00 3.600000000E+01 +4.716369277E+00 -3.100974223E+00 -1.382610000E+00 3.600000000E+01 +4.635308010E+00 -3.050187871E+00 -1.423650000E+00 3.600000000E+01 +4.553866234E+00 -2.997453774E+00 -1.461420000E+00 3.600000000E+01 +4.472092971E+00 -2.942146154E+00 -1.494500000E+00 3.600000000E+01 +4.390242367E+00 -2.884529418E+00 -1.523040000E+00 3.600000000E+01 +4.308492721E+00 -2.824861071E+00 -1.547210000E+00 3.600000000E+01 +4.226976462E+00 -2.763192716E+00 -1.566880000E+00 3.600000000E+01 +4.146247873E+00 -2.698576689E+00 -1.579120000E+00 3.600000000E+01 +4.066715367E+00 -2.631784544E+00 -1.584800000E+00 3.600000000E+01 +3.988483050E+00 -2.563266130E+00 -1.584630000E+00 3.600000000E+01 +3.912394753E+00 -2.492673666E+00 -1.576410000E+00 3.600000000E+01 +3.839883419E+00 -2.420372215E+00 -1.558340000E+00 3.600000000E+01 +3.769926136E+00 -2.347388108E+00 -1.534290000E+00 3.600000000E+01 +3.704724315E+00 -2.273668484E+00 -1.500280000E+00 3.600000000E+01 +3.647190855E+00 -2.200832451E+00 -1.454390000E+00 3.600000000E+01 +3.594200923E+00 -2.128517915E+00 -1.401440000E+00 3.600000000E+01 +3.550404429E+00 -2.059062380E+00 -1.337940000E+00 3.600000000E+01 +3.509627163E+00 -1.990550015E+00 -1.270980000E+00 3.600000000E+01 +3.478130968E+00 -1.926266621E+00 -1.196060000E+00 3.600000000E+01 +3.452471314E+00 -1.864639652E+00 -1.116160000E+00 3.600000000E+01 +3.428864620E+00 -1.804185694E+00 -1.034990000E+00 3.600000000E+01 +3.417068564E+00 -1.750503481E+00 -9.465600000E-01 3.600000000E+01 +3.405269418E+00 -1.696811758E+00 -8.581200000E-01 3.600000000E+01 +3.401914562E+00 -1.648851104E+00 -7.663000000E-01 3.600000000E+01 +3.405654309E+00 -1.605703673E+00 -6.716100000E-01 3.600000000E+01 +3.411956475E+00 -1.564520551E+00 -5.764100000E-01 3.600000000E+01 +3.428296952E+00 -1.531126652E+00 -4.791500000E-01 3.600000000E+01 +3.447599951E+00 -1.500313599E+00 -3.818700000E-01 3.600000000E+01 +3.477427379E+00 -1.478656441E+00 -2.844900000E-01 3.600000000E+01 +3.513147238E+00 -1.462707816E+00 -1.882300000E-01 3.600000000E+01 +3.554256217E+00 -1.452116045E+00 -9.328000000E-02 3.600000000E+01 +3.602636955E+00 -1.449245058E+00 -1.130000000E-03 3.600000000E+01 +3.657337017E+00 -1.453752415E+00 8.727000000E-02 3.600000000E+01 +3.716739038E+00 -1.464155336E+00 1.720200000E-01 3.600000000E+01 +3.780295247E+00 -1.480127102E+00 2.528300000E-01 3.600000000E+01 +3.847282902E+00 -1.501061374E+00 3.296700000E-01 3.600000000E+01 +3.917074127E+00 -1.526352537E+00 4.026200000E-01 3.600000000E+01 +3.989113800E+00 -1.555392364E+00 4.719100000E-01 3.600000000E+01 +4.062922403E+00 -1.587611151E+00 5.378800000E-01 3.600000000E+01 +4.138092932E+00 -1.622468206E+00 6.009100000E-01 3.600000000E+01 +4.214322282E+00 -1.659483709E+00 6.614000000E-01 3.600000000E+01 +4.291357267E+00 -1.698266768E+00 7.197400000E-01 3.600000000E+01 +4.368622124E+00 -1.737595499E+00 7.773900000E-01 3.600000000E+01 +4.446207190E+00 -1.777650843E+00 8.341100000E-01 3.600000000E+01 +4.524177357E+00 -1.818632522E+00 8.896400000E-01 3.600000000E+01 +4.602423509E+00 -1.860334155E+00 9.442200000E-01 3.600000000E+01 +4.680986299E+00 -1.902816134E+00 9.977300000E-01 3.600000000E+01 +4.759921110E+00 -1.946281271E+00 1.049910000E+00 3.600000000E+01 +4.839320166E+00 -1.991078127E+00 1.100210000E+00 3.600000000E+01 +4.919081012E+00 -2.036956098E+00 1.148930000E+00 3.600000000E+01 +4.999030119E+00 -2.083445835E+00 1.196770000E+00 3.600000000E+01 +5.079373807E+00 -2.131279412E+00 1.242550000E+00 3.600000000E+01 +5.160349989E+00 -2.181609737E+00 1.284380000E+00 3.600000000E+01 +5.241884441E+00 -2.235049746E+00 1.320860000E+00 3.600000000E+01 +5.323719895E+00 -2.291746118E+00 1.351240000E+00 3.600000000E+01 +5.405393395E+00 -2.352280376E+00 1.373500000E+00 3.600000000E+01 +5.486246372E+00 -2.416340771E+00 1.387100000E+00 3.600000000E+01 +5.565264077E+00 -2.483878488E+00 1.390330000E+00 3.600000000E+01 +5.640825723E+00 -2.554694645E+00 1.380740000E+00 3.600000000E+01 +5.712413812E+00 -2.627390708E+00 1.360180000E+00 3.600000000E+01 +5.779352705E+00 -2.700987537E+00 1.329530000E+00 3.600000000E+01 +5.841158626E+00 -2.774643433E+00 1.289570000E+00 3.600000000E+01 +5.897527057E+00 -2.847647714E+00 1.241260000E+00 3.600000000E+01 +5.948345342E+00 -2.919427135E+00 1.185540000E+00 3.600000000E+01 +5.991465896E+00 -2.988776343E+00 1.121050000E+00 3.600000000E+01 +6.026950583E+00 -3.055044359E+00 1.049200000E+00 3.600000000E+01 +6.056920169E+00 -3.118803860E+00 9.726500000E-01 3.600000000E+01 +6.081868241E+00 -3.180020645E+00 8.923100000E-01 3.600000000E+01 +6.101635521E+00 -3.238431027E+00 8.084600000E-01 3.600000000E+01 +6.116003297E+00 -3.293685486E+00 7.213900000E-01 0.000000000E+00 7 AAE23_SC +6.801823680E+00 -1.735628600E+00 7.060900000E-01 3.600000000E+01 +6.833610799E+00 -1.709517891E+00 6.071600000E-01 3.600000000E+01 +6.862215633E+00 -1.681865087E+00 5.077700000E-01 3.600000000E+01 +6.886708817E+00 -1.652204589E+00 4.077700000E-01 3.600000000E+01 +6.905649096E+00 -1.620016314E+00 3.074100000E-01 3.600000000E+01 +6.922808622E+00 -1.587039741E+00 2.069400000E-01 3.600000000E+01 +6.933109026E+00 -1.551139666E+00 1.065300000E-01 3.600000000E+01 +6.941959146E+00 -1.514659355E+00 6.240000000E-03 3.600000000E+01 +6.944203809E+00 -1.475583193E+00 -9.349000000E-02 3.600000000E+01 +6.944436375E+00 -1.435783385E+00 -1.928800000E-01 3.600000000E+01 +6.938020911E+00 -1.393580306E+00 -2.911500000E-01 3.600000000E+01 +6.930346784E+00 -1.350966052E+00 -3.891000000E-01 3.600000000E+01 +6.916685326E+00 -1.306396274E+00 -4.855600000E-01 3.600000000E+01 +6.902834617E+00 -1.261761813E+00 -5.819600000E-01 3.600000000E+01 +6.881654208E+00 -1.214956084E+00 -6.759700000E-01 3.600000000E+01 +6.860480219E+00 -1.168137754E+00 -7.699800000E-01 3.600000000E+01 +6.829897349E+00 -1.118929981E+00 -8.599400000E-01 3.600000000E+01 +6.796849444E+00 -1.069093157E+00 -9.488300000E-01 3.600000000E+01 +6.759728560E+00 -1.018403198E+00 -1.035480000E+00 3.600000000E+01 +6.718484054E+00 -9.668660435E-01 -1.119870000E+00 3.600000000E+01 +6.675543397E+00 -9.150598609E-01 -1.203110000E+00 3.600000000E+01 +6.624542107E+00 -8.619718122E-01 -1.280960000E+00 3.600000000E+01 +6.573553418E+00 -8.088901839E-01 -1.358800000E+00 3.600000000E+01 +6.512259152E+00 -7.548986185E-01 -1.427910000E+00 3.600000000E+01 +6.449267776E+00 -7.007645125E-01 -1.495580000E+00 3.600000000E+01 +6.381340058E+00 -6.466150692E-01 -1.558010000E+00 3.600000000E+01 +6.310170980E+00 -5.924568311E-01 -1.617000000E+00 3.600000000E+01 +6.235077429E+00 -5.387115323E-01 -1.670760000E+00 3.600000000E+01 +6.154429320E+00 -4.855723520E-01 -1.717120000E+00 3.600000000E+01 +6.071410950E+00 -4.330666260E-01 -1.759350000E+00 3.600000000E+01 +5.983667750E+00 -3.818437395E-01 -1.793360000E+00 3.600000000E+01 +5.894054748E+00 -3.315648563E-01 -1.823030000E+00 3.600000000E+01 +5.801337221E+00 -2.828309402E-01 -1.845540000E+00 3.600000000E+01 +5.706445013E+00 -2.360443462E-01 -1.860860000E+00 3.600000000E+01 +5.609725035E+00 -1.909136075E-01 -1.870100000E+00 3.600000000E+01 +5.511070148E+00 -1.494713138E-01 -1.868120000E+00 3.600000000E+01 +5.411917709E+00 -1.102515507E-01 -1.860050000E+00 3.600000000E+01 +5.312381753E+00 -7.447902050E-02 -1.843010000E+00 3.600000000E+01 +5.214009228E+00 -4.416408380E-02 -1.813600000E+00 3.600000000E+01 +5.117804955E+00 -1.858069909E-02 -1.774710000E+00 3.600000000E+01 +5.025209198E+00 1.203968794E-03 -1.725230000E+00 3.600000000E+01 +4.937951586E+00 1.433243700E-02 -1.664860000E+00 3.600000000E+01 +4.857491467E+00 2.058491065E-02 -1.594630000E+00 3.600000000E+01 +4.784883073E+00 2.011466743E-02 -1.516010000E+00 3.600000000E+01 +4.720777171E+00 1.324881580E-02 -1.430550000E+00 3.600000000E+01 +4.665500003E+00 4.718838992E-04 -1.339760000E+00 3.600000000E+01 +4.618800544E+00 -1.754063807E-02 -1.245100000E+00 3.600000000E+01 +4.579989355E+00 -3.996130040E-02 -1.147850000E+00 3.600000000E+01 +4.548618300E+00 -6.625226077E-02 -1.048900000E+00 3.600000000E+01 +4.524339569E+00 -9.599028376E-02 -9.489300000E-01 3.600000000E+01 +4.506874296E+00 -1.288348789E-01 -8.485000000E-01 3.600000000E+01 +4.495997108E+00 -1.644807479E-01 -7.481100000E-01 3.600000000E+01 +4.488458425E+00 -2.015022924E-01 -6.478600000E-01 3.600000000E+01 +4.482521475E+00 -2.391494960E-01 -5.477400000E-01 3.600000000E+01 +4.480765631E+00 -2.784032997E-01 -4.480900000E-01 3.600000000E+01 +4.484200630E+00 -3.195559823E-01 -3.492500000E-01 3.600000000E+01 +4.492445600E+00 -3.623737993E-01 -2.514000000E-01 3.600000000E+01 +4.500759995E+00 -4.052111176E-01 -1.535700000E-01 3.600000000E+01 +4.511862993E+00 -4.489613934E-01 -5.642000000E-02 3.600000000E+01 +4.526884161E+00 -4.939620881E-01 3.963000000E-02 3.600000000E+01 +4.544003502E+00 -5.395953728E-01 1.350400000E-01 3.600000000E+01 +4.559908161E+00 -5.848557640E-01 2.308300000E-01 3.600000000E+01 +4.574730567E+00 -6.297948648E-01 3.269400000E-01 3.600000000E+01 +4.595642790E+00 -6.765194988E-01 4.210300000E-01 3.600000000E+01 +4.620991973E+00 -7.244731912E-01 5.134100000E-01 3.600000000E+01 +4.649077707E+00 -7.731149177E-01 6.046400000E-01 3.600000000E+01 +4.679098284E+00 -8.222425254E-01 6.949900000E-01 3.600000000E+01 +4.710223707E+00 -8.716315099E-01 7.848200000E-01 3.600000000E+01 +4.743681976E+00 -9.215663197E-01 8.735000000E-01 3.600000000E+01 +4.781071046E+00 -9.723373740E-01 9.600900000E-01 3.600000000E+01 +4.822849313E+00 -1.023963964E+00 1.044140000E+00 3.600000000E+01 +4.868373181E+00 -1.076245138E+00 1.125800000E+00 3.600000000E+01 +4.919788406E+00 -1.129377440E+00 1.203290000E+00 3.600000000E+01 +4.979261685E+00 -1.183298259E+00 1.274170000E+00 3.600000000E+01 +5.045794470E+00 -1.237490873E+00 1.338190000E+00 3.600000000E+01 +5.118726062E+00 -1.291507535E+00 1.394960000E+00 3.600000000E+01 +5.196977540E+00 -1.345004843E+00 1.444770000E+00 3.600000000E+01 +5.279767176E+00 -1.397647977E+00 1.487590000E+00 3.600000000E+01 +5.366806834E+00 -1.449067914E+00 1.522840000E+00 3.600000000E+01 +5.457437947E+00 -1.498952906E+00 1.550420000E+00 3.600000000E+01 +5.551036657E+00 -1.547000953E+00 1.570270000E+00 3.600000000E+01 +5.647058523E+00 -1.592863224E+00 1.582110000E+00 3.600000000E+01 +5.744924871E+00 -1.636117893E+00 1.585460000E+00 3.600000000E+01 +5.844007344E+00 -1.676222588E+00 1.579670000E+00 3.600000000E+01 +5.943473126E+00 -1.712491078E+00 1.563950000E+00 3.600000000E+01 +6.042220971E+00 -1.744187656E+00 1.537570000E+00 3.600000000E+01 +6.138922102E+00 -1.770555918E+00 1.500110000E+00 3.600000000E+01 +6.232082252E+00 -1.790977344E+00 1.451630000E+00 3.600000000E+01 +6.320324820E+00 -1.805163196E+00 1.392860000E+00 3.600000000E+01 +6.402618405E+00 -1.813175216E+00 1.325020000E+00 3.600000000E+01 +6.478460597E+00 -1.815376425E+00 1.249630000E+00 3.600000000E+01 +6.547802372E+00 -1.812392599E+00 1.168230000E+00 3.600000000E+01 +6.610983440E+00 -1.804880928E+00 1.082140000E+00 3.600000000E+01 +6.667412735E+00 -1.792802139E+00 9.918700000E-01 3.600000000E+01 +6.716936168E+00 -1.776458649E+00 8.983500000E-01 3.600000000E+01 +6.761513243E+00 -1.757253614E+00 8.029600000E-01 3.600000000E+01 +6.801823680E+00 -1.735628600E+00 7.060900000E-01 0.000000000E+00 6 AAE14_SC +end diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.json new file mode 100644 index 000000000..892fa40dc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a934986c84af94e97f66a77a02209812405b29bf5a4555bf42950094b8359649 +size 9480 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.out.h5 b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.out.h5 new file mode 100644 index 000000000..c3e35624e Binary files /dev/null and b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.out.h5 differ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..c3a742794 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8448399bcd22cb9c434782af2ab56d010621b1a6bf178176e287e58a8ddf1d22 +size 321992 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..cd257da2d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7afb1c2634db5a37c6db44ba875ae85d67d8eeafb792f365f02ccb7771b2bdcf +size 322027 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..0b638d5db --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/add_fluxes/add_fluxes_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d44c83895631a3d3d523debd43edcedd9a2148f6ce106a1a512b64ec82970095 +size 322262 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..bdd82c4fb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa3e1eaba9c8e1060fbf2e15d6780ab50423725e2a5862712cfaaba5fe113c25 +size 523044 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..c96b30b1b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537dc7224f7fcb56051a52d2c56598eafb86a9b03cabcad7e19664b808a5c4a8 +size 652118 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..0c30a40a0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcontrav/bcontrav_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3892400f99581c24c1fa35fd54c3e96c7d83bbb903b849ee5291f414095773b +size 643077 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..002dded5d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7cb83db72861eb36935b0e3a18c5280dc291085cfaf164ffed5c5fad598522f +size 974291 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..1606ab729 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:122091172bf31b5eff15aec1c86488bead2f641a35ca0c70fdfd2307943a4d3a +size 974745 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..feca16931 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov/bcov_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d005b8d6a91b5fbbcf3037bad43d760c08467cbe49e6d540af570638e52dd517 +size 975997 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..71364cda3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ddb44a623e79d4d0dab6580fea4b829a533f449d373daf6e352ca3492cc2afa +size 667997 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..78928129d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5381bc2bd266000561b4ce8748ff352acfc120b68cb54be19c410ba9c91dce9 +size 668330 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..4133e7157 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcov_full/bcov_full_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b52c3f395ee5a9d260a1f198c57906963b7f31bc46330edfe2bce93d8ae382e5 +size 669332 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcovar_fileout/bcovar_fileout_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcovar_fileout/bcovar_fileout_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..a1068adbc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bcovar_fileout/bcovar_fileout_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d7a87b7fe267d8566690d13332074c8c059e49502e3e0552cd867b1fe8384ad +size 1957060 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bss/bss_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bss/bss_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..9285e0337 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/bss/bss_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d301126c98f30b7eab48c75ccb4fca1aaed32a15ae9df0e796e041d47d7b261 +size 3292806 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..2f60cea57 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99c3e8bd7435eddaa03e571ca448c0b60ba1082076380365a0bb4dfc28c82607 +size 5223 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..72b96f53d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22568e7e64792c8d7ab9323d410c22b20344e35f29818a13f5d06780d79525a6 +size 5257 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..0c581632a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/calc_fbal/calc_fbal_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:829f602e8898b562d81d41623a072c3b8192f599c2aa67811a2407a67167e0a2 +size 5283 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..9cfe5e4a2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05340e0a34aae25338942c4cd240a79db5adc305023f53066f46cd263126c3ed +size 2748040 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..90824d1d8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8968a16ac2316f459f6f00278ba1295da2238a58dc05be44b53041c765c469aa +size 2744968 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..fedcd7c83 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/constraint_force/constraint_force_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cd24421dbe382d31983e54657328439e9f36161fe8eb9cf1f7cfacd6f3fa4c6 +size 2748112 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/evolve/evolve_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/evolve/evolve_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..10ea5999b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/evolve/evolve_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e96ce0524a461844c58914cea10c4a1609b335c708c2bbffc1bc03114b08adac +size 931448 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/evolve/evolve_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/evolve/evolve_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..2f64608e6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/evolve/evolve_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c16fb7e371839865c4cdd820431c009683ad88ae24b8495e9a2668c7b6c45d8 +size 1003648 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fixaray/fixaray_00000_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fixaray/fixaray_00000_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..e0b9d3e1e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fixaray/fixaray_00000_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36108b8e7de774cf743880e8a33a686ee6aa8499e8b5f8012208b2c2b8e1faa0 +size 300299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forceNorms_tcon/forceNorms_tcon_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forceNorms_tcon/forceNorms_tcon_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..2262ae5dc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forceNorms_tcon/forceNorms_tcon_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4f9ff6af54e814b8901a139673860fc4d415ca256bfce02857d343c52042662 +size 519180 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..4e5ae9854 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59f9d9f58a54620c141df8039284e494e4a0522df136196ffb1b6875a12c54da +size 19271539 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..ee8a8e5c7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98683683443371b210cf2208517f711a281b85c37122ed5fa8fee6fe0b7678b2 +size 19265477 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..e2094061b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/forces/forces_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f276e4ed6379650b951c6fa1937ba4d2f071ffd4e8a1f27ea002c115c8f0e39f +size 19287675 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..34acd164f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49470b05c4ad46384fbb7b4bab17a734ce3e5514832bd70c17b947162aa423d7 +size 237 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..fd7c37a69 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4beb6b35c51314df2c7eba462dde90a59d4688b3dbfcb210d01b45be8b839bd6 +size 239 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..309e88f6c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq/fsq_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9a4e8278d811a9a4bb77a192a0b35a2e8a32b0607103ec5a272b5a37cb99cf3 +size 245 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..6faf6a44c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91059beacab0f78eef1f2ba3743542d78bc797a3b80271d9e47c083845820908 +size 144 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..6ccd613fa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc3f78c1fc34354d8efb290c676512259213a23092fe64cc2dfb9c41ab0ec1b3 +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..9d2d1e162 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/fsq1/fsq1_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e148ac13b92682d425e90a8ea10b785d3567fdb7862f8ba9509b11d2c7fd4f12 +size 145 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..d61a9bae5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:838293c900bc07ea512437f683d793c40013269c2051807efaa44f922141f9c8 +size 6896495 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..f6f5a0dc9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdd5ac0368a1a5b3214917bf3f14dcc4308bd27d37e729d830023a769d6b3d73 +size 7453050 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..189995f55 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/funct3d_geometry/funct3d_geometry_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c18abcdd78bb7eef0e69ae5534344e223ceaccbb500e841571df8f50b16d6eb +size 7428251 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..cb9d99b28 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:670faefdfe07af691bcece979e5bf2475ed721f0c7caa017425810220826cc0d +size 1995759 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..e17791a9d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c8602d68693101653b01c6a492d61f4934af87a5520ab952372e409a732750b +size 1995669 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..f47615cd0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jacobian/jacobian_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd351809713b3657886cbd254d3e1e09c9b9b5edcfe4d7d2487f00fee17673a7 +size 1995514 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..bb05b8998 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c547db400d99b1c3752be106b9c69c21cf0c51855eba9f052820a1d2fbc8493f +size 3019883 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jxbout/jxbout_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jxbout/jxbout_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..be2ff0476 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/jxbout/jxbout_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d5d42841c272b7c55b1b8287092b5d3e4f90864bfbdf26102c23782da80c032 +size 4711960 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..ed7ffe52e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62e3ce7bbe20112cadfda8a7ed1bc466f03aba3603d3abdcfa02fa1e7de9124d +size 1582699 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..b3b21f6d8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caad57d1a147b4df0bb6c441319d05d1390aee9e867486899fc62fb1351dc04f +size 1735107 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..0fc001404 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lambda_forces/lambda_forces_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eac0f4bd74ba57e2cabb9cd46ebf0a42123486dd5f43541d892ae0fe068c4f79 +size 1732345 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lamcal/lamcal_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lamcal/lamcal_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..7ef22cff3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lamcal/lamcal_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1000d2bd0d881abb78c474891cfaa27717795ea087f403e9bb16c091fdd9393 +size 28732 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..f7c35c05f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eeca4f8f314eb8cf09c2c6051226958015bdab2e476ab7d3e6ca9e82ff645d8 +size 3923132 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..52c83b0c8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:600c4e5677e462065f9e8c208547dfc8dcfd666e15cceb4b1566ab65d23e96fd +size 4228922 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..d25a65568 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/lulv_comb/lulv_comb_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a8f11f44e734c52aab7982f5e981b77f2d5e9b8dfdea9e55694c2df4e2b16c0 +size 4224548 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/mercier/mercier_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/mercier/mercier_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..43b032ab1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/mercier/mercier_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d183e53794167b85766d845882e5f16ec83c82c15ed5cdc05befa7b28775f6f8 +size 1219711 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..4432866f7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:045bd9f35f1b5732556ce069519181ca231c8d23db7bd205bcafb0cfbf78f55d +size 1645716 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..c2fab1408 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53344a840ac2a8ca71082217405640f0509e417dc9f8aa861add6a43e365e596 +size 1645762 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..828ad8d5b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/metric/metric_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fa811453cb3e250f87c6ecbe8150e7316ac6560871681a4e512c1fe16300002 +size 1645902 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/multigrid_result/multigrid_result_00025_000121_00.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/multigrid_result/multigrid_result_00025_000121_00.cth_like_fixed_bdy.json new file mode 100644 index 000000000..e3b21de8c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/multigrid_result/multigrid_result_00025_000121_00.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a7cd1bbdd7cf46ca1b78c1b4a300229e9ab6178f54fc2b0dd67e8614f56f2ae +size 371149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..d90f417f3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb78dde0bd1ef21872b7948303161e8605ec4d1fb4d96f2e29f822c3d0dc32e0 +size 176405 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..456eb8956 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a4dc70935d6afa2ff2f3a577f5c5bb07fa1efa55d34e2dc5db6b0652339a17a +size 178627 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..8c415a351 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/phys_gc/phys_gc_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a6ab3a2b7300002e09b797b8436d66213dabddeb4bd229473cca709ff44f581 +size 176899 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/precondn/precondn_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/precondn/precondn_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..5b871492e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/precondn/precondn_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59c2bab79ef330048ebc336792de9d42206ff66ad007fc61a803805d53289273 +size 18154 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/printout/printout_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/printout/printout_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..cafab4463 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/printout/printout_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d27f23f267f1524813865222e654781749eeab11d97ae1cb7f78a06c24458b62 +size 184410 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/printout/printout_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/printout/printout_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..fd650e3e2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/printout/printout_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c09ad7c1e101b9fb7d260e3cfebd4b074db5d97951498466afb640faa70b7db6 +size 202161 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/profil1d/profil1d_00025_000001_00.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/profil1d/profil1d_00025_000001_00.cth_like_fixed_bdy.json new file mode 100644 index 000000000..493601a82 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/profil1d/profil1d_00025_000001_00.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e9e65fb3a128c91616a0211efc9d47139decb960cb907b0b9664d406e1020cc +size 8148 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/profil3d/profil3d_00025_000001_00.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/profil3d/profil3d_00025_000001_00.cth_like_fixed_bdy.json new file mode 100644 index 000000000..98c9deeb4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/profil3d/profil3d_00025_000001_00.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f479e3b8f3755a01c9d9a83c058a24e4c900999a0d4b645d2fcb423677906e18 +size 140142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/readin_boundary/readin_boundary_00000_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/readin_boundary/readin_boundary_00000_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..dd4e8995e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/readin_boundary/readin_boundary_00000_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbda15232ad0611becd1526b6bb8b296aaef147626f1940f5f85e95f61b25426 +size 3710 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..c3c44eee7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14c752684288d8ef4c40ee830df813d4ad4701659a123f938e02cfba7b329047 +size 116570 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..f6d1aa8fb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:250bc5e65c5a74b824195c10aa2b82bab0755efa112e596efa9293a4e1dcc29b +size 118837 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..eef12d9db --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scale_m1/scale_m1_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c02568c2ca69a1387534ca4021e1b6afa635df7cc426cbb78f3f7992c87b050 +size 116953 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..5bf10a180 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b99df7b546b770603bd86026f511367d3cc97e8f2c5ae1a9df535a5b0613b455 +size 76922 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..5bf10a180 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b99df7b546b770603bd86026f511367d3cc97e8f2c5ae1a9df535a5b0613b455 +size 76922 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..db241fc0f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_R/scalfor_R_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c58fb94c81a73487888ad2e49145b59fe4cfdd9a98d43a8bc4ef6cd46e07bf7 +size 77015 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..83a5e6e99 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a9b8c57b35da988c1bab3fbe3fa685c63534833640af6f23f303d0dd4293926 +size 77047 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..83a5e6e99 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a9b8c57b35da988c1bab3fbe3fa685c63534833640af6f23f303d0dd4293926 +size 77047 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..5817f61ec --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_Z/scalfor_Z_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9300a2924af64750731bb4a1e4262456e40a31fda58c01b395fa4b761184d502 +size 77191 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..74eb20258 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83596b1efb242b5b849c840d55ea915a0ba5b72d244dc696783dbc4ef18f81c9 +size 195604 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..85348cc47 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:965ae41484fb0190d623f12e107f903a23b514010497942cbbeb2cbfaa3be7cf +size 196865 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..a3661a181 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/scalfor_out/scalfor_out_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abfb9fe5bcdeb66febee4e90ca27fbd07f4a3056f623e41b3594ebd90fec1357 +size 195861 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_fixed_bdy.json new file mode 100644 index 000000000..5ec8ca762 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd187963b64bcfcf21c24791d50259e1a953b8c2d8f1556c7e502007e4e62568 +size 514 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_axis/threed1_axis_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_axis/threed1_axis_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..4e3d130db --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_axis/threed1_axis_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26e839975500fa42c9a59a596ba4aedeb50d41f22215b5fa12aaaba51b953a1b +size 519 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_beta/threed1_beta_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_beta/threed1_beta_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..6b410b91a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_beta/threed1_beta_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:859a8eb062827400c2508efcc317f4e0f08066e4acb612e943b9fafdb445dde7 +size 222 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_firstTable/threed1_firstTable_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_firstTable/threed1_firstTable_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..784e23ea4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_firstTable/threed1_firstTable_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7bdde19e622953a8aae348a62fed3f380ab4269de6ac619577ca5dcf9ceb799 +size 13317 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_geomag/threed1_geomag_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_geomag/threed1_geomag_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..2381bfd0e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_geomag/threed1_geomag_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21c4ff69b981e4e9ebfd71322999d4630c5d62443778c324f68b5cb05ba17a5a +size 45799 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_shafrint/threed1_shafrint_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_shafrint/threed1_shafrint_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..53d93f378 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_shafrint/threed1_shafrint_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81d71127bc81ff0f91519c411767b812c34854033e6874b7fca0224b80a93623 +size 523 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_volquant/threed1_volquant_00025_000000_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_volquant/threed1_volquant_00025_000000_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..9b7e5f33c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/threed1_volquant/threed1_volquant_00025_000000_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:826343ee391c07d5c478b82773708fb94c355406d9fc8d5969f5a4f35258128e +size 351 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..aa146eedb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2ce1b35a0312ab16158f90d5b8ddb8b904b8515a260b10cd0329b861d22b1be +size 155926 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..98523c953 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56404bf7fba6807ba2179f0eb44c94c9dde1af0b6907133eee6cd01ab04d354c +size 156394 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..76a9d96fe --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/tomnsps/tomnsps_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e8c3fbdf362956b027e28b17912a946ed7deef65fec83803057595924042526 +size 156365 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..e3e7cf02a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2127cc0e799e1bde17fb4d5d3b61c2dbc8aa7ae4a01702fa3cecb586a3501204 +size 183632 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..cf514db68 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac05e45ee2634fb2407a1a0f828d0dd52b0e2e379b05c5ab9e27972e2a6a1deb +size 201550 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..77215544c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/totzsp_input/totzsp_input_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0baaee0eeef1d97914fb0cbed7648e49073fc61b142891c30cfec15f0b95208 +size 201263 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000001_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000001_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..ea6bd3aa7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000001_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acf6912108f5bc35c0c79074b3ffad19f8cf17b6bbda07cd3d28ea4cc099cf73 +size 793 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000002_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000002_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..59bf6c088 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000002_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7768eded1cd5ad77fdc55c7c1d71b8c271b11ae8dc0fdb53aca0304a4930133d +size 797 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000120_01.cth_like_fixed_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000120_01.cth_like_fixed_bdy.json new file mode 100644 index 000000000..eb7fc474c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy/volume/volume_00025_000120_01.cth_like_fixed_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bf9928fe6417d7fbbd0ff0255666a601008843888f73a0973134bd5865794a1 +size 795 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..d067f7809 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a096d5932959e6d5ada6f4e7f19e3e6d59fbcccb5c408175a1df3d1664eb7b7e +size 9480 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/add_fluxes/add_fluxes_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/add_fluxes/add_fluxes_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..084902ef8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/add_fluxes/add_fluxes_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86810a8d3de31215f001eea9c521a6f041a8052f8a3eeb23c9be5ec8aa7678ed +size 330769 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/add_fluxes/add_fluxes_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/add_fluxes/add_fluxes_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..2d14d0967 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/add_fluxes/add_fluxes_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f4ddf30a2af576626b3b9e5008302c133feede15f4abcf75721d833378bd91a +size 330984 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcontrav/bcontrav_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcontrav/bcontrav_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..92081216a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcontrav/bcontrav_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d44c30877b3e1673aa4b3fb566aa8d03d70a2d788a24a4e0d0432636b2f8b9ba +size 537457 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcontrav/bcontrav_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcontrav/bcontrav_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..531281b6d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcontrav/bcontrav_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19a0b2b84c4581f389389d94eeef7fc4136a82bdaa474b419e347973a67edace +size 670306 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov/bcov_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov/bcov_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..0f48f476c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov/bcov_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf2a438ba6331c1e897708cd5118d9e2ba3315eb8e37843e280e19576524dc6f +size 1001347 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov/bcov_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov/bcov_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..4a7f390b1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov/bcov_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bbf35eb2abd9dd13c7f4cbcad8d4b0faa08e1be659edab9909a703feaab6137 +size 1001644 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov_full/bcov_full_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov_full/bcov_full_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..282c5455b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov_full/bcov_full_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd25707efc121167e70fe11c42158b5906b6bc0ca9fb6deb176d8d0d9974e4c0 +size 686454 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov_full/bcov_full_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov_full/bcov_full_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..25aebc488 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcov_full/bcov_full_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a737bf84f1cb6a2e7a722f21d898eefde510de3b1014eb374064a62143ad16f7 +size 686530 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcovar_fileout/bcovar_fileout_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcovar_fileout/bcovar_fileout_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..028d9b781 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bcovar_fileout/bcovar_fileout_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:237f7f9ac470fd5f9519cd051be7cb4779ee9e14942f2fe62510e07969bf91f9 +size 2011366 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bss/bss_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bss/bss_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..da7d2cb79 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/bss/bss_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69601185551c5c23241a66bef42361b17fd28877cbb41a755efad17b0f848142 +size 3383851 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/calc_fbal/calc_fbal_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/calc_fbal/calc_fbal_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..56af5ba75 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/calc_fbal/calc_fbal_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d58b99a2850875261245e693bbcc3f2e6fb0663f0d7164146444adc4cebd7086 +size 5221 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/calc_fbal/calc_fbal_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/calc_fbal/calc_fbal_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..ae246a067 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/calc_fbal/calc_fbal_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c3dae024f10823da3742493853c7fbb9beff5f44a5315d15cd27dd06bbffd86 +size 5254 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/constraint_force/constraint_force_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/constraint_force/constraint_force_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..b1727a360 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/constraint_force/constraint_force_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5ca097c62d9b2d636404b796888c5f2332ad5ee6871faef23d9f427cfd2fd1c +size 2822504 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/constraint_force/constraint_force_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/constraint_force/constraint_force_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..88beae1a2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/constraint_force/constraint_force_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a63dc16c2ebeaac8f83d7896c25f59011eef105b1ff797b292ded29f68db55da +size 2819329 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/evolve/evolve_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/evolve/evolve_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..78756a9dd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/evolve/evolve_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af242ae5804d3bed356a0f333edc396ec4953ffa335aef41883fdd7245313b5c +size 931467 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/evolve/evolve_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/evolve/evolve_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..6b64d47d6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/evolve/evolve_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ee8f8cd13e525999d8ccbe0a817fd78f5d6223ae7941ea7a9cda8998f1c9d6b +size 1003663 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fixaray/fixaray_00000_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fixaray/fixaray_00000_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..b52e5bedb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fixaray/fixaray_00000_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ae66ac94a280cad986a5037f2983968d8222418198a2ce15d5d761558500c2e +size 304544 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forceNorms_tcon/forceNorms_tcon_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forceNorms_tcon/forceNorms_tcon_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..ea3c5dcfe --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forceNorms_tcon/forceNorms_tcon_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:540620cbf9fa0cb49cf1eca554b3502cd75845214e02daaeb2ef17f634d237cf +size 528582 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forces/forces_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forces/forces_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..301a03f1b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forces/forces_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05df322af237ba803d0cff1cfbc5e6860bc83bd6648bdf4105e249ef1f19be35 +size 19806479 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forces/forces_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forces/forces_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..0ccf8a69a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/forces/forces_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:345d7b267b843010008a05be7e38089b9a4963d7e4d5197c9a26f6ad23e5436f +size 19799478 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq/fsq_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq/fsq_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..ed974d47b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq/fsq_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b16890b10969fd00f1410569d933fab1d7c1bfed2bb94e973a6fab84f1667981 +size 237 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq/fsq_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq/fsq_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..c88a270bc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq/fsq_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efe3cb8ea92735a8bafaceb551e94949cfba97a60bf55b2304770054d6d593e3 +size 239 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq1/fsq1_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq1/fsq1_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..837bce968 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq1/fsq1_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d4667de265fb49aa45898e9d0efa40ac9337db84fdfdca3269c8bf6ea2f515f +size 144 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq1/fsq1_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq1/fsq1_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..593a8855e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/fsq1/fsq1_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c17f40652e040ab43575f6b63e39d7c535f1eddd82ba37c46580a3543e61995 +size 144 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/funct3d_geometry/funct3d_geometry_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/funct3d_geometry/funct3d_geometry_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..70d80efc5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/funct3d_geometry/funct3d_geometry_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad109e81c409e9f59bfe5ce1fc13bd325a9dee30ef86080436c0e18faef2a84d +size 7087892 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/funct3d_geometry/funct3d_geometry_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/funct3d_geometry/funct3d_geometry_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..a5e1d302a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/funct3d_geometry/funct3d_geometry_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7aafb610e2849d8bfee51b11203e1d060ffcc1d7672b41ce323249ea9fa74e6 +size 7659569 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jacobian/jacobian_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jacobian/jacobian_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..714441b9e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jacobian/jacobian_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8be3324e548196f3a36ae5e7a503430c83db2de8b1ec0ac48697172b4f138d85 +size 2051109 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jacobian/jacobian_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jacobian/jacobian_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..88d646f08 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jacobian/jacobian_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86881793fbd294f8c4f11951eaf02afac91c3fa7b2eb1ff664c8ce125b51d6d5 +size 2051129 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..4401c57f4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b6831be22f05e026cc29e286711bc16d8ded021abacbe81c3b81a0e622971a7 +size 3103829 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jxbout/jxbout_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jxbout/jxbout_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..590251966 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/jxbout/jxbout_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:818b5a38873ed39899bd2fabdf6f7dc06cc537ccc42bb6fd535db0264b7f2585 +size 4842474 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lambda_forces/lambda_forces_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lambda_forces/lambda_forces_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..7aad88b67 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lambda_forces/lambda_forces_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0c4ec09ed496f983efd47e49c2e3a3a1bb4795da1c328a295c1fa70672dad60 +size 1626638 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lambda_forces/lambda_forces_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lambda_forces/lambda_forces_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..dfa44b5c5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lambda_forces/lambda_forces_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e5093b5d5a96ba770a549f17591fdfe3cdc677bf39b1bc22cec9021350db5da +size 1782875 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lamcal/lamcal_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lamcal/lamcal_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..63977d983 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lamcal/lamcal_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e5e50bddd7ead745137a2efa430a1281abd2cc812b825954a2bc104baaa7915 +size 28716 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lulv_comb/lulv_comb_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lulv_comb/lulv_comb_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..301622ab2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lulv_comb/lulv_comb_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2591f70c08a769e52f3e454de1d37de428bbad77bd5d92b0eee94686be31ccb +size 4031793 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lulv_comb/lulv_comb_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lulv_comb/lulv_comb_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..0b31c1781 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/lulv_comb/lulv_comb_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cafd020bdbf96054c49d6de7fe07ec8ea2f03c2175a15842b968026aef040ac4 +size 4346347 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/mercier/mercier_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/mercier/mercier_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..4118f9a9c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/mercier/mercier_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bfce83a4b8d0b2b04c67aa0831d6d863cc062ca0a7aba6b4640484db04831cd +size 1253350 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/metric/metric_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/metric/metric_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..1330542c0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/metric/metric_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb8c2af0ff48314c87fdb318cc0298f8bc47c58988e5b966c44f76a39326271c +size 1691458 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/metric/metric_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/metric/metric_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..482be355d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/metric/metric_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:320f98d445fabfdb6cb04c9088f966e51c002b4bf987e572f6f273ced29f592c +size 1691372 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/multigrid_result/multigrid_result_00025_000121_00.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/multigrid_result/multigrid_result_00025_000121_00.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..b049194b3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/multigrid_result/multigrid_result_00025_000121_00.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:654e9fb922b13f16a44c43e68bf96f55d4722a7b6eff1eb28141a409d69bb1c7 +size 371172 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/phys_gc/phys_gc_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/phys_gc/phys_gc_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..11baea154 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/phys_gc/phys_gc_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f96c8c4b0d1fa30bc3d33bb7a245e675d5edf0d6de7501546323910d87cba576 +size 176445 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/phys_gc/phys_gc_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/phys_gc/phys_gc_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..12d3fdd32 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/phys_gc/phys_gc_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf7bc8589a919fa47b385a29030d6870f0cd52e616edb97e538b31f0eb503454 +size 178673 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/precondn/precondn_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/precondn/precondn_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..23b5c5a5c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/precondn/precondn_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fb3b73c5d1584e14200b384c2cd11c098012d335b46ad7d5cd605dd472d16cc +size 18142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/printout/printout_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/printout/printout_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..e4ad762bb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/printout/printout_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:972f9ca79998c9e8a9c7f474ccc7e76ea573b5efcf9519adeeb98793845a4066 +size 184409 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/profil1d/profil1d_00025_000001_00.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/profil1d/profil1d_00025_000001_00.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..493601a82 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/profil1d/profil1d_00025_000001_00.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e9e65fb3a128c91616a0211efc9d47139decb960cb907b0b9664d406e1020cc +size 8148 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/profil3d/profil3d_00025_000001_00.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/profil3d/profil3d_00025_000001_00.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..98c9deeb4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/profil3d/profil3d_00025_000001_00.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f479e3b8f3755a01c9d9a83c058a24e4c900999a0d4b645d2fcb423677906e18 +size 140142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/readin_boundary/readin_boundary_00000_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/readin_boundary/readin_boundary_00000_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..dd4e8995e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/readin_boundary/readin_boundary_00000_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbda15232ad0611becd1526b6bb8b296aaef147626f1940f5f85e95f61b25426 +size 3710 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scale_m1/scale_m1_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scale_m1/scale_m1_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..5de889bf9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scale_m1/scale_m1_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf1d703bd3acb5c2a4cf5b65773ac4ad64d8e2affa3c67b5dc0bde094b11534f +size 116595 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scale_m1/scale_m1_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scale_m1/scale_m1_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..e42266cf1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scale_m1/scale_m1_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1c68f2ce83e1d31f1088ec5a35cbde68eba50c30f243c2fa036afedd559f786 +size 118852 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_R/scalfor_R_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_R/scalfor_R_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..4caff624f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_R/scalfor_R_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45cbfdb76e364d6d952b2248caa9ec4c3f38ddc7176105b726b7c3d856046bd0 +size 76865 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_R/scalfor_R_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_R/scalfor_R_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..4caff624f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_R/scalfor_R_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45cbfdb76e364d6d952b2248caa9ec4c3f38ddc7176105b726b7c3d856046bd0 +size 76865 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_Z/scalfor_Z_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_Z/scalfor_Z_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..2fbf10aca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_Z/scalfor_Z_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:930bd5b219bee5f2c86d59cd76a115124d490512fea87c00e13b515b05710455 +size 77030 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_Z/scalfor_Z_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_Z/scalfor_Z_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..2fbf10aca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_Z/scalfor_Z_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:930bd5b219bee5f2c86d59cd76a115124d490512fea87c00e13b515b05710455 +size 77030 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_out/scalfor_out_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_out/scalfor_out_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..9bd72b7f0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_out/scalfor_out_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f26307f336f00f0eb305d2c6e754938f40a0487ea3b1f07c65e5fc23c42ec25d +size 195591 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_out/scalfor_out_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_out/scalfor_out_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..e0ddd1c67 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/scalfor_out/scalfor_out_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58491828b781dd39cade48026a69202d090e05f955091306a8b74761dd3cef1a +size 196871 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..5ec8ca762 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd187963b64bcfcf21c24791d50259e1a953b8c2d8f1556c7e502007e4e62568 +size 514 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_axis/threed1_axis_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_axis/threed1_axis_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..f112c525c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_axis/threed1_axis_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c668de1cc4b74f1be9799d98e7d64e379809d2b81f1d9d06a224e5295fe89846 +size 522 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_beta/threed1_beta_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_beta/threed1_beta_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..16a24ed21 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_beta/threed1_beta_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a25166e6a61bf4bf813dbd1bd382e9c03bf4344722bcfcd36a581d7eb1d2b6dd +size 220 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_firstTable/threed1_firstTable_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_firstTable/threed1_firstTable_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..c78ce7d81 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_firstTable/threed1_firstTable_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f67af4d8e8a97085a2ddce5710c502a364ac2a40aafafca8c283f3b9bca70023 +size 13331 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_geomag/threed1_geomag_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_geomag/threed1_geomag_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..9f90389c0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_geomag/threed1_geomag_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc54c448de576f713d9f8735aac7711fb2a8fa7b70f4605f515a5b4db6e80094 +size 46749 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_shafrint/threed1_shafrint_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_shafrint/threed1_shafrint_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..c54e46500 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_shafrint/threed1_shafrint_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e254349495ed80825b751af140634773138a5baa8b8f8c30430dd5cfd321f17e +size 521 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_volquant/threed1_volquant_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_volquant/threed1_volquant_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..3564c0271 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/threed1_volquant/threed1_volquant_00025_000000_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:101f7b8df7ac79e9ae5825b74477bcd557fce141e1590427b7eb7c53b700e0b4 +size 350 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/tomnsps/tomnsps_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/tomnsps/tomnsps_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..e2fb0517d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/tomnsps/tomnsps_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:729a08e997965ddbad11e8e94960ac577d940f284115e8763a304b859eba0f89 +size 155984 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/tomnsps/tomnsps_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/tomnsps/tomnsps_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..42675b0b3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/tomnsps/tomnsps_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67bc830ece4e6aa74e2967260e1b549606d819b37cf4bf1b481841a1384de21b +size 156448 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/totzsp_input/totzsp_input_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/totzsp_input/totzsp_input_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..e3e7cf02a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/totzsp_input/totzsp_input_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2127cc0e799e1bde17fb4d5d3b61c2dbc8aa7ae4a01702fa3cecb586a3501204 +size 183632 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/totzsp_input/totzsp_input_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/totzsp_input/totzsp_input_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..143346fcc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/totzsp_input/totzsp_input_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d69258f23c6a4c4a989c7e90171161cfc7a709d8e919c5222937cdf479e98ce +size 201578 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/volume/volume_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/volume/volume_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..2bea933ce --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/volume/volume_00025_000001_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e89ecc7d8810f37f09be13d483beea887797f8681f25ec6e53ab43c0a2b2265 +size 795 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/volume/volume_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/volume/volume_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json new file mode 100644 index 000000000..bf18d057e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy_nzeta_37/volume/volume_00025_000002_01.cth_like_fixed_bdy_nzeta_37.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b9a6f83e1035418230eabff884ec69c74c4debd0487a801af024e82db972fa7 +size 795 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy.json new file mode 100644 index 000000000..7321a0281 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bc33caf9255031a63879e95b177047b010ff7a126d14799c9a8570e7d67b79a +size 9578 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..242df725b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cde4ad4380fb47431ce3c449c0f2f29fad2d667c9634005fa154383e29de961 +size 191146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..7fe72f3fd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23f7de9470c5f5d88bcb0451c9974d41ea9f8655c43fc963de476cc0548a51f8 +size 191231 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..21a8176b5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7407245dfb59fb6830a17d7d3948599f1d64b6a444cd3b1852975c98e3856be1 +size 191305 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..9b120eefa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c51c69106c1fe862100824fa9bf91b1868b0973b6777bf01c79a4f1199c2ae55 +size 191314 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b375aea06 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/add_fluxes/add_fluxes_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bedd248c96b737b2fd9ea99f866ba7e7f0ae4b5aeb9f262b68bc1a08500b59c +size 191328 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..45f66d5e8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64ae39256853c2f6ee3aa66a1b329ecfcf71d9e4b14f7eb4fe0400c86c6c0428 +size 311664 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..3b128f8dc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c870ffa49d24ce673d6879b89e51f663607c679babac5e7b3ad1b3aaeec0bee +size 387107 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..16aca3d50 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dee9676de549d09f7b0f5426b882dbba4dee4faf05b8155ee49e329aeebcbb25 +size 381762 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b0f18437f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b36215128f4db11321683c79e76e8ecc3904f45cc06ca6690daf9c5903ad9563 +size 381938 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b07b1724e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcontrav/bcontrav_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa0432bacfa642c61e804f29a88aee2558b821dab13193b3d73e134b9fee8741 +size 381912 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2d3c59eb4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a13d2058e128504c7fd525251c76f03076567606e49c5a8a38b5fc6cd574313d +size 578183 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..31900f969 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e824a98a68f8b91a261339edd1a50a470edc10dddb70d1ca4b1dc3ab1910e99d +size 578288 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..17e1c0e58 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47ecc2adb6118a96f18dce68f7001967843477251d17f5899fea3970a74efc21 +size 579129 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..78f28060b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a5f91f3a19089f920ed1c6263581c6e3939f40abe9d10661efc193a24c608dc +size 579096 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..a2b5daa2d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov/bcov_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdaf73b5d33fa53fe32159b8f549fbb10dc64461e263f6eca3e2a87d856d8359 +size 578985 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b324d5c99 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c58563e254743671e609e6a2b43731316ff718a51d9ed9de57b334c5ee80d859 +size 401029 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..0ff8900bf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f051d14a252a41d4c9a845c950eb4083ad81ccea8a3020e0d2fc3f7fc76f7e40 +size 401209 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..ddb39e87d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:081aec611b746211ab9ff173c1754fc428ad49082ee2bc61659776978f04d2d6 +size 401750 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..3be3b03bc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:395a9d91d702b804df1b0025c792ac7ef07b118c74af9cc98a986769b91762b3 +size 401754 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..7ed335fb4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcov_full/bcov_full_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1c8972697af3eef6f474e102e161106080c9cea3a736eccb51e21cde75af7a4 +size 401676 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcovar_fileout/bcovar_fileout_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcovar_fileout/bcovar_fileout_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..68a63a5e3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bcovar_fileout/bcovar_fileout_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:480c510b63962ddea6944355b53883b2be2eea77576ed4beade24471aef8fdfb +size 1161063 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bss/bss_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bss/bss_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..0eadebf26 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/bss/bss_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90f15d58044b37f08acf9e869e8f1b8174eef539a09f05f95c53c05c4fd8ba59 +size 1966674 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e3d0aa512 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd49ff53384119ed5dc32771e2c3b259739fbf2dec165cbe8827eebf1ce505b8 +size 3096 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..dd8168bd0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d98e3d1296f328aa318a00bfbda01a0fd10ea38dcdf6efdf83aa559de6c02dab +size 3112 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e564483f0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c66c35f2b666acac9849a5464a02e5f37da6f215560801d8c5b871b90197ba43 +size 3117 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d7b84a6dc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20352fe217de7350c929df2357c6cff51996f806f8cb0a3d393d00610435b364 +size 3119 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..5ae2e054d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/calc_fbal/calc_fbal_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5213523aa995606e986480cc88c848a8303dad2534b3c79dc5f121700424b88d +size 3114 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b5251fd00 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9eb8fa1bd5d6217e3b73862ed1dd4a580116bd661dc5d973dca8f3f96ae0f69d +size 1625044 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..a928d0084 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca51b4c6e250ce7d9e705e1a2b6516bef4ac3b9936826516a34611f278a81dd0 +size 1623263 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..de866db28 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:038ae914c286956075803e46f2d4041181f2729cf7a0b3bce21ef86879b3e9d9 +size 1624045 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..6705766e4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc7ada8238d4fabbac5cbd1bf2f78fdfcea725cdb8d5d5b1e9545f791e077184 +size 1638124 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b8f2611c0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/constraint_force/constraint_force_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77fa11cc244c80c2248aa60618e55383dd90ad1de18c92dc08ccf9e1bed1d485 +size 1635297 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/cth_like_free_bdy_power_series_current_profile.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/cth_like_free_bdy_power_series_current_profile.json new file mode 100644 index 000000000..0f74b5dab --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/cth_like_free_bdy_power_series_current_profile.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f288b57c82cbc86152b87c2e22e5dd4776c4b4b314bc005e3eeb852b204a05ef +size 9488 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..5c13bd7f4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8f393971377b0935fbcb20c463ad9b0c803cffc88d2db3256fa7000388087e9 +size 555258 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..c8c4a5402 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bda057d9a0f17a4ce840238919f2b9c5ca382b117fa19a488791b69e890b5e5c +size 596641 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..20de70f2c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:415ce2071acb5b82e220613e26f3071956fe8fbee0fc1f910e2cb11aba8efc74 +size 597884 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..8c5b90889 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3276de769cbaa7336c574ad40f4c69755ab21cb8e7272400acce2974dd4d4d8b +size 570991 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..6b57c8f17 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/evolve/evolve_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d97992f9d86e56d12960190464e87ef98bb92f028719a8d76ac00e83893a7b47 +size 603234 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fixaray/fixaray_00000_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fixaray/fixaray_00000_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e0b9d3e1e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fixaray/fixaray_00000_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36108b8e7de774cf743880e8a33a686ee6aa8499e8b5f8012208b2c2b8e1faa0 +size 300299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forceNorms_tcon/forceNorms_tcon_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forceNorms_tcon/forceNorms_tcon_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..efe070995 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forceNorms_tcon/forceNorms_tcon_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5bb02dffe43edabefcd2dfeace3fe171bb66dcd33d378a64d88222828f2a307 +size 311108 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forceNorms_tcon/forceNorms_tcon_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forceNorms_tcon/forceNorms_tcon_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..69f8b3535 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forceNorms_tcon/forceNorms_tcon_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b72a3cf9dfc126884ef0c605cd238c7e2e6f57282a3bd4b4befe6b17159624c6 +size 321488 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..cbf45a01d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb36cc3603bb29f6e1cad69e150bc4bb0f83152dfc9cc0876208cae9d458ded5 +size 11495623 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..a7affe651 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39da788a94071d49586199bf31163738d91febacd64d28ac77d4d4603c98cbe5 +size 11492394 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..94f6f6729 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbf9ea22ba8ee86fcc5835cce90a41d6ae7852d5d422d7461355d82d20e03f46 +size 11503119 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d53ec5f00 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:539f74df2f099c65e850c53472a04cf4457609db86bb2a28fd3ced096e01f32a +size 11534145 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..331d2b917 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/forces/forces_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45be9374d9f9a86e14250d4ca3c562d44a6784b284740f8032768497ffb48b97 +size 11531818 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/freeb_data/freeb_data_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/freeb_data/freeb_data_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2a34c70c2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/freeb_data/freeb_data_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4acd647c596384a5be543f0b76c6090e6400c5b435545dcd29a667dd7c89f091 +size 148172 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..6aa6035c7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de59c5478b9a10530defb84ce367abab5696bbf5c8cbaa24331ec9f7e83e81b7 +size 239 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e0d07f967 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e91918e5985bcd2273f5b1e09c9f5641e8026703e18706b71966dd58615821da +size 239 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..57c75f6ca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74e6a6b084a38781367eff850b876ec22289afc8fb2ab98a4e2fce179a28b813 +size 243 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..fe34839f3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03e98a61afdc3a2a0fe6661ab8dba8eeb261b77a1fa23985c4817ba0d8d768fb +size 261 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..313c39b9f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq/fsq_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8af259b481768521fc2aa059bf4faffffbf34795ed5669933f31b4d4e9634a19 +size 260 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..03c10e211 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3576d219bc65eade9e0a84aef140289e3d788fb8c2f25f4b9e9ae4a21b6ef45 +size 142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..79fd5cda8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01e087ed081569d370b4e376efdcdadab5a6f506edc927ba7d21adda3e2c278a +size 142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..a3340faf2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6b5b98c788a48048a38fb1d29ec06ce918cc52ef5610f02e15fc44619b20a66 +size 142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..45a131879 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:020a8fc2ea57415e654428802f45e8ffc32649ec226246327b4866fae7486604 +size 142 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..29ee61fcd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/fsq1/fsq1_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e239ca8f73b7a8f633a32de14a4e835fc489de8016f6afcb9298dfa3a687237 +size 144 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..92216d2b7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:193d159109240a144cb926d4ee88dcf13f57f55fcc9396cdd68d24aae378abb1 +size 4123429 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..549d520fb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9e77e1df6ade24a69aaf3740b25651b87610dc9903e3ce9b3da87d22a2e1268 +size 4454920 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..877f9cbc1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8aa39731fbe0aada1afa88e154a740006c5315aae6d042ebd80a826341e9e157 +size 4441535 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..5110a9d53 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07611f5a5accfc8ed8ba0afdb4ba659f88e5a038e5dc598489f5faebf00181e9 +size 4441406 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..4c8ccb3c1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/funct3d_geometry/funct3d_geometry_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9569324f1e452666b4fde83a78b77838df1dcba7ab0730b4bfd7abd4cbb782eb +size 4441422 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b1586873f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b5806d600b13fd3e11f692023e796188ad57bc9c4dfc8afce31fb8741fb36c5 +size 1197421 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e62f36283 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90884353fc85984dc9dee2e803005788f2e47797b951cf6cbb912629468eea73 +size 1197331 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..83199a583 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f1b8c0d82b6e69379d4141dad8e048aeb7d7895ae0ad6423680f83471f29efe +size 1196679 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..7254fdb3c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56d0f9f2185ae39b032104cc52bc184e7f98725721ef707b1dc879d824c42af9 +size 1196810 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..91ce63b14 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jacobian/jacobian_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7be1430689fbdbdb30bcfd0b943788d74e48c9b22b48be896681525d371e3523 +size 1196834 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..a1f77c1e8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91878a131970b8187ed291c557bc7f216f6e8425483f4cb989aa5d0b3c8944ff +size 1793621 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jxbout/jxbout_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jxbout/jxbout_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..17166c990 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/jxbout/jxbout_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edffc3371698e2c3871d41aef02b81bd77cc02dde3fd752f357e0e350101a268 +size 2770486 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..c9f01c47a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34b18d4875800fb740cf3a546d86bc1467514e72974f5e3167f4bf427f9be33d +size 945730 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..11e4359c4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6683ab14bdd1351dcfe5c704a3f2cc6ed68b677186ee693c2c07cbacae9d7970 +size 1036879 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..bb018f7f7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92ecd76ddb2fa83b6e12d73f88de14108f870b07fc399ce0beb18c76a3fd7f7d +size 1035326 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..f8dcd252a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95c3046c53809b0f58cfc5b0facbae2d62459c41ce0dc87487267c61fc655789 +size 1035650 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..48b3f6d6b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lambda_forces/lambda_forces_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f117e6a209803b388b633d9022d4d5d915807592554cd8509b347b27982d2d8 +size 1035381 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lamcal/lamcal_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lamcal/lamcal_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..a442413a0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lamcal/lamcal_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:850f8cdbf3ab058f2d1de3fbdb1c807b2f1fbdb3c259284e8794ce17d9d535b7 +size 17138 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lamcal/lamcal_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lamcal/lamcal_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..862652230 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lamcal/lamcal_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66a64c3754ea08695fe0a2be552cfc71531eea5fd182042d01835963f7cb5c43 +size 17136 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..47ffa31ed --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3332c42e51781d7f18d6ff46d4d0011cbd04d6f2f598370c88e2f60326345a8 +size 2338031 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2e6e2e1b4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cef648e297625880a025179beacc6ef758c5d9e201693b74faaf64181100ed9 +size 2521596 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..0f9e1283a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:097978abf6b4d214dd9f74a6a575c36a54fee2123e4a776bc0f2eb2e867a7e87 +size 2519204 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d2fdae58b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a065bae836a9a05f52f4ba32f3ce608a78749644f3a7cb4c960be93e8bd321a +size 2519408 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..bf81df76c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/lulv_comb/lulv_comb_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e881c9eea4460eab775a59df1d7bc1e204b658d4b623b9019f534e2cb9a5b1a9 +size 2519286 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/mercier/mercier_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/mercier/mercier_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..317b83335 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/mercier/mercier_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77b5f3b45d0b5b75749ba01481b770172c332b4ef34cc2b71eff1bb51777c9d9 +size 702546 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..9ec207899 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e78c5aec5f89294f37d556b83b230b498375cae2fae8f66d7fc6ff6cfa68f98 +size 987440 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..5dd538ec8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34721105479101f2f806ff96c60ced98ccf9ca9ecfda4d8234d8617657b83a36 +size 987389 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2f3a2a66e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6ddad18b769fc7276819b64f0bb4e7ce5ede212d98e3fd2c8847c5e91eda6c2 +size 987559 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..01fc6da8f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58e0b158fad89e6f4fc90cbe4315b22dce960d492e1d2d4250fc7a30cf540a7a +size 987620 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..443665121 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/metric/metric_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebf669f64247d6ac87321d590ee97ad981696d92c4e954423d98362542ea089b +size 987524 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/multigrid_result/multigrid_result_00015_000490_00.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/multigrid_result/multigrid_result_00015_000490_00.cth_like_free_bdy.json new file mode 100644 index 000000000..fc471f169 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/multigrid_result/multigrid_result_00015_000490_00.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfcca12db4fec71624ddbbc2b92dfddddf95118216baa88016962bb9b17c6d12 +size 222568 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e76ae05b3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c445c871cbf2cbb6f71c819b1d573571e9d60fb5592a0a1db251270797bf725c +size 104565 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..825f03781 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fedeb79f489ffd494a3496a9eacd720269d69d60d8b4cdef09594a2665e9bc51 +size 105820 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d36e30c6c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3bb7da3b7a8d7b9049d34416daa3d3bfc321c9bb28e35f205442f8a4dc890fe +size 105722 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..4e39af9cb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a194b7ea71a6c7704814223272de001b76e86e112f2a56df91aa3b5d55813bb +size 107090 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..18ceeaca2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/phys_gc/phys_gc_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41f9bf311371ae21b0ac6b3c3a0a82a7eb0c048c75a7fd0a4355d459b5aad431 +size 107252 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/precondn/precondn_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/precondn/precondn_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..3bae00899 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/precondn/precondn_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d63787996da8f156c5d6bdc00615dd9878b0cb449393abe290cd915e188340f +size 11106 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/precondn/precondn_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/precondn/precondn_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b1a01f15b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/precondn/precondn_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50205b50084d08d6c7cc4daa77efb43c988da923390ddf795b812fbf70bd9cca +size 11099 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/printout/printout_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/printout/printout_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..17de516ef --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/printout/printout_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:994eaeae70747da3d228ce31d3f3b18a41fab550abd4fcf679c548bccff10e0d +size 110271 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/profil1d/profil1d_00015_000001_00.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/profil1d/profil1d_00015_000001_00.cth_like_free_bdy.json new file mode 100644 index 000000000..fbe6503dc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/profil1d/profil1d_00015_000001_00.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05a842584f6a6d0677a66b2414e5f066da40477a8df0a9fbf0a221e36b905a72 +size 5066 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/profil3d/profil3d_00015_000001_00.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/profil3d/profil3d_00015_000001_00.cth_like_free_bdy.json new file mode 100644 index 000000000..3a9c0a82a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/profil3d/profil3d_00015_000001_00.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45cee54aa702e30d87e307df6af424acf5416ac5a3e35b7089d7b65179cb21a7 +size 83702 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/rbsq/rbsq_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/rbsq/rbsq_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..97322cf20 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/rbsq/rbsq_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff1e4e968082d3ab31228d50eb1c72a46e43b746274c83e8160c250579e9bc22 +size 10995 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/rbsq/rbsq_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/rbsq/rbsq_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..acca3c785 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/rbsq/rbsq_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df1ec04a3a124f4f8fc047ca8ad0df49a29e5da80ba7a90b26923fc432efc32a +size 10985 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/readin_boundary/readin_boundary_00000_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/readin_boundary/readin_boundary_00000_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..dd4e8995e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/readin_boundary/readin_boundary_00000_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbda15232ad0611becd1526b6bb8b296aaef147626f1940f5f85e95f61b25426 +size 3710 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..70094ea55 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26abe8ecf3c81c078726d6a3acbdcdb0905ef2de1645d64e57bf36a6cd5151a2 +size 68941 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d96e366ce --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db5e8b3204f32ca6f799209a26a33f542bfec9cf61d8211dbce08c91b8a040b4 +size 70202 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..1598c3f25 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecd888bbdd823b8e713c640fc787875a6f0a2dfb0ead875d38e71a8c5324126e +size 70125 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..28e15e8a4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08448759a36e1d1d8b66bdccfc929d5d3dcbfc298e70296a9ec1e20111b7ec34 +size 71563 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e91bf365c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scale_m1/scale_m1_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e6e1ebd3bdada1acda0b748e013980dc269587fe0286381cdbd17ed44884d56 +size 71639 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..1e068689d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57c46c9800aa480a0997ed1ea10149ceb986f3aa6dbf7701962780e2f7fa0b62 +size 45493 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..1e068689d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57c46c9800aa480a0997ed1ea10149ceb986f3aa6dbf7701962780e2f7fa0b62 +size 45493 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..4b2c508c7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26412865000fe5f3883d6221c71b04668d72d971c86fcdc1b07e65ad4e81d2f4 +size 45367 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..f9cbe4a59 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab4b66d71bd9fb276f51906ac642dfd2e26ba239c031656b2722f46a426f089a +size 46156 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..f9cbe4a59 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_R/scalfor_R_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab4b66d71bd9fb276f51906ac642dfd2e26ba239c031656b2722f46a426f089a +size 46156 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..32d211f0c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9e4272379128b33ffbdfdf90de969f18f701fbb798d1496d7a8190190884877 +size 45351 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..32d211f0c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9e4272379128b33ffbdfdf90de969f18f701fbb798d1496d7a8190190884877 +size 45351 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..733bd72f1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd103f9df8002128f021685cf1124d47656aea995b3c4e3c69cc67fc259f039d +size 45266 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..32c57b8f4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1cde222ce44f74f15dd448d1157fe2518b0cc30dcba4a866fb1fbbef096b123 +size 46016 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..32c57b8f4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_Z/scalfor_Z_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1cde222ce44f74f15dd448d1157fe2518b0cc30dcba4a866fb1fbbef096b123 +size 46016 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..165419b9b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ecbdf7f291a506b3c75bdb1ae8215a2f9eabfecf6d2f9484b5a0c4aee84ffc8 +size 116266 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..258b9a347 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3069638a1285455b9f27ebd1374099db050200c509344a85bdbfe64bfd7101da +size 116920 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2d6e2309f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db335c5da4706dfb759443526ce5a054036e3d9e84cf8526e5a7228e97b9d45c +size 117190 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..bebdc16f7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3591134549f1d4d72e579e562a98706e5e5af12a375976f7355fae2d63a4ac08 +size 118947 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..85fe4edf8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/scalfor_out/scalfor_out_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d3112105a6cc020f9435724f42dd7e9e14078b27e6d26ec85777b403d7f0de0 +size 118887 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_free_bdy.json new file mode 100644 index 000000000..5ec8ca762 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/spectral_constraint/spectral_constraint_00000_000001_00.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd187963b64bcfcf21c24791d50259e1a953b8c2d8f1556c7e502007e4e62568 +size 514 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_axis/threed1_axis_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_axis/threed1_axis_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2affa65e3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_axis/threed1_axis_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ac4ff066a1f3e5b39f91d469e7a38c0030eb476cef1f57348ac2dacb4ce1ea6 +size 521 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_beta/threed1_beta_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_beta/threed1_beta_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..64732786e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_beta/threed1_beta_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dc25b6a476abf9b753540d58586f8292c4213995f003f02bd7d4e09af1cd1eb +size 223 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_firstTable/threed1_firstTable_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_firstTable/threed1_firstTable_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..b856e2ef2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_firstTable/threed1_firstTable_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa0b8015db327f1155b6c1c5bc628ce74d979e7f472d53758f1de663c68aebea +size 8124 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_geomag/threed1_geomag_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_geomag/threed1_geomag_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..138137b94 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_geomag/threed1_geomag_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b32201f876cd12f80e976582f4cefd440f28762807bde0323af9b89ced343ab +size 42199 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_shafrint/threed1_shafrint_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_shafrint/threed1_shafrint_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..5536a47e2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_shafrint/threed1_shafrint_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ab758efae608dc56f65025ae652a44a00574ca2d7e5c831c004fa94bb8aeec +size 526 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_volquant/threed1_volquant_00015_000000_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_volquant/threed1_volquant_00015_000000_01.cth_like_free_bdy.json new file mode 100644 index 000000000..cacbf94b1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/threed1_volquant/threed1_volquant_00015_000000_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b573b67e3f40a5b713af37065f0c75e76dad5c2884b8194961dfc3307a637467 +size 349 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e7111d5f6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01174d2f647918aee640ce5cbc6205346311f0ce90c34ca1da1542d4b7ac0127 +size 92183 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..8ace2f2a2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74bd0178d5e12738532a49b26dfec0dcf79186e7a90d87ccf6e0a24931a348cc +size 92447 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..49cd30ee4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12cc905459f7f970291566072c85b2f81ec8c917a5d8aba1c59774c00f22d9d8 +size 92385 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..9c7aa8498 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcdf0489e1e53d10168809adc980e4f050f651c5780b00e0d44bd6ca2005970b +size 93775 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d2efbeba2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/tomnsps/tomnsps_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca5c1225f0fc337122cca2d085e751e0f0e1c4fcfe9d03cbe62f39d556352267 +size 93861 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..48fe1cdca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbdd26358fd41c3c238b784ef71a179154f10bb56951e2342e1b6eca477da429 +size 109753 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..0e3cd6d25 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2eb80a029419e2cd81bcf5878243df5a6748db7eaf2b95318e899c528ab8dbc +size 120223 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2882f0cfb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:822469c52f75dd9d850d56ab40f3781d8498f3a1c9aab461f6c0e01cc321b038 +size 120080 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d62d60caf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f1b72d9c0b8d6457696083fe6d9cea19e5a1832f93e2a974f0e442cf62b19b1 +size 120026 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..95db0bd09 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/totzsp_input/totzsp_input_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1e312ba42281c1f0dbcd45c28bf5328006d382709e4c41282fba25010e84163 +size 120062 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_analyt/vac1n_analyt_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_analyt/vac1n_analyt_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..63b6957d1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_analyt/vac1n_analyt_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:865b087c598030e747b43ae22cd22c302a9c07cc29c9032a66531f37fb22c3b8 +size 1469516 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_analyt/vac1n_analyt_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_analyt/vac1n_analyt_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..c8fbabd17 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_analyt/vac1n_analyt_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2698de8a8c55fea43e842c1d6eeb7b34acfb6d1aa5978f14869f79cb660fb61d +size 285299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bextern/vac1n_bextern_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bextern/vac1n_bextern_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..333e99b17 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bextern/vac1n_bextern_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fb9a5fbbfb74bbec41773b2faec23fb5e4db44cd10ba91eac05203725fb1128 +size 135280 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bextern/vac1n_bextern_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bextern/vac1n_bextern_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..64b94769a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bextern/vac1n_bextern_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f25f749f0781a7263afc3b79dc89a3fff0e3ab3306310b7406d8a1d673f3b64 +size 135352 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..5e29afeb2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ecc96ee6b63c7649d5ac5438bf2e621120aed40b023b7372e846a6e85d07816 +size 95517 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..65f88c4b6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:938274ed99cbb9bc4fedcd590d3ea00fb87be45fd1bd314f6b3c6c4d24ab5a30 +size 95526 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_fouri/vac1n_fouri_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_fouri/vac1n_fouri_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..c1493e145 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_fouri/vac1n_fouri_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be1bad7a5f2e0fc9d53eb041b3750776fb869cefc52c80f3feb2018747659564 +size 775028 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_fourp/vac1n_fourp_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_fourp/vac1n_fourp_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..42dd67182 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_fourp/vac1n_fourp_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6214e4c8eb88de2a7b6bb6e202d01b8c365eb9dbeffea4f5a9b92b39ea117af2 +size 921014 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_greenf/vac1n_greenf_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_greenf/vac1n_greenf_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..6135bd1c2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_greenf/vac1n_greenf_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1d40379cdad1b98e3fcf3e52599b5719044f31bea71a98f58c92c90ab38e30e +size 16444484 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_precal/vac1n_precal_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_precal/vac1n_precal_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..8b63abde5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_precal/vac1n_precal_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba4bd78ea75a5f2e07174af783ea8fdb4660b76390b405952f7a8f0fe494769c +size 88158 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_solver/vac1n_solver_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_solver/vac1n_solver_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..310ed5cfd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_solver/vac1n_solver_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6532a618e1cd94698a891fd14d1119e2b06642163d9f6d71a22092b4f819d1b8 +size 131688 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_solver/vac1n_solver_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_solver/vac1n_solver_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..881f77207 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_solver/vac1n_solver_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b40d341d7eca299f5a202527785209cb1136ac68df0b675a307f91ebeebb246 +size 131713 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_surface/vac1n_surface_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_surface/vac1n_surface_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..d2f66fa2d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_surface/vac1n_surface_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0cbe6d845f93eaebaf2271fef7088577a9f51ec6bf14843a779451a52c97ed5 +size 329957 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_surface/vac1n_surface_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_surface/vac1n_surface_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..f49350991 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_surface/vac1n_surface_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed18ea441d870ce1ee8ab2c268cb4434630eb4f91a3bb3ce95c15bd1811649e4 +size 329933 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_vacuum/vac1n_vacuum_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_vacuum/vac1n_vacuum_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..2112905f1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_vacuum/vac1n_vacuum_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1af03174bf33ce8f2658404daf3d371e147e45898b69018f0e1b2fe3eec50b7 +size 17809 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_vacuum/vac1n_vacuum_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_vacuum/vac1n_vacuum_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..dccddd5fb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/vac1n_vacuum/vac1n_vacuum_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf4bbc0de93e32f44c822610a603b59ef711330af89217769ee5e02b6ee8ebbc +size 17854 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000001_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000001_01.cth_like_free_bdy.json new file mode 100644 index 000000000..7d0bbe8f8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000001_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d63d528a13413840867ed8c5015fe5216c2fca8e1f68494ea116ebdd7929f0f +size 497 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000002_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000002_01.cth_like_free_bdy.json new file mode 100644 index 000000000..f2f18b4e8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000002_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b5210c0f9cd3260a717e138243710bbf1ad306aef4babf256a6857aacbcd968 +size 497 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000051_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000051_01.cth_like_free_bdy.json new file mode 100644 index 000000000..20518e8e3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000051_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a715dd3386bb7cf07b5f318b7bcabafc06b623a2716f634fe774981fc00e29f +size 498 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000053_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000053_01.cth_like_free_bdy.json new file mode 100644 index 000000000..e89eb1696 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000053_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cba5980399205d856f859fedc422c7ff2361b9935053724ff0ca4fa7dc4461d6 +size 497 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000054_01.cth_like_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000054_01.cth_like_free_bdy.json new file mode 100644 index 000000000..8819d03b6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/cth_like_free_bdy/volume/volume_00015_000054_01.cth_like_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a6c35ceb35009f626c54497185e63c290f0512a41881dfd5a48c3593053abae +size 495 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cma b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cma new file mode 100644 index 000000000..0beb96401 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cma @@ -0,0 +1,158 @@ +&INDATA +! This file created by simsopt on June 22 2023, 14:03:03 + +! ---- Geometric parameters ---- +NFP = 2 +LASYM = F + +! ---- Resolution parameters ---- +MPOL = 5 +NTOR = 6 +NS_ARRAY = 25 51 +NITER_ARRAY = 1000 60000 +FTOL_ARRAY = 1e-6 1e-6 + +! ---- Boundary toroidal flux ---- +PHIEDGE = 0.03 + +! ---- Pressure profile specification ---- +PMASS_TYPE = "power_series" +AM = 0.0 +PRES_SCALE = 1.0 + +! ---- Profile specification of iota or current ---- +NCURR = 1 +CURTOR = 0.0 +PCURR_TYPE = "power_series" +AC = 0.0 + +! ---- Other numerical parameters ---- +DELT = 0.5 +NSTEP = 200 + +! ---- Boundary shape. Array index order is (n, m) ---- +RBC( 0, 0) = 1.000000000000000e+00, ZBS( 0, 0) = 0.000000000000000e+00 +RBC( 1, 0) = -7.644321965093537e-02, ZBS( 1, 0) = 3.074125881604448e-01 +RBC( 2, 0) = -1.324126418028418e-02, ZBS( 2, 0) = 1.542129248893585e-03 +RBC( 3, 0) = 1.420977053009254e-02, ZBS( 3, 0) = -9.144742714707998e-03 +RBC( 4, 0) = -5.504435855162935e-03, ZBS( 4, 0) = 3.460797854109088e-03 +RBC( 5, 0) = 2.553384848788198e-04, ZBS( 5, 0) = 9.883634616616728e-05 +RBC( 6, 0) = -1.185011324568191e-03, ZBS( 6, 0) = -2.880135818991747e-06 +RBC( -6, 1) = -1.202025254622908e-04, ZBS( -6, 1) = -3.824446509542573e-05 +RBC( -5, 1) = 6.941752124278125e-04, ZBS( -5, 1) = 8.108927537995539e-04 +RBC( -4, 1) = -8.094624068832210e-04, ZBS( -4, 1) = 2.655765394140272e-04 +RBC( -3, 1) = 6.713810248166207e-03, ZBS( -3, 1) = 3.648069053720122e-03 +RBC( -2, 1) = -2.567930216425583e-02, ZBS( -2, 1) = -7.382561322274653e-03 +RBC( -1, 1) = 2.050253804808166e-02, ZBS( -1, 1) = 5.723757729696597e-03 +RBC( 0, 1) = 1.572621671365258e-01, ZBS( 0, 1) = 2.368390378510535e-01 +RBC( 1, 1) = 1.047284153032750e-01, ZBS( 1, 1) = -9.939702516666893e-02 +RBC( 2, 1) = 5.245713453838931e-02, ZBS( 2, 1) = -2.425684102695022e-02 +RBC( 3, 1) = -1.370886243307166e-02, ZBS( 3, 1) = 3.655726929818442e-04 +RBC( 4, 1) = 2.303920109478939e-03, ZBS( 4, 1) = -1.405685942654125e-03 +RBC( 5, 1) = -1.797977199990663e-03, ZBS( 5, 1) = 4.032459604105783e-05 +RBC( 6, 1) = -1.127798792956909e-03, ZBS( 6, 1) = 8.840023911914129e-04 +RBC( -6, 2) = 6.920323299065562e-04, ZBS( -6, 2) = 1.320686742275814e-04 +RBC( -5, 2) = -9.543127510458719e-04, ZBS( -5, 2) = -5.573663814308586e-04 +RBC( -4, 2) = -1.680310177254153e-03, ZBS( -4, 2) = -8.427232066969988e-04 +RBC( -3, 2) = 4.953442911158945e-03, ZBS( -3, 2) = 5.805693726626450e-03 +RBC( -2, 2) = -4.556920611897498e-03, ZBS( -2, 2) = -2.495880769569751e-03 +RBC( -1, 2) = -1.773171978291314e-03, ZBS( -1, 2) = -1.608731490617312e-02 +RBC( 0, 2) = -1.219094417536678e-02, ZBS( 0, 2) = 1.617414407135419e-02 +RBC( 1, 2) = -3.583509443086943e-03, ZBS( 1, 2) = 1.024237892621557e-02 +RBC( 2, 2) = -1.030923092585679e-02, ZBS( 2, 2) = -1.901517879607994e-02 +RBC( 3, 2) = 6.141194835902971e-03, ZBS( 3, 2) = -1.526222014090178e-02 +RBC( 4, 2) = -6.255196754866160e-03, ZBS( 4, 2) = -4.338984478901778e-03 +RBC( 5, 2) = -2.171246142273294e-03, ZBS( 5, 2) = 2.638466061498996e-03 +RBC( 6, 2) = 9.442146568524488e-04, ZBS( 6, 2) = -2.528283463976346e-04 +RBC( -6, 3) = 6.471069192439680e-04, ZBS( -6, 3) = 1.975996576549061e-04 +RBC( -5, 3) = 3.756283466314262e-05, ZBS( -5, 3) = -4.260795814768445e-04 +RBC( -4, 3) = -1.881608284746710e-04, ZBS( -4, 3) = -4.341456161461416e-04 +RBC( -3, 3) = -5.416568802079458e-04, ZBS( -3, 3) = 7.166845118997602e-05 +RBC( -2, 3) = -2.603073072881438e-03, ZBS( -2, 3) = 1.920115232912769e-03 +RBC( -1, 3) = 2.032789557854657e-03, ZBS( -1, 3) = 2.134113397386284e-03 +RBC( 0, 3) = -3.594369822956610e-03, ZBS( 0, 3) = 5.070170388360828e-03 +RBC( 1, 3) = 1.184431233968696e-02, ZBS( 1, 3) = 4.722733327563772e-03 +RBC( 2, 3) = 8.362234645779227e-06, ZBS( 2, 3) = 1.183301470387100e-03 +RBC( 3, 3) = 9.509574133642763e-04, ZBS( 3, 3) = -4.316655750776096e-03 +RBC( 4, 3) = 1.616195157207865e-03, ZBS( 4, 3) = -1.748249071557586e-03 +RBC( 5, 3) = 1.604779702550668e-04, ZBS( 5, 3) = -6.600708198037322e-04 +RBC( 6, 3) = -2.627451027047592e-04, ZBS( 6, 3) = 1.057899479874507e-03 +RBC( -6, 4) = 4.447359108466256e-05, ZBS( -6, 4) = -1.032135146992660e-04 +RBC( -5, 4) = 2.521492700224221e-07, ZBS( -5, 4) = 4.950847753563548e-05 +RBC( -4, 4) = 1.497840987841863e-04, ZBS( -4, 4) = -1.706742726333019e-04 +RBC( -3, 4) = -3.904415453615698e-05, ZBS( -3, 4) = -3.350555683490269e-04 +RBC( -2, 4) = 1.960713376050221e-04, ZBS( -2, 4) = 5.665989189036979e-04 +RBC( -1, 4) = 1.990034938618596e-03, ZBS( -1, 4) = -2.535981637356631e-04 +RBC( 0, 4) = -1.552522144076541e-03, ZBS( 0, 4) = 1.383118539333910e-04 +RBC( 1, 4) = 3.713111027194971e-05, ZBS( 1, 4) = 3.194362295971315e-04 +RBC( 2, 4) = 2.965425907839499e-03, ZBS( 2, 4) = -2.046663508155578e-04 +RBC( 3, 4) = -3.631182882795961e-03, ZBS( 3, 4) = 1.839222193547008e-03 +RBC( 4, 4) = -1.191273889898481e-03, ZBS( 4, 4) = 8.247816900845371e-04 +RBC( 5, 4) = 7.451616548054759e-05, ZBS( 5, 4) = -1.811951853902116e-04 +RBC( 6, 4) = 8.526322572912445e-05, ZBS( 6, 4) = -1.255143181157281e-04 +RBC( -6, 5) = 1.999768868330002e-05, ZBS( -6, 5) = 3.975148559896988e-06 +RBC( -5, 5) = 1.126027200378325e-04, ZBS( -5, 5) = -3.762146773247145e-04 +RBC( -4, 5) = 5.959212398914691e-05, ZBS( -4, 5) = -1.267564915139934e-04 +RBC( -3, 5) = 4.056206469889971e-04, ZBS( -3, 5) = -1.350211095440772e-04 +RBC( -2, 5) = -2.388576286047688e-04, ZBS( -2, 5) = -3.427315941460888e-04 +RBC( -1, 5) = 6.365691957754092e-05, ZBS( -1, 5) = 1.207815192471002e-04 +RBC( 0, 5) = -3.095195700862035e-04, ZBS( 0, 5) = -1.763192463298971e-04 +RBC( 1, 5) = 7.197452028695711e-05, ZBS( 1, 5) = 9.427577025131819e-05 +RBC( 2, 5) = -3.497021728060069e-04, ZBS( 2, 5) = -1.802084307422293e-04 +RBC( 3, 5) = -7.247146443440484e-05, ZBS( 3, 5) = 1.422479750873528e-04 +RBC( 4, 5) = -7.583144160634975e-04, ZBS( 4, 5) = 7.700175072096092e-04 +RBC( 5, 5) = -4.577959196416673e-04, ZBS( 5, 5) = 4.425850135440576e-04 +RBC( 6, 5) = -2.888873091218720e-04, ZBS( 6, 5) = 1.478933702172719e-04 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_fixed_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_fixed_bdy new file mode 100644 index 000000000..15c6d2f59 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_fixed_bdy @@ -0,0 +1,138 @@ +&INDATA + +LASYM = F, +NFP = 5, +MPOL = 5, +NTOR = 4, +! ntheta not specified +NZETA = 36, + +NS_ARRAY = 25, +FTOL_ARRAY = 1.0E-6, +NITER_array = 25000, + +PHIEDGE = -0.035, +NCURR = 1, + +pmass_type = 'two_power', +AM = 1.0, 5.0, 10.0, +PRES_SCALE = 432.29080924603676, +GAMMA = 0.0, +SPRES_PED = 1.0, + +! no iota profile specified + +PCURR_TYPE = 'two_power', +AC = 1.0, 5.0, 10.0, +CURTOR = 43229.08092460368, +BLOAT = 1.0, + +! Initial Position. +RAXIS_CC(:) = 0.786037734951267, -0.0302978726119071, 0.000915258048528683, -1.91959906744039e-05, 1.45930777845745e-06, +ZAXIS_CS(:) = 0.0, 0.0273158409510113, -0.000937096584979097, 1.741833421328e-05, -5.91222841432118e-07, + +RBC( 0,0) = 0.780906309727434 ZBS( 0,0) = 0.0 +RBC( 1,0) = -0.046151739531816 ZBS( 1,0) = 0.0449223151020507 +RBC( 2,0) = 0.0025346622908875 ZBS( 2,0) = -0.00157959039976886 +RBC( 3,0) = -0.000294570027126834 ZBS( 3,0) = 0.000110096448338774 +RBC( 4,0) = 4.87628905278232e-05 ZBS( 4,0) = -3.41523759959853e-05 + +RBC(-4,1) = 1.10991985982551e-05 ZBS(-4,1) = 8.86243753757977e-06 +RBC(-3,1) = -6.69760263500533e-05 ZBS(-3,1) = -7.61994068511444e-06 +RBC(-2,1) = 0.000344811566716634 ZBS(-2,1) = -0.000102387369227698 +RBC(-1,1) = -0.00566091264003757 ZBS(-1,1) = -0.00308184739411174 +RBC( 0,1) = 0.131435746235883 ZBS( 0,1) = 0.164601748843378 +RBC( 1,1) = -0.039386399008392 ZBS( 1,1) = 0.0303393558516301 +RBC( 2,1) = 0.00488869740987901 ZBS( 2,1) = -0.00451585182685075 +RBC( 3,1) = -0.000438124054375238 ZBS( 3,1) = 0.000322392099487897 +RBC( 4,1) = 4.81645985535357e-05 ZBS( 4,1) = -3.48737658782808e-05 + +RBC(-4,2) = -1.53011178035308e-06 ZBS(-4,2) = -1.28442261664991e-06 +RBC(-3,2) = 2.35413167655254e-05 ZBS(-3,2) = 2.93065492924715e-05 +RBC(-2,2) = -8.83026333729552e-05 ZBS(-2,2) = -0.000193078473966611 +RBC(-1,2) = 0.000146058452530242 ZBS(-1,2) = 0.000917965755419898 +RBC( 0,2) = 0.00147170066093047 ZBS( 0,2) = -0.00272248379340565 +RBC( 1,2) = -0.00320611057583166 ZBS( 1,2) = 0.00355657869194155 +RBC( 2,2) = 0.00228943846580024 ZBS( 2,2) = -0.00205297288922009 +RBC( 3,2) = -0.000319173467542497 ZBS( 3,2) = 0.000328755917997435 +RBC( 4,2) = 2.60138638307058e-05 ZBS( 4,2) = -3.57925786395997e-05 + +RBC(-4,3) = -2.22269133805289e-06 ZBS(-4,3) = 3.83110072934457e-06 +RBC(-3,3) = 8.93182437579942e-07 ZBS(-3,3) = -3.24731939556698e-06 +RBC(-2,3) = -1.86926512003518e-05 ZBS(-2,3) = -3.77850265219013e-06 +RBC(-1,3) = -0.000103222718482529 ZBS(-1,3) = -7.43052945541678e-07 +RBC( 0,3) = -0.00010590693425821 ZBS( 0,3) = 0.000120213894931637 +RBC( 1,3) = -3.70460344545912e-05 ZBS( 1,3) = 9.70588501764729e-05 +RBC( 2,3) = 0.000384952481942609 ZBS( 2,3) = -0.000305563766958157 +RBC( 3,3) = -8.73464736915271e-05 ZBS( 3,3) = 7.12819152728525e-05 +RBC( 4,3) = 1.70559212798558e-05 ZBS( 4,3) = -1.14192148882868e-05 + +RBC(-4,4) = -4.11611838328142e-06 ZBS(-4,4) = 2.79111955871817e-06 +RBC(-3,4) = -3.670147571078e-06 ZBS(-3,4) = -1.0123457043081e-06 +RBC(-2,4) = 3.27663252086114e-06 ZBS(-2,4) = 1.33742394885452e-05 +RBC(-1,4) = -5.49897884990649e-05 ZBS(-1,4) = -6.56302557453055e-05 +RBC( 0,4) = 0.000611036997986113 ZBS( 0,4) = 0.000408527289143525 +RBC( 1,4) = 0.000157752536759372 ZBS( 1,4) = -0.00113568343044368 +RBC( 2,4) = 0.000238939203660074 ZBS( 2,4) = 0.000453498195180046 +RBC( 3,4) = -7.45864378517666e-05 ZBS( 3,4) = -5.07003662052117e-05 +RBC( 4,4) = 1.0767515627784e-05 ZBS( 4,4) = 5.22398328609138e-06 + +LFREEB = F, + +NSTEP = 200, +DELT = 0.7, + + iter2_to_dump = 1, 2, 120 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_fixed_bdy_nzeta_37 b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_fixed_bdy_nzeta_37 new file mode 100644 index 000000000..1b82b5c29 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_fixed_bdy_nzeta_37 @@ -0,0 +1,136 @@ +&INDATA + +LASYM = F, +NFP = 5, +MPOL = 5, +NTOR = 4, +! ntheta not specified +NZETA = 37, + +NS_ARRAY = 25, +FTOL_ARRAY = 1.0E-6, +NITER_array = 25000, + +PHIEDGE = -0.035, +NCURR = 1, + +pmass_type = 'two_power', +AM = 1.0, 5.0, 10.0, +PRES_SCALE = 432.29080924603676, +GAMMA = 0.0, +SPRES_PED = 1.0, + +! no iota profile specified + +PCURR_TYPE = 'two_power', +AC = 1.0, 5.0, 10.0, +CURTOR = 43229.08092460368, +BLOAT = 1.0, + +! Initial Position. +RAXIS_CC(:) = 0.786037734951267, -0.0302978726119071, 0.000915258048528683, -1.91959906744039e-05, 1.45930777845745e-06, +ZAXIS_CS(:) = 0.0, 0.0273158409510113, -0.000937096584979097, 1.741833421328e-05, -5.91222841432118e-07, + +RBC( 0,0) = 0.780906309727434 ZBS( 0,0) = 0.0 +RBC( 1,0) = -0.046151739531816 ZBS( 1,0) = 0.0449223151020507 +RBC( 2,0) = 0.0025346622908875 ZBS( 2,0) = -0.00157959039976886 +RBC( 3,0) = -0.000294570027126834 ZBS( 3,0) = 0.000110096448338774 +RBC( 4,0) = 4.87628905278232e-05 ZBS( 4,0) = -3.41523759959853e-05 + +RBC(-4,1) = 1.10991985982551e-05 ZBS(-4,1) = 8.86243753757977e-06 +RBC(-3,1) = -6.69760263500533e-05 ZBS(-3,1) = -7.61994068511444e-06 +RBC(-2,1) = 0.000344811566716634 ZBS(-2,1) = -0.000102387369227698 +RBC(-1,1) = -0.00566091264003757 ZBS(-1,1) = -0.00308184739411174 +RBC( 0,1) = 0.131435746235883 ZBS( 0,1) = 0.164601748843378 +RBC( 1,1) = -0.039386399008392 ZBS( 1,1) = 0.0303393558516301 +RBC( 2,1) = 0.00488869740987901 ZBS( 2,1) = -0.00451585182685075 +RBC( 3,1) = -0.000438124054375238 ZBS( 3,1) = 0.000322392099487897 +RBC( 4,1) = 4.81645985535357e-05 ZBS( 4,1) = -3.48737658782808e-05 + +RBC(-4,2) = -1.53011178035308e-06 ZBS(-4,2) = -1.28442261664991e-06 +RBC(-3,2) = 2.35413167655254e-05 ZBS(-3,2) = 2.93065492924715e-05 +RBC(-2,2) = -8.83026333729552e-05 ZBS(-2,2) = -0.000193078473966611 +RBC(-1,2) = 0.000146058452530242 ZBS(-1,2) = 0.000917965755419898 +RBC( 0,2) = 0.00147170066093047 ZBS( 0,2) = -0.00272248379340565 +RBC( 1,2) = -0.00320611057583166 ZBS( 1,2) = 0.00355657869194155 +RBC( 2,2) = 0.00228943846580024 ZBS( 2,2) = -0.00205297288922009 +RBC( 3,2) = -0.000319173467542497 ZBS( 3,2) = 0.000328755917997435 +RBC( 4,2) = 2.60138638307058e-05 ZBS( 4,2) = -3.57925786395997e-05 + +RBC(-4,3) = -2.22269133805289e-06 ZBS(-4,3) = 3.83110072934457e-06 +RBC(-3,3) = 8.93182437579942e-07 ZBS(-3,3) = -3.24731939556698e-06 +RBC(-2,3) = -1.86926512003518e-05 ZBS(-2,3) = -3.77850265219013e-06 +RBC(-1,3) = -0.000103222718482529 ZBS(-1,3) = -7.43052945541678e-07 +RBC( 0,3) = -0.00010590693425821 ZBS( 0,3) = 0.000120213894931637 +RBC( 1,3) = -3.70460344545912e-05 ZBS( 1,3) = 9.70588501764729e-05 +RBC( 2,3) = 0.000384952481942609 ZBS( 2,3) = -0.000305563766958157 +RBC( 3,3) = -8.73464736915271e-05 ZBS( 3,3) = 7.12819152728525e-05 +RBC( 4,3) = 1.70559212798558e-05 ZBS( 4,3) = -1.14192148882868e-05 + +RBC(-4,4) = -4.11611838328142e-06 ZBS(-4,4) = 2.79111955871817e-06 +RBC(-3,4) = -3.670147571078e-06 ZBS(-3,4) = -1.0123457043081e-06 +RBC(-2,4) = 3.27663252086114e-06 ZBS(-2,4) = 1.33742394885452e-05 +RBC(-1,4) = -5.49897884990649e-05 ZBS(-1,4) = -6.56302557453055e-05 +RBC( 0,4) = 0.000611036997986113 ZBS( 0,4) = 0.000408527289143525 +RBC( 1,4) = 0.000157752536759372 ZBS( 1,4) = -0.00113568343044368 +RBC( 2,4) = 0.000238939203660074 ZBS( 2,4) = 0.000453498195180046 +RBC( 3,4) = -7.45864378517666e-05 ZBS( 3,4) = -5.07003662052117e-05 +RBC( 4,4) = 1.0767515627784e-05 ZBS( 4,4) = 5.22398328609138e-06 + +LFREEB = F, + +NSTEP = 200, +DELT = 0.7, + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_free_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_free_bdy new file mode 100644 index 000000000..6639b34d8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.cth_like_free_bdy @@ -0,0 +1,195 @@ +&INDATA + +! VMEC execution parameters. +MGRID_FILE = 'mgrid_cth_like.nc', +LFREEB = T, +DELT = 0.7, +TCON0 = 1.0, +NFP = 5, + +NS_ARRAY = 15, +FTOL_ARRAY = 1.0E-10, +NITER_array = 2500, + +NSTEP = 100, +NTOR = 4, +MPOL = 5, +NZETA = 36, +NVACSKIP = 9, +LASYM = F, + +! Coil Currents. (HF, TVF) +EXTCUR = 4700.0, 1000.0, + +! Fitting parameters. +GAMMA = 0.0, +PHIEDGE = -0.035, +BLOAT = 1.0, + +! Plasma current parameters. +NCURR = 1, +CURTOR = 43229.08092460368, +AC = 1.0, 5.0, 10.0, +PCURR_TYPE = 'two_power', + +! Plasma pressure parameters +SPRES_PED = 1.0, +AM = 1.0, 5.0, 10.0, +PRES_SCALE = 432.29080924603676, +pmass_type = 'two_power', + +! Initial Position. +RAXIS_CC(:) = 0.786037734951267, -0.0302978726119071, 0.000915258048528683, -1.91959906744039e-05, 1.45930777845745e-06, +ZAXIS_CS(:) = 0.0, 0.0273158409510113, -0.000937096584979097, 1.741833421328e-05, -5.91222841432118e-07, + +RBC(0,0) = 0.780906309727434, +RBC(1,0) = -0.046151739531816, +RBC(2,0) = 0.0025346622908875, +RBC(3,0) = -0.000294570027126834, +RBC(4,0) = 4.87628905278232e-05, +RBC(-4,1) = 1.10991985982551e-05, +RBC(-3,1) = -6.69760263500533e-05, +RBC(-2,1) = 0.000344811566716634, +RBC(-1,1) = -0.00566091264003757, +RBC(0,1) = 0.131435746235883, +RBC(1,1) = -0.039386399008392, +RBC(2,1) = 0.00488869740987901, +RBC(3,1) = -0.000438124054375238, +RBC(4,1) = 4.81645985535357e-05, +RBC(-4,2) = -1.53011178035308e-06, +RBC(-3,2) = 2.35413167655254e-05, +RBC(-2,2) = -8.83026333729552e-05, +RBC(-1,2) = 0.000146058452530242, +RBC(0,2) = 0.00147170066093047, +RBC(1,2) = -0.00320611057583166, +RBC(2,2) = 0.00228943846580024, +RBC(3,2) = -0.000319173467542497, +RBC(4,2) = 2.60138638307058e-05, +RBC(-4,3) = -2.22269133805289e-06, +RBC(-3,3) = 8.93182437579942e-07, +RBC(-2,3) = -1.86926512003518e-05, +RBC(-1,3) = -0.000103222718482529, +RBC(0,3) = -0.00010590693425821, +RBC(1,3) = -3.70460344545912e-05, +RBC(2,3) = 0.000384952481942609, +RBC(3,3) = -8.73464736915271e-05, +RBC(4,3) = 1.70559212798558e-05, +RBC(-4,4) = -4.11611838328142e-06, +RBC(-3,4) = -3.670147571078e-06, +RBC(-2,4) = 3.27663252086114e-06, +RBC(-1,4) = -5.49897884990649e-05, +RBC(0,4) = 0.000611036997986113, +RBC(1,4) = 0.000157752536759372, +RBC(2,4) = 0.000238939203660074, +RBC(3,4) = -7.45864378517666e-05, +RBC(4,4) = 1.0767515627784e-05, + +ZBS(0,0) = 0.0, +ZBS(1,0) = 0.0449223151020507, +ZBS(2,0) = -0.00157959039976886, +ZBS(3,0) = 0.000110096448338774, +ZBS(4,0) = -3.41523759959853e-05, +ZBS(-4,1) = 8.86243753757977e-06, +ZBS(-3,1) = -7.61994068511444e-06, +ZBS(-2,1) = -0.000102387369227698, +ZBS(-1,1) = -0.00308184739411174, +ZBS(0,1) = 0.164601748843378, +ZBS(1,1) = 0.0303393558516301, +ZBS(2,1) = -0.00451585182685075, +ZBS(3,1) = 0.000322392099487897, +ZBS(4,1) = -3.48737658782808e-05, +ZBS(-4,2) = -1.28442261664991e-06, +ZBS(-3,2) = 2.93065492924715e-05, +ZBS(-2,2) = -0.000193078473966611, +ZBS(-1,2) = 0.000917965755419898, +ZBS(0,2) = -0.00272248379340565, +ZBS(1,2) = 0.00355657869194155, +ZBS(2,2) = -0.00205297288922009, +ZBS(3,2) = 0.000328755917997435, +ZBS(4,2) = -3.57925786395997e-05, +ZBS(-4,3) = 3.83110072934457e-06, +ZBS(-3,3) = -3.24731939556698e-06, +ZBS(-2,3) = -3.77850265219013e-06, +ZBS(-1,3) = -7.43052945541678e-07, +ZBS(0,3) = 0.000120213894931637, +ZBS(1,3) = 9.70588501764729e-05, +ZBS(2,3) = -0.000305563766958157, +ZBS(3,3) = 7.12819152728525e-05, +ZBS(4,3) = -1.14192148882868e-05, +ZBS(-4,4) = 2.79111955871817e-06, +ZBS(-3,4) = -1.0123457043081e-06, +ZBS(-2,4) = 1.33742394885452e-05, +ZBS(-1,4) = -6.56302557453055e-05, +ZBS(0,4) = 0.000408527289143525, +ZBS(1,4) = -0.00113568343044368, +ZBS(2,4) = 0.000453498195180046, +ZBS(3,4) = -5.07003662052117e-05, +ZBS(4,4) = 5.22398328609138e-06, + + iter2_to_dump = 1, 2, 51, 53, 54 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + dump_vac1n_vacuum = .true. + dump_vac1n_precal = .true. + dump_vac1n_surface = .true. + dump_vac1n_bextern = .true. + dump_vac1n_analyt = .true. + dump_vac1n_greenf = .true. + dump_vac1n_fourp = .true. + dump_vac1n_fouri = .true. + dump_vac1n_solver = .true. + dump_vac1n_bsqvac = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. + dump_freeb_data = .true. +/ +&END diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev new file mode 100644 index 000000000..b47de0b72 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev @@ -0,0 +1,81 @@ +&INDATA +DELT = 0.9 +LASYM = F +NFP = 1 +NCURR = 0 +NSTEP = 250 +GAMMA = 0 +PHIEDGE = 1 +BLOAT = 1 +CURTOR = 0 +SPRES_PED = 1 +PRES_SCALE = 1 +PMASS_TYPE = "power_series" +MPOL = 6 +NTOR = 0 +NS_ARRAY = 5 11 55 +NITER_ARRAY = 1000 2000 2000 +FTOL_ARRAY = 1E-12 1E-12 1E-12 +AM = 0.125 -0.125 +AI = 1 +RAXIS_CC = 4 +ZAXIS_CS = 0 +RBC(0,0) = 3.999 ZBS(0,0) = 0.000 +RBC(0,1) = 1.026 ZBS(0,1) = 1.580 +RBC(0,2) = -0.068 ZBS(0,2) = 0.010 + + iter2_to_dump = 1, 2, 203 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. + dump_freeb_data = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_analytical b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_analytical new file mode 100644 index 000000000..a4946f62f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_analytical @@ -0,0 +1,92 @@ +! based on the analytical Solov'ev equilibrium +! mentioned in Hirshman & Whitson (1983) + +&INDATA + + mpol = 13 + + ns_array = 31 + ftol_array = 1.0e-16 + niter_array = 2000 + + nstep = 100 + + pmass_type = 'power_series' + pres_scale = 9.947183943243e+04 + am = 1.0, -1.0 + + phiedge = 3.141592653590e+00 + + ncurr = 1 + curtor = 2.823753282890e+06 + pcurr_type = 'power_series' + ac( 0) = 9.798989768026e-01 + ac( 1) = 3.499639202867e-02 + ac( 2) = 6.561823505375e-03 + ac( 3) = 1.367046563620e-03 + ac( 4) = 2.990414357918e-04 + ac( 5) = 6.728432305316e-05 + ac( 6) = 1.541932403302e-05 + ac( 7) = 3.579485936236e-06 + ac( 8) = 8.389420163053e-07 + ac( 9) = 1.980835316276e-07 + ac(10) = 4.704483876156e-08 + ac(11) = 1.122660924992e-08 + ac(12) = 2.689708466126e-09 + ac(13) = 6.465645351265e-10 + + rbc(0, 0) = 3.933370603101e+00 + rbc(0, 1) = -1.025899678142e+00 + rbc(0, 2) = -6.809124378642e-02 + rbc(0, 3) = -9.080031777300e-03 + rbc(0, 4) = -1.516336810656e-03 + rbc(0, 5) = -2.838744594993e-04 + rbc(0, 6) = -5.697082348932e-05 + rbc(0, 7) = -1.198195946489e-05 + rbc(0, 8) = -2.606510095840e-06 + rbc(0, 9) = -5.816406878883e-07 + rbc(0,10) = -1.324037181689e-07 + rbc(0,11) = -3.062633595619e-08 + rbc(0,12) = -7.177875393912e-09 + + zbs(0, 1) = 1.581138830084e+00 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_free_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_free_bdy new file mode 100644 index 000000000..d65bbb557 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_free_bdy @@ -0,0 +1,118 @@ +&INDATA + ! SOLOV'EV Equilibrium from Hirshman Whitson 1983 BETA~0.1 + LFREEB = T + + mgrid_file = 'mgrid_solovev.nc' + EXTCUR( 1) = 3.884526409876309E+06 ! CS + + EXTCUR( 2) = -2.935577123737952E+05 ! PF_01 + EXTCUR( 7) = -2.935531536308510E+05 ! PF_01 + + EXTCUR( 8) = -3.560639108717275E+05 ! PF_01 + EXTCUR(13) = -3.560589388468855E+05 ! PF_01 + + EXTCUR( 3) = -1.734851853677043E+04 ! PF_02 + EXTCUR( 6) = -1.734993103183817E+04 ! PF_02 + + EXTCUR( 9) = -6.588434719283084E+04 ! PF_02 + EXTCUR(12) = -6.588300858364606E+04 ! PF_02 + + EXTCUR( 4) = 6.002137016973160E+04 ! PF_03 + EXTCUR( 5) = 6.002540940490887E+04 ! PF_03 + + EXTCUR(10) = -1.154387774712987E+04 ! PF_03 + EXTCUR(11) = -1.153546510755219E+04 ! PF_03 + + NVACSKIP = 6 + + DELT = 9.00E-01 + LASYM = F + NFP = 1 + NCURR = 0 + MPOL = 12 + NTOR = 0 + NZETA = 1 + NS_ARRAY = 16 32 + NITER_ARRAY = 10000 20000 + FTOL_ARRAY = 1E-10 1E-14 + NSTEP = 100 + GAMMA = 0.000000E+00 + PHIEDGE = 1.00000000000000E+00 + BLOAT = 1.000000E+00 + CURTOR = 0.00000000000000E+00 + SPRES_PED = 1.00000000000000E+00 + PMASS_TYPE = "power_series" + AM = 0.125 -0.125 + AI = 0.49 -0.3 + + RAXIS_CC = 3.999 + ZAXIS_CS = 0.000 + + RBC( 0,0) = 3.999 ZBS( 0,0) = 0.000 + RBC( 0,1) = 1.026 ZBS( 0,1) = 1.580 + RBC( 0,2) = 0.068 ZBS( 0,2) = -0.010 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + dump_vac1n_vacuum = .true. + dump_vac1n_precal = .true. + dump_vac1n_surface = .true. + dump_vac1n_bextern = .true. + dump_vac1n_analyt = .true. + dump_vac1n_greenf = .true. + dump_vac1n_fourp = .true. + dump_vac1n_fouri = .true. + dump_vac1n_solver = .true. + dump_vac1n_bsqvac = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. + dump_freeb_data = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_no_axis b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_no_axis new file mode 100644 index 000000000..57dd43baa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/input.solovev_no_axis @@ -0,0 +1,76 @@ +&INDATA +DELT = 0.9 +LASYM = F +NFP = 1 +NCURR = 0 +NSTEP = 250 +GAMMA = 0 +PHIEDGE = 1 +BLOAT = 1 +CURTOR = 0 +SPRES_PED = 1 +PRES_SCALE = 1 +PMASS_TYPE = "power_series" +MPOL = 6 +NTOR = 0 +NS_ARRAY = 5 11 +NITER_ARRAY = 1000 2000 +FTOL_ARRAY = 1E-12 1E-12 +AM = 0.125 -0.125 +AI = 1 +RBC(0,0) = 3.999 ZBS(0,0) = 0.000 +RBC(0,1) = 1.026 ZBS(0,1) = 1.580 +RBC(0,2) = -0.068 ZBS(0,2) = 0.010 + + dump_add_fluxes = .true. + dump_metric = .true. + dump_volume = .true. + dump_bcontrav = .true. + dump_bcov = .true. + dump_lambda_forces = .true. + dump_bcov_full = .true. + dump_precondn = .true. + dump_forceNorms_tcon = .true. + dump_lulv_comb = .true. + dump_calc_fbal = .true. + dump_evolve = .true. + dump_fixaray = .true. + dump_spectral_constraint = .true. + dump_forces = .true. + dump_totzsp_input = .true. + dump_funct3d_geometry = .true. + dump_rbsq = .true. + dump_constraint_force = .true. + dump_guess_axis = .true. + dump_interp = .true. + dump_jacobian = .true. + dump_lamcal = .true. + dump_profil1d = .true. + dump_profil3d = .true. + dump_readin_boundary = .true. + dump_phys_gc = .true. + dump_fsq = .true. + dump_scale_m1 = .true. + dump_scalfor_out = .true. + dump_fsq1 = .true. + dump_scalfor_R = .true. + dump_scalfor_Z = .true. + dump_symforce = .true. + dump_tomnsps = .true. + dump_tomnspa = .true. + dump_multigrid_result = .true. + dump_printout = .true. + + ! fileout + dump_bcovar_fileout = .true. + dump_bss = .true. + dump_jxbforce_bsub_lowpass = .true. + dump_jxbout = .true. + dump_mercier = .true. + dump_threed1_firstTable = .true. + dump_threed1_geomag = .true. + dump_threed1_volquant = .true. + dump_threed1_axis = .true. + dump_threed1_beta = .true. + dump_threed1_shafrint = .true. +/ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_fixed_bdy.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_fixed_bdy.nc new file mode 100644 index 000000000..e71049677 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_fixed_bdy.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1ab0836fba18dc57d95c1c80dbc0d4b66cae7fbee20269ea7266f687cd171c5 +size 781676 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_fixed_bdy_nzeta_37.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_fixed_bdy_nzeta_37.nc new file mode 100644 index 000000000..eaa2cf59a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_fixed_bdy_nzeta_37.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6eec1e6b581d36a30cc1083deeed173adb123a80ad26eac20289d39ba1240ced +size 803276 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_free_bdy.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_free_bdy.nc new file mode 100644 index 000000000..99e645d9a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_cth_like_free_bdy.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad29e8376b665b593170aa21090aa4164ed71a0961e5a67832ef9789e82bfe4f +size 470076 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev.nc new file mode 100644 index 000000000..b2209a3e9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3363611347849d3f7dc0ccf5813d615f176c67e18c7a06c503385446fffafb7f +size 58556 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev_analytical.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev_analytical.nc new file mode 100644 index 000000000..fd46e1732 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev_analytical.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14685926813c9a349b87d6193e8f72c221225705e82d1344fa66c22f59650ef0 +size 55004 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev_no_axis.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev_no_axis.nc new file mode 100644 index 000000000..457a4562b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/jxbout_solovev_no_axis.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f5294ee05ceca4cbdc31a1f666397c40c859a65b20b44e6a14a7f18d5f84ccc +size 13852 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/makegrid_parameters_cth_like.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/makegrid_parameters_cth_like.json new file mode 100644 index 000000000..97c2422c3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/makegrid_parameters_cth_like.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3274fc93b90d6a9d90d8b0df77df71eb423b988fa49a9a30279f26c590bd881 +size 334 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/makegrid_parameters_solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/makegrid_parameters_solovev.json new file mode 100644 index 000000000..3a22d8eaf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/makegrid_parameters_solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cfae1b3baf6b86d182e615f19896aabce1796dfcaf757c3823573a7a493dd6f +size 332 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cma b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cma new file mode 100644 index 000000000..428f6bc87 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cma @@ -0,0 +1,103 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 2.0000E-02 6.0000E-04 5.6978E-01 8.5813E-02 1.6234E+01 -3.9269E+01 -3.2198E-18 -4.2620E-17 0.0000E+00 0.0000E+00 + 4.0000E-02 1.2000E-03 5.7079E-01 1.2197E-01 1.6257E+01 -3.9025E+01 -4.0235E-18 -1.2222E-16 0.0000E+00 0.0000E+00 + 6.0000E-02 1.8000E-03 5.7191E-01 1.0801E-01 1.6280E+01 -3.8244E+01 -7.2806E-18 -5.4484E-16 0.0000E+00 0.0000E+00 + 8.0000E-02 2.4000E-03 5.7295E-01 1.0485E-01 1.6303E+01 -3.6894E+01 -3.9277E-18 1.2296E-15 0.0000E+00 0.0000E+00 + 1.0000E-01 3.0000E-03 5.7393E-01 9.4673E-02 1.6324E+01 -3.5254E+01 1.0644E-19 -4.0426E-16 0.0000E+00 0.0000E+00 + 1.2000E-01 3.6000E-03 5.7486E-01 9.5164E-02 1.6345E+01 -3.3968E+01 5.3221E-19 4.9058E-16 0.0000E+00 0.0000E+00 + 1.4000E-01 4.2000E-03 5.7576E-01 8.7990E-02 1.6365E+01 -3.2340E+01 -1.4689E-18 -8.9758E-16 0.0000E+00 0.0000E+00 + 1.6000E-01 4.8000E-03 5.7665E-01 9.2737E-02 1.6384E+01 -3.1196E+01 -8.9411E-18 -6.2368E-16 0.0000E+00 0.0000E+00 + 1.8000E-01 5.4000E-03 5.7760E-01 1.0055E-01 1.6403E+01 -3.0439E+01 -5.7904E-18 1.2633E-15 0.0000E+00 0.0000E+00 + 2.0000E-01 6.0000E-03 5.7862E-01 1.0747E-01 1.6421E+01 -2.9654E+01 -1.1921E-18 -3.2843E-16 0.0000E+00 0.0000E+00 + 2.2000E-01 6.6000E-03 5.7969E-01 1.0925E-01 1.6438E+01 -2.9229E+01 -8.7282E-18 -1.2001E-15 0.0000E+00 0.0000E+00 + 2.4000E-01 7.2000E-03 5.8078E-01 1.1236E-01 1.6456E+01 -2.8845E+01 7.0251E-18 4.3899E-15 0.0000E+00 0.0000E+00 + 2.6000E-01 7.8000E-03 5.8190E-01 1.1429E-01 1.6473E+01 -2.8422E+01 2.6823E-17 -3.7908E-16 0.0000E+00 0.0000E+00 + 2.8000E-01 8.4000E-03 5.8305E-01 1.1743E-01 1.6490E+01 -2.8355E+01 1.8372E-17 -1.3297E-15 0.0000E+00 0.0000E+00 + 3.0000E-01 9.0000E-03 5.8421E-01 1.1713E-01 1.6507E+01 -2.8305E+01 5.3434E-18 -1.3026E-15 0.0000E+00 0.0000E+00 + 3.2000E-01 9.6000E-03 5.8537E-01 1.1739E-01 1.6524E+01 -2.8391E+01 -9.5371E-18 -1.7006E-15 0.0000E+00 0.0000E+00 + 3.4000E-01 1.0200E-02 5.8653E-01 1.1743E-01 1.6541E+01 -2.8375E+01 -2.9889E-17 -2.4024E-15 0.0000E+00 0.0000E+00 + 3.6000E-01 1.0800E-02 5.8770E-01 1.1673E-01 1.6558E+01 -2.8634E+01 -1.5796E-17 5.2370E-15 0.0000E+00 0.0000E+00 + 3.8000E-01 1.1400E-02 5.8886E-01 1.1701E-01 1.6575E+01 -2.8910E+01 -7.2806E-18 -3.5191E-15 0.0000E+00 0.0000E+00 + 4.0000E-01 1.2000E-02 5.9002E-01 1.1576E-01 1.6593E+01 -2.9169E+01 -1.5668E-17 1.8304E-15 0.0000E+00 0.0000E+00 + 4.2000E-01 1.2600E-02 5.9117E-01 1.1602E-01 1.6610E+01 -2.9564E+01 1.7456E-17 4.8189E-15 0.0000E+00 0.0000E+00 + 4.4000E-01 1.3200E-02 5.9232E-01 1.1439E-01 1.6628E+01 -2.9961E+01 1.5030E-17 -5.3002E-15 0.0000E+00 0.0000E+00 + 4.6000E-01 1.3800E-02 5.9347E-01 1.1498E-01 1.6646E+01 -3.0499E+01 -8.8559E-18 5.1154E-16 0.0000E+00 0.0000E+00 + 4.8000E-01 1.4400E-02 5.9461E-01 1.1343E-01 1.6665E+01 -3.0859E+01 1.6818E-17 4.6243E-15 0.0000E+00 0.0000E+00 + 5.0000E-01 1.5000E-02 5.9574E-01 1.1353E-01 1.6683E+01 -3.1597E+01 2.0564E-17 -3.8706E-15 0.0000E+00 0.0000E+00 + 5.2000E-01 1.5600E-02 5.9688E-01 1.1297E-01 1.6703E+01 -3.1991E+01 -1.3582E-17 -2.9485E-15 0.0000E+00 0.0000E+00 + 5.4000E-01 1.6200E-02 5.9800E-01 1.1178E-01 1.6722E+01 -3.2784E+01 -1.1411E-17 3.3779E-15 0.0000E+00 0.0000E+00 + 5.6000E-01 1.6800E-02 5.9913E-01 1.1211E-01 1.6742E+01 -3.3284E+01 -3.1507E-18 -1.7293E-15 0.0000E+00 0.0000E+00 + 5.8000E-01 1.7400E-02 6.0025E-01 1.1059E-01 1.6762E+01 -3.4075E+01 1.8308E-18 2.7179E-15 0.0000E+00 0.0000E+00 + 6.0000E-01 1.8000E-02 6.0136E-01 1.1091E-01 1.6783E+01 -3.4704E+01 1.1453E-17 -8.0336E-16 0.0000E+00 0.0000E+00 + 6.2000E-01 1.8600E-02 6.0247E-01 1.0952E-01 1.6804E+01 -3.5485E+01 1.8734E-17 2.2466E-15 0.0000E+00 0.0000E+00 + 6.4000E-01 1.9200E-02 6.0358E-01 1.0953E-01 1.6825E+01 -3.6215E+01 8.2598E-18 -4.3187E-15 0.0000E+00 0.0000E+00 + 6.6000E-01 1.9800E-02 6.0468E-01 1.0846E-01 1.6847E+01 -3.7014E+01 1.5242E-17 5.6947E-15 0.0000E+00 0.0000E+00 + 6.8000E-01 2.0400E-02 6.0577E-01 1.0807E-01 1.6870E+01 -3.7777E+01 1.0942E-17 -6.5368E-15 0.0000E+00 0.0000E+00 + 7.0000E-01 2.1000E-02 6.0686E-01 1.0736E-01 1.6893E+01 -3.8638E+01 -2.9293E-17 -1.4114E-15 0.0000E+00 0.0000E+00 + 7.2000E-01 2.1600E-02 6.0795E-01 1.0675E-01 1.6916E+01 -3.9410E+01 -2.8186E-17 1.6276E-15 0.0000E+00 0.0000E+00 + 7.4000E-01 2.2200E-02 6.0903E-01 1.0582E-01 1.6940E+01 -4.0289E+01 -3.4913E-18 3.2339E-15 0.0000E+00 0.0000E+00 + 7.6000E-01 2.2800E-02 6.1010E-01 1.0509E-01 1.6964E+01 -4.1089E+01 -1.6605E-17 -5.8059E-15 0.0000E+00 0.0000E+00 + 7.8000E-01 2.3400E-02 6.1117E-01 1.0448E-01 1.6989E+01 -4.1919E+01 -1.8138E-17 5.4967E-15 0.0000E+00 0.0000E+00 + 8.0000E-01 2.4000E-02 6.1223E-01 1.0298E-01 1.7015E+01 -4.2780E+01 -2.9293E-17 -7.6739E-15 0.0000E+00 0.0000E+00 + 8.2000E-01 2.4600E-02 6.1326E-01 1.0018E-01 1.7041E+01 -4.3531E+01 1.4476E-18 1.3675E-14 0.0000E+00 0.0000E+00 + 8.4000E-01 2.5200E-02 6.1428E-01 9.8131E-02 1.7067E+01 -4.4371E+01 3.8830E-17 -6.3531E-15 0.0000E+00 0.0000E+00 + 8.6000E-01 2.5800E-02 6.1527E-01 9.5779E-02 1.7094E+01 -4.5217E+01 1.0218E-17 7.6383E-16 0.0000E+00 0.0000E+00 + 8.8000E-01 2.6400E-02 6.1623E-01 9.1520E-02 1.7121E+01 -4.6080E+01 1.7201E-17 5.9683E-16 0.0000E+00 0.0000E+00 + 9.0000E-01 2.7000E-02 6.1718E-01 9.1802E-02 1.7149E+01 -4.6909E+01 8.0044E-18 -2.3834E-15 0.0000E+00 0.0000E+00 + 9.2000E-01 2.7600E-02 6.1813E-01 9.4210E-02 1.7178E+01 -4.8091E+01 -1.4817E-17 -2.0490E-15 0.0000E+00 0.0000E+00 + 9.4000E-01 2.8200E-02 6.1914E-01 9.9943E-02 1.7207E+01 -4.9152E+01 6.9825E-18 6.2685E-15 0.0000E+00 0.0000E+00 + 9.6000E-01 2.8800E-02 6.2023E-01 1.1197E-01 1.7237E+01 -5.0770E+01 -9.3668E-19 -7.7891E-15 0.0000E+00 0.0000E+00 + 9.8000E-01 2.9400E-02 6.2136E-01 1.0606E-01 1.7267E+01 -5.0732E+01 -2.5461E-17 3.0411E-15 0.0000E+00 0.0000E+00 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 2.0000E-02 -1.3246E+06 4.8515E-01 8.1132E+01 0.0000E+00 -1.3247E+06 + 4.0000E-02 -1.6683E+04 9.8289E-01 7.7027E+01 0.0000E+00 -1.6761E+04 + 6.0000E-02 -3.5339E+03 7.7295E-01 5.5429E+01 0.0000E+00 -3.5901E+03 + 8.0000E-02 -1.6512E+03 7.3046E-01 4.5529E+01 0.0000E+00 -1.6974E+03 + 1.0000E-01 -1.0380E+03 5.9712E-01 3.4957E+01 0.0000E+00 -1.0736E+03 + 1.2000E-01 -6.8259E+02 6.0487E-01 3.0985E+01 0.0000E+00 -7.1418E+02 + 1.4000E-01 -4.8990E+02 5.1838E-01 2.5194E+01 0.0000E+00 -5.1561E+02 + 1.6000E-01 -3.4639E+02 5.7715E-01 2.3853E+01 0.0000E+00 -3.7082E+02 + 1.8000E-01 -2.6194E+02 6.7997E-01 2.3049E+01 0.0000E+00 -2.8567E+02 + 2.0000E-01 -2.0261E+02 7.7861E-01 2.2456E+01 0.0000E+00 -2.2584E+02 + 2.2000E-01 -1.6121E+02 8.0622E-01 2.0695E+01 0.0000E+00 -1.8271E+02 + 2.4000E-01 -1.2905E+02 8.5465E-01 1.9644E+01 0.0000E+00 -1.4955E+02 + 2.6000E-01 -1.1080E+02 8.8609E-01 1.8350E+01 0.0000E+00 -1.3004E+02 + 2.8000E-01 -9.4008E+01 9.3739E-01 1.7594E+01 0.0000E+00 -1.1254E+02 + 3.0000E-01 -8.4109E+01 9.3451E-01 1.6274E+01 0.0000E+00 -1.0132E+02 + 3.2000E-01 -7.4133E+01 9.4066E-01 1.5440E+01 0.0000E+00 -9.0513E+01 + 3.4000E-01 -6.9656E+01 9.4321E-01 1.4467E+01 0.0000E+00 -8.5065E+01 + 3.6000E-01 -6.3229E+01 9.3389E-01 1.3721E+01 0.0000E+00 -7.7884E+01 + 3.8000E-01 -6.1027E+01 9.4042E-01 1.2977E+01 0.0000E+00 -7.4945E+01 + 4.0000E-01 -5.6931E+01 9.2238E-01 1.2372E+01 0.0000E+00 -7.0225E+01 + 4.2000E-01 -5.5868E+01 9.2843E-01 1.1768E+01 0.0000E+00 -6.8564E+01 + 4.4000E-01 -5.2893E+01 9.0453E-01 1.1276E+01 0.0000E+00 -6.5074E+01 + 4.6000E-01 -5.2565E+01 9.1587E-01 1.0809E+01 0.0000E+00 -6.4289E+01 + 4.8000E-01 -5.0570E+01 8.9322E-01 1.0436E+01 0.0000E+00 -6.1899E+01 + 5.0000E-01 -5.0548E+01 8.9687E-01 1.0030E+01 0.0000E+00 -6.1474E+01 + 5.2000E-01 -4.9397E+01 8.9012E-01 9.7930E+00 0.0000E+00 -6.0080E+01 + 5.4000E-01 -4.9522E+01 8.7344E-01 9.3883E+00 0.0000E+00 -5.9784E+01 + 5.6000E-01 -4.9264E+01 8.8076E-01 9.2708E+00 0.0000E+00 -5.9415E+01 + 5.8000E-01 -4.9548E+01 8.5910E-01 8.9091E+00 0.0000E+00 -5.9316E+01 + 6.0000E-01 -4.9664E+01 8.6610E-01 8.8358E+00 0.0000E+00 -5.9366E+01 + 6.2000E-01 -5.0595E+01 8.4677E-01 8.5404E+00 0.0000E+00 -5.9982E+01 + 6.4000E-01 -5.1067E+01 8.4909E-01 8.4928E+00 0.0000E+00 -6.0409E+01 + 6.6000E-01 -5.2427E+01 8.3464E-01 8.2430E+00 0.0000E+00 -6.1505E+01 + 6.8000E-01 -5.3287E+01 8.3099E-01 8.2130E+00 0.0000E+00 -6.2331E+01 + 7.0000E-01 -5.5342E+01 8.2225E-01 8.0069E+00 0.0000E+00 -6.4171E+01 + 7.2000E-01 -5.6389E+01 8.1525E-01 7.9905E+00 0.0000E+00 -6.5194E+01 + 7.4000E-01 -5.8860E+01 8.0332E-01 7.7959E+00 0.0000E+00 -6.7459E+01 + 7.6000E-01 -6.0588E+01 7.9453E-01 7.7975E+00 0.0000E+00 -6.9180E+01 + 7.8000E-01 -6.3054E+01 7.8774E-01 7.6349E+00 0.0000E+00 -7.1477E+01 + 8.0000E-01 -6.5529E+01 7.6758E-01 7.6385E+00 0.0000E+00 -7.3935E+01 + 8.2000E-01 -6.7929E+01 7.2855E-01 7.3869E+00 0.0000E+00 -7.6044E+01 + 8.4000E-01 -7.0866E+01 7.0123E-01 7.4176E+00 0.0000E+00 -7.8985E+01 + 8.6000E-01 -7.3950E+01 6.7012E-01 7.2434E+00 0.0000E+00 -8.1863E+01 + 8.8000E-01 -7.6058E+01 6.1382E-01 7.1646E+00 0.0000E+00 -8.3837E+01 + 9.0000E-01 -7.9803E+01 6.1962E-01 7.1279E+00 0.0000E+00 -8.7550E+01 + 9.2000E-01 -8.2891E+01 6.5473E-01 7.4313E+00 0.0000E+00 -9.0977E+01 + 9.4000E-01 -8.8286E+01 7.3934E-01 7.4837E+00 0.0000E+00 -9.6509E+01 + 9.6000E-01 -9.2168E+01 9.3130E-01 8.2082E+00 0.0000E+00 -1.0131E+02 + 9.8000E-01 -9.8288E+01 8.3842E-01 7.9352E+00 0.0000E+00 -1.0706E+02 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_fixed_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_fixed_bdy new file mode 100644 index 000000000..05fac8c99 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_fixed_bdy @@ -0,0 +1,51 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 4.1667E-02 -1.4583E-03 1.2453E+00 1.9912E-01 -8.7886E+00 -2.0117E+01 3.9532E-03 3.0844E-01 5.4323E-04 -4.0255E-07 + 8.3333E-02 -2.9167E-03 1.2483E+00 2.6663E-01 -8.8197E+00 -2.2474E+01 7.9062E-03 3.0734E-01 5.4320E-04 -4.7768E-06 + 1.2500E-01 -4.3750E-03 1.2518E+00 2.7988E-01 -8.8520E+00 -2.1840E+01 1.1859E-02 3.0613E-01 5.4302E-04 -2.2588E-05 + 1.6667E-01 -5.8333E-03 1.2554E+00 2.6953E-01 -8.8832E+00 -2.1011E+01 1.5808E-02 3.0474E-01 5.4242E-04 -6.9425E-05 + 2.0833E-01 -7.2917E-03 1.2586E+00 2.3610E-01 -8.9136E+00 -2.0595E+01 1.9751E-02 3.0288E-01 5.4089E-04 -1.6664E-04 + 2.5000E-01 -8.7500E-03 1.2613E+00 1.7869E-01 -8.9435E+00 -2.0491E+01 2.3676E-02 3.0008E-01 5.3759E-04 -3.4045E-04 + 2.9167E-01 -1.0208E-02 1.2630E+00 8.0587E-02 -8.9734E+00 -2.0446E+01 2.7568E-02 2.9567E-01 5.3131E-04 -6.1974E-04 + 3.3333E-01 -1.1667E-02 1.2631E+00 -6.6519E-02 -9.0030E+00 -2.0195E+01 3.1398E-02 2.8878E-01 5.2048E-04 -1.0319E-03 + 3.7500E-01 -1.3125E-02 1.2609E+00 -2.7542E-01 -9.0319E+00 -1.9477E+01 3.5128E-02 2.7840E-01 5.0320E-04 -1.5956E-03 + 4.1667E-01 -1.4583E-02 1.2554E+00 -5.5243E-01 -9.0593E+00 -1.8087E+01 3.8701E-02 2.6346E-01 4.7744E-04 -2.3095E-03 + 4.5833E-01 -1.6042E-02 1.2458E+00 -9.0205E-01 -9.0841E+00 -1.5832E+01 4.2051E-02 2.4299E-01 4.4139E-04 -3.1384E-03 + 5.0000E-01 -1.7500E-02 1.2311E+00 -1.3149E+00 -9.1048E+00 -1.2615E+01 4.5098E-02 2.1648E-01 3.9406E-04 -3.9990E-03 + 5.4167E-01 -1.8958E-02 1.2106E+00 -1.7692E+00 -9.1202E+00 -8.4761E+00 4.7760E-02 1.8418E-01 3.3589E-04 -4.7543E-03 + 5.8333E-01 -2.0417E-02 1.1840E+00 -2.2244E+00 -9.1291E+00 -3.6760E+00 4.9966E-02 1.4747E-01 2.6949E-04 -5.2258E-03 + 6.2500E-01 -2.1875E-02 1.1517E+00 -2.6293E+00 -9.1308E+00 1.3039E+00 5.1674E-02 1.0905E-01 1.9983E-04 -5.2378E-03 + 6.6667E-01 -2.3333E-02 1.1147E+00 -2.9289E+00 -9.1256E+00 5.8450E+00 5.2883E-02 7.2627E-02 1.3374E-04 -4.6918E-03 + 7.0833E-01 -2.4792E-02 1.0747E+00 -3.0821E+00 -9.1145E+00 9.3559E+00 5.3647E-02 4.2101E-02 7.8265E-05 -3.6491E-03 + 7.5000E-01 -2.6250E-02 1.0338E+00 -3.0779E+00 -9.0992E+00 1.1613E+01 5.4061E-02 2.0238E-02 3.8341E-05 -2.3621E-03 + 7.9167E-01 -2.7708E-02 9.9393E-01 -2.9417E+00 -9.0815E+00 1.2725E+01 5.4245E-02 7.5054E-03 1.4767E-05 -1.1932E-03 + 8.3333E-01 -2.9167E-02 9.5640E-01 -2.7326E+00 -9.0624E+00 1.3348E+01 5.4307E-02 1.9143E-03 4.0644E-06 -4.2393E-04 + 8.7500E-01 -3.0625E-02 9.2188E-01 -2.4970E+00 -9.0429E+00 1.3428E+01 5.4321E-02 2.7526E-04 6.8143E-07 -8.8216E-05 + 9.1667E-01 -3.2083E-02 8.9035E-01 -2.2892E+00 -9.0226E+00 1.4380E+01 5.4323E-02 1.5227E-05 5.0569E-08 -7.4761E-06 + 9.5833E-01 -3.3542E-02 8.6161E-01 -2.0832E+00 -9.0026E+00 1.3141E+01 5.4323E-02 -3.2258E-06 6.9179E-10 -1.0538E-07 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 4.1667E-02 -1.3352E+04 7.6560E-01 1.3794E+01 -1.9521E-02 -1.3366E+04 + 8.3333E-02 -1.6493E+02 1.3825E+00 3.3783E+00 -1.3064E-01 -1.6956E+02 + 1.2500E-01 -3.6942E+01 1.5345E+00 1.9239E+00 -4.0455E-01 -3.9996E+01 + 1.6667E-01 -1.0475E+01 1.4331E+00 1.4972E+00 -9.0769E-01 -1.2498E+01 + 2.0833E-01 -4.4298E+00 1.1072E+00 1.2598E+00 -1.7306E+00 -5.0661E+00 + 2.5000E-01 -4.3422E+00 6.3848E-01 9.2281E-01 -2.9734E+00 -2.9300E+00 + 2.9167E-01 -6.6002E+00 1.3073E-01 4.2752E-01 -4.7033E+00 -2.4551E+00 + 3.3333E-01 -9.3686E+00 8.9661E-02 -3.5895E-01 -6.8906E+00 -2.2088E+00 + 3.7500E-01 -1.1231E+01 1.5471E+00 -1.4667E+00 -9.3229E+00 -1.9880E+00 + 4.1667E-01 -9.9944E+00 6.2617E+00 -2.7198E+00 -1.1554E+01 -1.9821E+00 + 4.5833E-01 -2.0647E+00 1.6787E+01 -3.7801E+00 -1.2879E+01 -2.1927E+00 + 5.0000E-01 1.5769E+01 3.5832E+01 -4.2043E+00 -1.2508E+01 -3.3506E+00 + 5.4167E-01 4.6736E+01 6.5085E+01 -3.3671E+00 -9.9369E+00 -5.0446E+00 + 5.8333E-01 8.8853E+01 1.0309E+02 -1.0453E+00 -5.4566E+00 -7.7353E+00 + 6.2500E-01 1.3704E+02 1.4409E+02 3.1121E+00 -3.7676E-01 -9.7883E+00 + 6.6667E-01 1.7872E+02 1.7860E+02 8.0370E+00 3.4576E+00 -1.1377E+01 + 7.0833E-01 2.0426E+02 1.9728E+02 1.3390E+01 4.7860E+00 -1.1195E+01 + 7.5000E-01 2.0629E+02 1.9609E+02 1.6878E+01 3.8854E+00 -1.0559E+01 + 7.9167E-01 1.9023E+02 1.7843E+02 1.8964E+01 2.1174E+00 -9.2787E+00 + 8.3333E-01 1.6342E+02 1.5332E+02 1.7609E+01 7.6663E-01 -8.2730E+00 + 8.7500E-01 1.3721E+02 1.2747E+02 1.7122E+01 1.5448E-01 -7.5370E+00 + 9.1667E-01 1.1346E+02 1.0665E+02 1.3468E+01 1.3450E-02 -6.6660E+00 + 9.5833E-01 9.5834E+01 8.7933E+01 1.4325E+01 1.6626E-04 -6.4235E+00 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_fixed_bdy_nzeta_37 b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_fixed_bdy_nzeta_37 new file mode 100644 index 000000000..05fac8c99 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_fixed_bdy_nzeta_37 @@ -0,0 +1,51 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 4.1667E-02 -1.4583E-03 1.2453E+00 1.9912E-01 -8.7886E+00 -2.0117E+01 3.9532E-03 3.0844E-01 5.4323E-04 -4.0255E-07 + 8.3333E-02 -2.9167E-03 1.2483E+00 2.6663E-01 -8.8197E+00 -2.2474E+01 7.9062E-03 3.0734E-01 5.4320E-04 -4.7768E-06 + 1.2500E-01 -4.3750E-03 1.2518E+00 2.7988E-01 -8.8520E+00 -2.1840E+01 1.1859E-02 3.0613E-01 5.4302E-04 -2.2588E-05 + 1.6667E-01 -5.8333E-03 1.2554E+00 2.6953E-01 -8.8832E+00 -2.1011E+01 1.5808E-02 3.0474E-01 5.4242E-04 -6.9425E-05 + 2.0833E-01 -7.2917E-03 1.2586E+00 2.3610E-01 -8.9136E+00 -2.0595E+01 1.9751E-02 3.0288E-01 5.4089E-04 -1.6664E-04 + 2.5000E-01 -8.7500E-03 1.2613E+00 1.7869E-01 -8.9435E+00 -2.0491E+01 2.3676E-02 3.0008E-01 5.3759E-04 -3.4045E-04 + 2.9167E-01 -1.0208E-02 1.2630E+00 8.0587E-02 -8.9734E+00 -2.0446E+01 2.7568E-02 2.9567E-01 5.3131E-04 -6.1974E-04 + 3.3333E-01 -1.1667E-02 1.2631E+00 -6.6519E-02 -9.0030E+00 -2.0195E+01 3.1398E-02 2.8878E-01 5.2048E-04 -1.0319E-03 + 3.7500E-01 -1.3125E-02 1.2609E+00 -2.7542E-01 -9.0319E+00 -1.9477E+01 3.5128E-02 2.7840E-01 5.0320E-04 -1.5956E-03 + 4.1667E-01 -1.4583E-02 1.2554E+00 -5.5243E-01 -9.0593E+00 -1.8087E+01 3.8701E-02 2.6346E-01 4.7744E-04 -2.3095E-03 + 4.5833E-01 -1.6042E-02 1.2458E+00 -9.0205E-01 -9.0841E+00 -1.5832E+01 4.2051E-02 2.4299E-01 4.4139E-04 -3.1384E-03 + 5.0000E-01 -1.7500E-02 1.2311E+00 -1.3149E+00 -9.1048E+00 -1.2615E+01 4.5098E-02 2.1648E-01 3.9406E-04 -3.9990E-03 + 5.4167E-01 -1.8958E-02 1.2106E+00 -1.7692E+00 -9.1202E+00 -8.4761E+00 4.7760E-02 1.8418E-01 3.3589E-04 -4.7543E-03 + 5.8333E-01 -2.0417E-02 1.1840E+00 -2.2244E+00 -9.1291E+00 -3.6760E+00 4.9966E-02 1.4747E-01 2.6949E-04 -5.2258E-03 + 6.2500E-01 -2.1875E-02 1.1517E+00 -2.6293E+00 -9.1308E+00 1.3039E+00 5.1674E-02 1.0905E-01 1.9983E-04 -5.2378E-03 + 6.6667E-01 -2.3333E-02 1.1147E+00 -2.9289E+00 -9.1256E+00 5.8450E+00 5.2883E-02 7.2627E-02 1.3374E-04 -4.6918E-03 + 7.0833E-01 -2.4792E-02 1.0747E+00 -3.0821E+00 -9.1145E+00 9.3559E+00 5.3647E-02 4.2101E-02 7.8265E-05 -3.6491E-03 + 7.5000E-01 -2.6250E-02 1.0338E+00 -3.0779E+00 -9.0992E+00 1.1613E+01 5.4061E-02 2.0238E-02 3.8341E-05 -2.3621E-03 + 7.9167E-01 -2.7708E-02 9.9393E-01 -2.9417E+00 -9.0815E+00 1.2725E+01 5.4245E-02 7.5054E-03 1.4767E-05 -1.1932E-03 + 8.3333E-01 -2.9167E-02 9.5640E-01 -2.7326E+00 -9.0624E+00 1.3348E+01 5.4307E-02 1.9143E-03 4.0644E-06 -4.2393E-04 + 8.7500E-01 -3.0625E-02 9.2188E-01 -2.4970E+00 -9.0429E+00 1.3428E+01 5.4321E-02 2.7526E-04 6.8143E-07 -8.8216E-05 + 9.1667E-01 -3.2083E-02 8.9035E-01 -2.2892E+00 -9.0226E+00 1.4380E+01 5.4323E-02 1.5227E-05 5.0569E-08 -7.4761E-06 + 9.5833E-01 -3.3542E-02 8.6161E-01 -2.0832E+00 -9.0026E+00 1.3141E+01 5.4323E-02 -3.2258E-06 6.9179E-10 -1.0538E-07 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 4.1667E-02 -1.3352E+04 7.6560E-01 1.3794E+01 -1.9521E-02 -1.3366E+04 + 8.3333E-02 -1.6493E+02 1.3825E+00 3.3783E+00 -1.3064E-01 -1.6956E+02 + 1.2500E-01 -3.6942E+01 1.5345E+00 1.9239E+00 -4.0455E-01 -3.9996E+01 + 1.6667E-01 -1.0475E+01 1.4331E+00 1.4972E+00 -9.0769E-01 -1.2498E+01 + 2.0833E-01 -4.4298E+00 1.1072E+00 1.2598E+00 -1.7306E+00 -5.0661E+00 + 2.5000E-01 -4.3422E+00 6.3848E-01 9.2281E-01 -2.9734E+00 -2.9300E+00 + 2.9167E-01 -6.6002E+00 1.3073E-01 4.2752E-01 -4.7033E+00 -2.4551E+00 + 3.3333E-01 -9.3686E+00 8.9661E-02 -3.5895E-01 -6.8906E+00 -2.2088E+00 + 3.7500E-01 -1.1231E+01 1.5471E+00 -1.4667E+00 -9.3229E+00 -1.9880E+00 + 4.1667E-01 -9.9944E+00 6.2617E+00 -2.7198E+00 -1.1554E+01 -1.9821E+00 + 4.5833E-01 -2.0647E+00 1.6787E+01 -3.7801E+00 -1.2879E+01 -2.1927E+00 + 5.0000E-01 1.5769E+01 3.5832E+01 -4.2043E+00 -1.2508E+01 -3.3506E+00 + 5.4167E-01 4.6736E+01 6.5085E+01 -3.3671E+00 -9.9369E+00 -5.0446E+00 + 5.8333E-01 8.8853E+01 1.0309E+02 -1.0453E+00 -5.4566E+00 -7.7353E+00 + 6.2500E-01 1.3704E+02 1.4409E+02 3.1121E+00 -3.7676E-01 -9.7883E+00 + 6.6667E-01 1.7872E+02 1.7860E+02 8.0370E+00 3.4576E+00 -1.1377E+01 + 7.0833E-01 2.0426E+02 1.9728E+02 1.3390E+01 4.7860E+00 -1.1195E+01 + 7.5000E-01 2.0629E+02 1.9609E+02 1.6878E+01 3.8854E+00 -1.0559E+01 + 7.9167E-01 1.9023E+02 1.7843E+02 1.8964E+01 2.1174E+00 -9.2787E+00 + 8.3333E-01 1.6342E+02 1.5332E+02 1.7609E+01 7.6663E-01 -8.2730E+00 + 8.7500E-01 1.3721E+02 1.2747E+02 1.7122E+01 1.5448E-01 -7.5370E+00 + 9.1667E-01 1.1346E+02 1.0665E+02 1.3468E+01 1.3450E-02 -6.6660E+00 + 9.5833E-01 9.5834E+01 8.7933E+01 1.4325E+01 1.6626E-04 -6.4235E+00 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_free_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_free_bdy new file mode 100644 index 000000000..cc11888e4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.cth_like_free_bdy @@ -0,0 +1,31 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 7.1429E-02 -2.5000E-03 1.2673E+00 6.6389E-02 -8.5687E+00 -1.2301E+01 6.7767E-03 3.1634E-01 5.4319E-04 -3.5656E-06 + 1.4286E-01 -5.0000E-03 1.2707E+00 2.4891E-01 -8.6077E+00 -1.8900E+01 1.3551E-02 3.1469E-01 5.4270E-04 -4.2236E-05 + 2.1429E-01 -7.5000E-03 1.2763E+00 2.7352E-01 -8.6584E+00 -2.1635E+01 2.0309E-02 3.1154E-01 5.4010E-04 -1.9848E-04 + 2.8571E-01 -1.0000E-02 1.2811E+00 1.6197E-01 -8.7141E+00 -2.2951E+01 2.7002E-02 3.0491E-01 5.3142E-04 -6.0002E-04 + 3.5714E-01 -1.2500E-02 1.2816E+00 -1.1114E-01 -8.7715E+00 -2.2959E+01 3.3514E-02 2.9102E-01 5.0968E-04 -1.3860E-03 + 4.2857E-01 -1.5000E-02 1.2739E+00 -5.9161E-01 -8.8261E+00 -2.0740E+01 3.9625E-02 2.6475E-01 4.6564E-04 -2.6151E-03 + 5.0000E-01 -1.7500E-02 1.2531E+00 -1.2820E+00 -8.8714E+00 -1.5484E+01 4.5004E-02 2.2167E-01 3.9136E-04 -4.0959E-03 + 5.7143E-01 -2.0000E-02 1.2157E+00 -2.0837E+00 -8.8999E+00 -7.3414E+00 4.9266E-02 1.6208E-01 2.8779E-04 -5.2272E-03 + 6.4286E-01 -2.2500E-02 1.1616E+00 -2.7756E+00 -8.9069E+00 1.7285E+00 5.2133E-02 9.5587E-02 1.7228E-04 -5.1522E-03 + 7.1429E-01 -2.5000E-02 1.0962E+00 -3.1026E+00 -8.8940E+00 8.5948E+00 5.3643E-02 4.0108E-02 7.5548E-05 -3.5408E-03 + 7.8571E-01 -2.7500E-02 1.0287E+00 -2.9846E+00 -8.8688E+00 1.1618E+01 5.4196E-02 9.6703E-03 2.0602E-05 -1.4054E-03 + 8.5714E-01 -3.0000E-02 9.6673E-01 -2.6107E+00 -8.8392E+00 1.2051E+01 5.4313E-02 8.8965E-04 2.5732E-06 -2.2162E-04 + 9.2857E-01 -3.2500E-02 9.1332E-01 -2.2301E+00 -8.8090E+00 1.2072E+01 5.4323E-02 1.1100E-05 6.2313E-08 -5.6583E-06 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 7.1429E-02 -4.2585E+03 8.0901E-02 4.3550E+00 -5.9732E-02 -4.2629E+03 + 1.4286E-01 -2.4874E+01 1.1476E+00 3.9579E+00 -5.5357E-01 -2.9426E+01 + 2.1429E-01 -3.5370E+00 1.4021E+00 2.2471E+00 -2.0306E+00 -5.1556E+00 + 2.8571E-01 -6.9804E+00 4.9806E-01 1.0861E+00 -5.0145E+00 -3.5500E+00 + 3.5714E-01 -1.2946E+01 2.3760E-01 -7.1745E-01 -9.5588E+00 -2.9074E+00 + 4.2857E-01 -1.3191E+01 6.8163E+00 -3.7556E+00 -1.4090E+01 -2.1614E+00 + 5.0000E-01 8.2335E+00 3.2337E+01 -7.4410E+00 -1.4878E+01 -1.7848E+00 + 5.7143E-01 6.4874E+01 8.5975E+01 -9.9512E+00 -8.9154E+00 -2.2342E+00 + 6.4286E-01 1.4039E+02 1.5280E+02 -1.0186E+01 1.4577E-01 -2.3615E+00 + 7.1429E-01 1.8529E+02 1.9036E+02 -7.7789E+00 4.0499E+00 -1.3403E+00 + 7.8571E-01 1.7257E+02 1.7516E+02 -4.1518E+00 2.1675E+00 -6.0532E-01 + 8.5714E-01 1.3151E+02 1.3313E+02 -1.3941E+00 3.3547E-01 -5.6518E-01 + 9.2857E-01 9.5060E+01 9.6480E+01 -8.0610E-01 7.9853E-03 -6.2197E-01 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev new file mode 100644 index 000000000..3a71c5f3d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev @@ -0,0 +1,111 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 1.8519E-02 1.8519E-02 1.0000E+00 0.0000E+00 1.2340E+02 -6.5391E+00 -1.0171E-02 -4.4508E-03 1.5417E-07 -1.2730E-09 + 3.7037E-02 3.7037E-02 1.0000E+00 0.0000E+00 1.2352E+02 -6.8053E+00 -2.0343E-02 -4.4476E-03 1.5126E-07 -1.2717E-09 + 5.5556E-02 5.5556E-02 1.0000E+00 0.0000E+00 1.2365E+02 -6.9015E+00 -3.0518E-02 -4.4442E-03 1.4835E-07 -1.2704E-09 + 7.4074E-02 7.4074E-02 1.0000E+00 0.0000E+00 1.2378E+02 -6.9705E+00 -4.0696E-02 -4.4408E-03 1.4544E-07 -1.2691E-09 + 9.2593E-02 9.2593E-02 1.0000E+00 0.0000E+00 1.2391E+02 -7.0081E+00 -5.0876E-02 -4.4373E-03 1.4254E-07 -1.2677E-09 + 1.1111E-01 1.1111E-01 1.0000E+00 0.0000E+00 1.2403E+02 -7.0288E+00 -6.1059E-02 -4.4338E-03 1.3963E-07 -1.2664E-09 + 1.2963E-01 1.2963E-01 1.0000E+00 0.0000E+00 1.2417E+02 -7.0415E+00 -7.1244E-02 -4.4304E-03 1.3672E-07 -1.2651E-09 + 1.4815E-01 1.4815E-01 1.0000E+00 0.0000E+00 1.2430E+02 -7.0541E+00 -8.1433E-02 -4.4270E-03 1.3381E-07 -1.2638E-09 + 1.6667E-01 1.6667E-01 1.0000E+00 0.0000E+00 1.2443E+02 -7.0678E+00 -9.1624E-02 -4.4235E-03 1.3090E-07 -1.2624E-09 + 1.8519E-01 1.8519E-01 1.0000E+00 0.0000E+00 1.2456E+02 -7.0817E+00 -1.0182E-01 -4.4201E-03 1.2799E-07 -1.2611E-09 + 2.0370E-01 2.0370E-01 1.0000E+00 0.0000E+00 1.2469E+02 -7.0975E+00 -1.1202E-01 -4.4167E-03 1.2508E-07 -1.2598E-09 + 2.2222E-01 2.2222E-01 1.0000E+00 0.0000E+00 1.2482E+02 -7.1137E+00 -1.2222E-01 -4.4133E-03 1.2217E-07 -1.2584E-09 + 2.4074E-01 2.4074E-01 1.0000E+00 0.0000E+00 1.2495E+02 -7.1301E+00 -1.3242E-01 -4.4100E-03 1.1926E-07 -1.2571E-09 + 2.5926E-01 2.5926E-01 1.0000E+00 0.0000E+00 1.2508E+02 -7.1474E+00 -1.4262E-01 -4.4066E-03 1.1636E-07 -1.2558E-09 + 2.7778E-01 2.7778E-01 1.0000E+00 0.0000E+00 1.2522E+02 -7.1637E+00 -1.5283E-01 -4.4033E-03 1.1345E-07 -1.2545E-09 + 2.9630E-01 2.9630E-01 1.0000E+00 0.0000E+00 1.2535E+02 -7.1808E+00 -1.6304E-01 -4.3999E-03 1.1054E-07 -1.2531E-09 + 3.1481E-01 3.1481E-01 1.0000E+00 0.0000E+00 1.2548E+02 -7.1978E+00 -1.7326E-01 -4.3966E-03 1.0763E-07 -1.2518E-09 + 3.3333E-01 3.3333E-01 1.0000E+00 0.0000E+00 1.2562E+02 -7.2147E+00 -1.8348E-01 -4.3933E-03 1.0472E-07 -1.2505E-09 + 3.5185E-01 3.5185E-01 1.0000E+00 0.0000E+00 1.2575E+02 -7.2321E+00 -1.9370E-01 -4.3900E-03 1.0181E-07 -1.2491E-09 + 3.7037E-01 3.7037E-01 1.0000E+00 0.0000E+00 1.2588E+02 -7.2492E+00 -2.0392E-01 -4.3867E-03 9.8902E-08 -1.2478E-09 + 3.8889E-01 3.8889E-01 1.0000E+00 0.0000E+00 1.2602E+02 -7.2662E+00 -2.1415E-01 -4.3834E-03 9.5993E-08 -1.2465E-09 + 4.0741E-01 4.0741E-01 1.0000E+00 0.0000E+00 1.2615E+02 -7.2837E+00 -2.2438E-01 -4.3801E-03 9.3084E-08 -1.2451E-09 + 4.2593E-01 4.2593E-01 1.0000E+00 0.0000E+00 1.2629E+02 -7.3011E+00 -2.3462E-01 -4.3769E-03 9.0175E-08 -1.2438E-09 + 4.4444E-01 4.4444E-01 1.0000E+00 0.0000E+00 1.2642E+02 -7.3186E+00 -2.4486E-01 -4.3736E-03 8.7266E-08 -1.2425E-09 + 4.6296E-01 4.6296E-01 1.0000E+00 0.0000E+00 1.2656E+02 -7.3362E+00 -2.5510E-01 -4.3704E-03 8.4358E-08 -1.2412E-09 + 4.8148E-01 4.8148E-01 1.0000E+00 0.0000E+00 1.2670E+02 -7.3536E+00 -2.6534E-01 -4.3672E-03 8.1449E-08 -1.2398E-09 + 5.0000E-01 5.0000E-01 1.0000E+00 0.0000E+00 1.2683E+02 -7.3715E+00 -2.7559E-01 -4.3640E-03 7.8540E-08 -1.2385E-09 + 5.1852E-01 5.1852E-01 1.0000E+00 0.0000E+00 1.2697E+02 -7.3892E+00 -2.8584E-01 -4.3608E-03 7.5631E-08 -1.2372E-09 + 5.3704E-01 5.3704E-01 1.0000E+00 0.0000E+00 1.2711E+02 -7.4070E+00 -2.9610E-01 -4.3576E-03 7.2722E-08 -1.2358E-09 + 5.5556E-01 5.5556E-01 1.0000E+00 0.0000E+00 1.2724E+02 -7.4251E+00 -3.0635E-01 -4.3544E-03 6.9813E-08 -1.2345E-09 + 5.7407E-01 5.7407E-01 1.0000E+00 0.0000E+00 1.2738E+02 -7.4429E+00 -3.1662E-01 -4.3512E-03 6.6904E-08 -1.2332E-09 + 5.9259E-01 5.9259E-01 1.0000E+00 0.0000E+00 1.2752E+02 -7.4610E+00 -3.2688E-01 -4.3481E-03 6.3995E-08 -1.2318E-09 + 6.1111E-01 6.1111E-01 1.0000E+00 0.0000E+00 1.2766E+02 -7.4792E+00 -3.3715E-01 -4.3450E-03 6.1087E-08 -1.2305E-09 + 6.2963E-01 6.2963E-01 1.0000E+00 0.0000E+00 1.2780E+02 -7.4973E+00 -3.4743E-01 -4.3418E-03 5.8178E-08 -1.2291E-09 + 6.4815E-01 6.4815E-01 1.0000E+00 0.0000E+00 1.2793E+02 -7.5157E+00 -3.5770E-01 -4.3387E-03 5.5269E-08 -1.2278E-09 + 6.6667E-01 6.6667E-01 1.0000E+00 0.0000E+00 1.2807E+02 -7.5340E+00 -3.6798E-01 -4.3357E-03 5.2360E-08 -1.2265E-09 + 6.8519E-01 6.8519E-01 1.0000E+00 0.0000E+00 1.2821E+02 -7.5523E+00 -3.7827E-01 -4.3326E-03 4.9451E-08 -1.2251E-09 + 7.0370E-01 7.0370E-01 1.0000E+00 0.0000E+00 1.2835E+02 -7.5710E+00 -3.8856E-01 -4.3295E-03 4.6542E-08 -1.2238E-09 + 7.2222E-01 7.2222E-01 1.0000E+00 0.0000E+00 1.2849E+02 -7.5894E+00 -3.9885E-01 -4.3265E-03 4.3633E-08 -1.2225E-09 + 7.4074E-01 7.4074E-01 1.0000E+00 0.0000E+00 1.2863E+02 -7.6082E+00 -4.0915E-01 -4.3234E-03 4.0724E-08 -1.2211E-09 + 7.5926E-01 7.5926E-01 1.0000E+00 0.0000E+00 1.2878E+02 -7.6270E+00 -4.1945E-01 -4.3204E-03 3.7815E-08 -1.2198E-09 + 7.7778E-01 7.7778E-01 1.0000E+00 0.0000E+00 1.2892E+02 -7.6455E+00 -4.2975E-01 -4.3174E-03 3.4907E-08 -1.2185E-09 + 7.9630E-01 7.9630E-01 1.0000E+00 0.0000E+00 1.2906E+02 -7.6648E+00 -4.4006E-01 -4.3144E-03 3.1998E-08 -1.2171E-09 + 8.1481E-01 8.1481E-01 1.0000E+00 0.0000E+00 1.2920E+02 -7.6835E+00 -4.5038E-01 -4.3114E-03 2.9089E-08 -1.2158E-09 + 8.3333E-01 8.3333E-01 1.0000E+00 0.0000E+00 1.2934E+02 -7.7026E+00 -4.6069E-01 -4.3085E-03 2.6180E-08 -1.2144E-09 + 8.5185E-01 8.5185E-01 1.0000E+00 0.0000E+00 1.2949E+02 -7.7220E+00 -4.7102E-01 -4.3055E-03 2.3271E-08 -1.2131E-09 + 8.7037E-01 8.7037E-01 1.0000E+00 0.0000E+00 1.2963E+02 -7.7409E+00 -4.8134E-01 -4.3026E-03 2.0362E-08 -1.2118E-09 + 8.8889E-01 8.8889E-01 1.0000E+00 0.0000E+00 1.2977E+02 -7.7602E+00 -4.9167E-01 -4.2997E-03 1.7453E-08 -1.2104E-09 + 9.0741E-01 9.0741E-01 1.0000E+00 0.0000E+00 1.2992E+02 -7.7799E+00 -5.0201E-01 -4.2967E-03 1.4544E-08 -1.2091E-09 + 9.2593E-01 9.2593E-01 1.0000E+00 0.0000E+00 1.3006E+02 -7.7989E+00 -5.1235E-01 -4.2939E-03 1.1636E-08 -1.2077E-09 + 9.4444E-01 9.4444E-01 1.0000E+00 0.0000E+00 1.3021E+02 -7.8187E+00 -5.2269E-01 -4.2910E-03 8.7266E-09 -1.2064E-09 + 9.6296E-01 9.6296E-01 1.0000E+00 0.0000E+00 1.3035E+02 -7.8383E+00 -5.3304E-01 -4.2881E-03 5.8178E-09 -1.2051E-09 + 9.8148E-01 9.8148E-01 1.0000E+00 0.0000E+00 1.3050E+02 -7.8579E+00 -5.4339E-01 -4.2853E-03 2.9089E-09 -1.2037E-09 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 1.8519E-02 -1.1639E-03 0.0000E+00 0.0000E+00 -1.1084E-04 -1.0530E-03 + 3.7037E-02 -3.0151E-04 0.0000E+00 0.0000E+00 -5.7772E-05 -2.4374E-04 + 5.5556E-02 -6.7034E-05 0.0000E+00 0.0000E+00 -3.9124E-05 -2.7910E-05 + 7.4074E-02 -3.0849E-05 0.0000E+00 0.0000E+00 -2.9686E-05 -1.1632E-06 + 9.2593E-02 -2.6732E-05 0.0000E+00 0.0000E+00 -2.3918E-05 -2.8142E-06 + 1.1111E-01 -2.2602E-05 0.0000E+00 0.0000E+00 -2.0024E-05 -2.5780E-06 + 1.2963E-01 -1.8444E-05 0.0000E+00 0.0000E+00 -1.7224E-05 -1.2207E-06 + 1.4815E-01 -1.5619E-05 0.0000E+00 0.0000E+00 -1.5123E-05 -4.9569E-07 + 1.6667E-01 -1.3694E-05 0.0000E+00 0.0000E+00 -1.3492E-05 -2.0152E-07 + 1.8519E-01 -1.2247E-05 0.0000E+00 0.0000E+00 -1.2188E-05 -5.9386E-08 + 2.0370E-01 -1.1152E-05 0.0000E+00 0.0000E+00 -1.1124E-05 -2.8744E-08 + 2.2222E-01 -1.0253E-05 0.0000E+00 0.0000E+00 -1.0238E-05 -1.4980E-08 + 2.4074E-01 -9.4967E-06 0.0000E+00 0.0000E+00 -9.4883E-06 -8.4066E-09 + 2.5926E-01 -8.8569E-06 0.0000E+00 0.0000E+00 -8.8472E-06 -9.7168E-09 + 2.7778E-01 -8.2946E-06 0.0000E+00 0.0000E+00 -8.2906E-06 -4.0069E-09 + 2.9630E-01 -7.8081E-06 0.0000E+00 0.0000E+00 -7.8045E-06 -3.5688E-09 + 3.1481E-01 -7.3786E-06 0.0000E+00 0.0000E+00 -7.3757E-06 -2.8436E-09 + 3.3333E-01 -6.9962E-06 0.0000E+00 0.0000E+00 -6.9945E-06 -1.6953E-09 + 3.5185E-01 -6.6563E-06 0.0000E+00 0.0000E+00 -6.6540E-06 -2.2525E-09 + 3.7037E-01 -6.3487E-06 0.0000E+00 0.0000E+00 -6.3474E-06 -1.3008E-09 + 3.8889E-01 -6.0709E-06 0.0000E+00 0.0000E+00 -6.0700E-06 -8.8560E-10 + 4.0741E-01 -5.8191E-06 0.0000E+00 0.0000E+00 -5.8183E-06 -8.5683E-10 + 4.2593E-01 -5.5891E-06 0.0000E+00 0.0000E+00 -5.5885E-06 -6.5573E-10 + 4.4444E-01 -5.3787E-06 0.0000E+00 0.0000E+00 -5.3780E-06 -7.1150E-10 + 4.6296E-01 -5.1852E-06 0.0000E+00 0.0000E+00 -5.1845E-06 -7.1593E-10 + 4.8148E-01 -5.0063E-06 0.0000E+00 0.0000E+00 -5.0058E-06 -4.8299E-10 + 5.0000E-01 -4.8414E-06 0.0000E+00 0.0000E+00 -4.8408E-06 -5.9299E-10 + 5.1852E-01 -4.6879E-06 0.0000E+00 0.0000E+00 -4.6875E-06 -4.1675E-10 + 5.3704E-01 -4.5455E-06 0.0000E+00 0.0000E+00 -4.5449E-06 -5.3610E-10 + 5.5556E-01 -4.4128E-06 0.0000E+00 0.0000E+00 -4.4121E-06 -7.1048E-10 + 5.7407E-01 -4.2882E-06 0.0000E+00 0.0000E+00 -4.2877E-06 -5.2928E-10 + 5.9259E-01 -4.1720E-06 0.0000E+00 0.0000E+00 -4.1714E-06 -6.2149E-10 + 6.1111E-01 -4.0628E-06 0.0000E+00 0.0000E+00 -4.0621E-06 -6.6668E-10 + 6.2963E-01 -3.9601E-06 0.0000E+00 0.0000E+00 -3.9594E-06 -7.4611E-10 + 6.4815E-01 -3.8638E-06 0.0000E+00 0.0000E+00 -3.8628E-06 -1.0812E-09 + 6.6667E-01 -3.7725E-06 0.0000E+00 0.0000E+00 -3.7715E-06 -1.0005E-09 + 6.8519E-01 -3.6863E-06 0.0000E+00 0.0000E+00 -3.6852E-06 -1.0817E-09 + 7.0370E-01 -3.6052E-06 0.0000E+00 0.0000E+00 -3.6037E-06 -1.4480E-09 + 7.2222E-01 -3.5277E-06 0.0000E+00 0.0000E+00 -3.5263E-06 -1.3525E-09 + 7.4074E-01 -3.4549E-06 0.0000E+00 0.0000E+00 -3.4530E-06 -1.8826E-09 + 7.5926E-01 -3.3856E-06 0.0000E+00 0.0000E+00 -3.3834E-06 -2.1772E-09 + 7.7778E-01 -3.3190E-06 0.0000E+00 0.0000E+00 -3.3170E-06 -2.0305E-09 + 7.9630E-01 -3.2569E-06 0.0000E+00 0.0000E+00 -3.2540E-06 -2.8545E-09 + 8.1481E-01 -3.1965E-06 0.0000E+00 0.0000E+00 -3.1938E-06 -2.6826E-09 + 8.3333E-01 -3.1397E-06 0.0000E+00 0.0000E+00 -3.1364E-06 -3.2745E-09 + 8.5185E-01 -3.0860E-06 0.0000E+00 0.0000E+00 -3.0817E-06 -4.2707E-09 + 8.7037E-01 -3.0333E-06 0.0000E+00 0.0000E+00 -3.0292E-06 -4.0410E-09 + 8.8889E-01 -2.9839E-06 0.0000E+00 0.0000E+00 -2.9791E-06 -4.7176E-09 + 9.0741E-01 -2.9372E-06 0.0000E+00 0.0000E+00 -2.9312E-06 -5.9668E-09 + 9.2593E-01 -2.8907E-06 0.0000E+00 0.0000E+00 -2.8851E-06 -5.5883E-09 + 9.4444E-01 -2.8484E-06 0.0000E+00 0.0000E+00 -2.8411E-06 -7.2550E-09 + 9.6296E-01 -2.8067E-06 0.0000E+00 0.0000E+00 -2.7988E-06 -7.9269E-09 + 9.8148E-01 -2.7665E-06 0.0000E+00 0.0000E+00 -2.7581E-06 -8.4421E-09 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_analytical b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_analytical new file mode 100644 index 000000000..519c3cec6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_analytical @@ -0,0 +1,63 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 3.3333E-02 1.0472E-01 -1.9996E+00 -1.3767E-04 3.9738E+01 -1.5785E-02 1.1599E-01 2.7886E-02 1.2083E-01 -1.0013E-03 + 6.6667E-02 2.0944E-01 -1.9999E+00 -1.3299E-05 3.9739E+01 -2.7857E-03 2.3210E-01 2.7919E-02 1.1667E-01 -1.0013E-03 + 1.0000E-01 3.1416E-01 -1.9999E+00 -5.9566E-06 3.9739E+01 5.9238E-04 3.4836E-01 2.7953E-02 1.1250E-01 -1.0013E-03 + 1.3333E-01 4.1888E-01 -1.9999E+00 -3.3642E-06 3.9739E+01 8.4968E-04 4.6475E-01 2.7988E-02 1.0833E-01 -1.0013E-03 + 1.6667E-01 5.2360E-01 -2.0000E+00 -1.8952E-06 3.9739E+01 4.9537E-04 5.8130E-01 2.8023E-02 1.0417E-01 -1.0013E-03 + 2.0000E-01 6.2832E-01 -2.0000E+00 -1.0663E-06 3.9739E+01 3.1525E-04 6.9799E-01 2.8059E-02 1.0000E-01 -1.0013E-03 + 2.3333E-01 7.3304E-01 -2.0000E+00 -6.5051E-07 3.9739E+01 2.4707E-04 8.1483E-01 2.8095E-02 9.5833E-02 -1.0013E-03 + 2.6667E-01 8.3776E-01 -2.0000E+00 -4.3693E-07 3.9739E+01 2.1463E-04 9.3182E-01 2.8131E-02 9.1667E-02 -1.0013E-03 + 3.0000E-01 9.4248E-01 -2.0000E+00 -3.1231E-07 3.9738E+01 1.9463E-04 1.0490E+00 2.8168E-02 8.7500E-02 -1.0013E-03 + 3.3333E-01 1.0472E+00 -2.0000E+00 -2.3145E-07 3.9738E+01 1.8036E-04 1.1663E+00 2.8206E-02 8.3333E-02 -1.0013E-03 + 3.6667E-01 1.1519E+00 -2.0000E+00 -1.7565E-07 3.9738E+01 1.6938E-04 1.2837E+00 2.8244E-02 7.9167E-02 -1.0013E-03 + 4.0000E-01 1.2566E+00 -2.0000E+00 -1.3568E-07 3.9738E+01 1.6053E-04 1.4013E+00 2.8283E-02 7.5000E-02 -1.0013E-03 + 4.3333E-01 1.3614E+00 -2.0000E+00 -1.0628E-07 3.9738E+01 1.5317E-04 1.5191E+00 2.8322E-02 7.0833E-02 -1.0013E-03 + 4.6667E-01 1.4661E+00 -2.0000E+00 -8.4184E-08 3.9738E+01 1.4691E-04 1.6370E+00 2.8361E-02 6.6667E-02 -1.0013E-03 + 5.0000E-01 1.5708E+00 -2.0000E+00 -6.7297E-08 3.9738E+01 1.4149E-04 1.7552E+00 2.8402E-02 6.2500E-02 -1.0013E-03 + 5.3333E-01 1.6755E+00 -2.0000E+00 -5.4224E-08 3.9738E+01 1.3671E-04 1.8734E+00 2.8442E-02 5.8333E-02 -1.0013E-03 + 5.6667E-01 1.7802E+00 -2.0000E+00 -4.3964E-08 3.9738E+01 1.3246E-04 1.9919E+00 2.8484E-02 5.4167E-02 -1.0013E-03 + 6.0000E-01 1.8850E+00 -2.0000E+00 -3.5894E-08 3.9738E+01 1.2863E-04 2.1105E+00 2.8526E-02 5.0000E-02 -1.0013E-03 + 6.3333E-01 1.9897E+00 -2.0000E+00 -2.9408E-08 3.9738E+01 1.2515E-04 2.2293E+00 2.8568E-02 4.5833E-02 -1.0013E-03 + 6.6667E-01 2.0944E+00 -2.0000E+00 -2.4358E-08 3.9738E+01 1.2196E-04 2.3483E+00 2.8612E-02 4.1667E-02 -1.0013E-03 + 7.0000E-01 2.1991E+00 -2.0000E+00 -2.0108E-08 3.9738E+01 1.1897E-04 2.4674E+00 2.8656E-02 3.7500E-02 -1.0013E-03 + 7.3333E-01 2.3038E+00 -2.0000E+00 -1.7084E-08 3.9738E+01 1.1626E-04 2.5868E+00 2.8700E-02 3.3333E-02 -1.0013E-03 + 7.6667E-01 2.4086E+00 -2.0000E+00 -1.4109E-08 3.9738E+01 1.1353E-04 2.7063E+00 2.8745E-02 2.9167E-02 -1.0013E-03 + 8.0000E-01 2.5133E+00 -2.0000E+00 -1.2636E-08 3.9738E+01 1.1133E-04 2.8260E+00 2.8791E-02 2.5000E-02 -1.0013E-03 + 8.3333E-01 2.6180E+00 -2.0000E+00 -1.0364E-08 3.9738E+01 1.0841E-04 2.9459E+00 2.8838E-02 2.0833E-02 -1.0013E-03 + 8.6667E-01 2.7227E+00 -2.0000E+00 -1.0082E-08 3.9738E+01 1.0716E-04 3.0660E+00 2.8886E-02 1.6667E-02 -1.0013E-03 + 9.0000E-01 2.8274E+00 -2.0000E+00 -8.2601E-09 3.9738E+01 1.0337E-04 3.1863E+00 2.8934E-02 1.2500E-02 -1.0013E-03 + 9.3333E-01 2.9322E+00 -2.0000E+00 -8.8970E-09 3.9738E+01 1.0341E-04 3.3068E+00 2.8983E-02 8.3333E-03 -1.0013E-03 + 9.6667E-01 3.0369E+00 -2.0000E+00 -7.3174E-09 3.9738E+01 9.8688E-05 3.4275E+00 2.9033E-02 4.1667E-03 -1.0013E-03 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 3.3333E-02 -3.6804E+00 7.4819E-06 1.2264E-03 -3.0351E+00 -6.4653E-01 + 6.6667E-02 -1.8768E+00 6.9824E-08 1.1951E-04 -1.5230E+00 -3.5394E-01 + 1.0000E-01 -1.2598E+00 1.4008E-08 5.3763E-05 -1.0210E+00 -2.3880E-01 + 1.3333E-01 -9.4953E-01 4.4683E-09 3.0522E-05 -7.7066E-01 -1.7891E-01 + 1.6667E-01 -7.6303E-01 1.4180E-09 1.7283E-05 -6.2053E-01 -1.4252E-01 + 2.0000E-01 -6.3865E-01 4.4888E-10 9.7740E-06 -5.2043E-01 -1.1823E-01 + 2.3333E-01 -5.4981E-01 1.6706E-10 5.9930E-06 -4.4892E-01 -1.0090E-01 + 2.6667E-01 -4.8319E-01 7.5369E-11 4.0458E-06 -3.9529E-01 -8.7904E-02 + 3.0000E-01 -4.3140E-01 3.8506E-11 2.9066E-06 -3.5359E-01 -7.7807E-02 + 3.3333E-01 -3.8997E-01 2.1148E-11 2.1652E-06 -3.2024E-01 -6.9739E-02 + 3.6667E-01 -3.5610E-01 1.2181E-11 1.6517E-06 -2.9296E-01 -6.3146E-02 + 4.0000E-01 -3.2789E-01 7.2681E-12 1.2826E-06 -2.7023E-01 -5.7659E-02 + 4.3333E-01 -3.0404E-01 4.4590E-12 1.0099E-06 -2.5102E-01 -5.3023E-02 + 4.6667E-01 -2.8361E-01 2.7978E-12 8.0422E-07 -2.3456E-01 -4.9054E-02 + 5.0000E-01 -2.6593E-01 1.7880E-12 6.4636E-07 -2.2031E-01 -4.5619E-02 + 5.3333E-01 -2.5047E-01 1.1607E-12 5.2361E-07 -2.0785E-01 -4.2617E-02 + 5.6667E-01 -2.3684E-01 7.6305E-13 4.2686E-07 -1.9687E-01 -3.9971E-02 + 6.0000E-01 -2.2474E-01 5.0863E-13 3.5044E-07 -1.8712E-01 -3.7622E-02 + 6.3333E-01 -2.1394E-01 3.4141E-13 2.8871E-07 -1.7841E-01 -3.5523E-02 + 6.6667E-01 -2.0422E-01 2.3423E-13 2.4048E-07 -1.7059E-01 -3.3635E-02 + 7.0000E-01 -1.9545E-01 1.5962E-13 1.9965E-07 -1.6352E-01 -3.1928E-02 + 7.3333E-01 -1.8749E-01 1.1523E-13 1.7061E-07 -1.5711E-01 -3.0378E-02 + 7.6667E-01 -1.8023E-01 7.8583E-14 1.4171E-07 -1.5127E-01 -2.8963E-02 + 8.0000E-01 -1.7359E-01 6.3036E-14 1.2766E-07 -1.4592E-01 -2.7667E-02 + 8.3333E-01 -1.6750E-01 4.2405E-14 1.0533E-07 -1.4102E-01 -2.6474E-02 + 8.6667E-01 -1.6188E-01 4.0125E-14 1.0307E-07 -1.3651E-01 -2.5374E-02 + 9.0000E-01 -1.5670E-01 2.6936E-14 8.4956E-08 -1.3234E-01 -2.4356E-02 + 9.3333E-01 -1.5190E-01 3.1249E-14 9.2065E-08 -1.2849E-01 -2.3410E-02 + 9.6667E-01 -1.4744E-01 2.1138E-14 7.6186E-08 -1.2491E-01 -2.2529E-02 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_free_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_free_bdy new file mode 100644 index 000000000..ebbd6ed81 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_free_bdy @@ -0,0 +1,65 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 3.2258E-02 3.2258E-02 4.8032E-01 -2.2371E-03 1.3410E+02 7.8735E+00 -7.9663E-03 -1.8177E-03 1.5201E-07 -1.1714E-09 + 6.4516E-02 6.4516E-02 4.7065E-01 -2.2415E-03 1.3384E+02 8.2999E+00 -1.5692E-02 -1.7577E-03 1.4695E-07 -1.1736E-09 + 9.6774E-02 9.6774E-02 4.6097E-01 -2.2461E-03 1.3356E+02 8.7077E+00 -2.3144E-02 -1.6976E-03 1.4188E-07 -1.1761E-09 + 1.2903E-01 1.2903E-01 4.5129E-01 -2.2509E-03 1.3328E+02 9.0954E+00 -3.0320E-02 -1.6373E-03 1.3681E-07 -1.1786E-09 + 1.6129E-01 1.6129E-01 4.4161E-01 -2.2560E-03 1.3298E+02 9.4406E+00 -3.7221E-02 -1.5766E-03 1.3174E-07 -1.1812E-09 + 1.9355E-01 1.9355E-01 4.3194E-01 -2.2613E-03 1.3267E+02 9.7523E+00 -4.3845E-02 -1.5154E-03 1.2668E-07 -1.1840E-09 + 2.2581E-01 2.2581E-01 4.2226E-01 -2.2667E-03 1.3235E+02 1.0042E+01 -5.0192E-02 -1.4539E-03 1.2161E-07 -1.1869E-09 + 2.5806E-01 2.5806E-01 4.1258E-01 -2.2724E-03 1.3202E+02 1.0319E+01 -5.6259E-02 -1.3919E-03 1.1654E-07 -1.1898E-09 + 2.9032E-01 2.9032E-01 4.0290E-01 -2.2782E-03 1.3168E+02 1.0591E+01 -6.2047E-02 -1.3294E-03 1.1148E-07 -1.1929E-09 + 3.2258E-01 3.2258E-01 3.9323E-01 -2.2842E-03 1.3134E+02 1.0864E+01 -6.7553E-02 -1.2666E-03 1.0641E-07 -1.1960E-09 + 3.5484E-01 3.5484E-01 3.8355E-01 -2.2904E-03 1.3098E+02 1.1140E+01 -7.2778E-02 -1.2032E-03 1.0134E-07 -1.1992E-09 + 3.8710E-01 3.8710E-01 3.7387E-01 -2.2967E-03 1.3062E+02 1.1422E+01 -7.7721E-02 -1.1395E-03 9.6275E-08 -1.2026E-09 + 4.1935E-01 4.1935E-01 3.6419E-01 -2.3033E-03 1.3025E+02 1.1711E+01 -8.2380E-02 -1.0753E-03 9.1208E-08 -1.2060E-09 + 4.5161E-01 4.5161E-01 3.5452E-01 -2.3101E-03 1.2986E+02 1.2007E+01 -8.6756E-02 -1.0106E-03 8.6140E-08 -1.2096E-09 + 4.8387E-01 4.8387E-01 3.4484E-01 -2.3171E-03 1.2947E+02 1.2312E+01 -9.0847E-02 -9.4557E-04 8.1073E-08 -1.2132E-09 + 5.1613E-01 5.1613E-01 3.3516E-01 -2.3243E-03 1.2907E+02 1.2627E+01 -9.4654E-02 -8.8014E-04 7.6006E-08 -1.2170E-09 + 5.4839E-01 5.4839E-01 3.2548E-01 -2.3318E-03 1.2866E+02 1.2954E+01 -9.8176E-02 -8.1434E-04 7.0939E-08 -1.2209E-09 + 5.8065E-01 5.8065E-01 3.1581E-01 -2.3395E-03 1.2823E+02 1.3294E+01 -1.0141E-01 -7.4824E-04 6.5872E-08 -1.2250E-09 + 6.1290E-01 6.1290E-01 3.0613E-01 -2.3474E-03 1.2780E+02 1.3648E+01 -1.0437E-01 -6.8188E-04 6.0805E-08 -1.2291E-09 + 6.4516E-01 6.4516E-01 2.9645E-01 -2.3557E-03 1.2735E+02 1.4020E+01 -1.0704E-01 -6.1534E-04 5.5738E-08 -1.2334E-09 + 6.7742E-01 6.7742E-01 2.8677E-01 -2.3642E-03 1.2689E+02 1.4411E+01 -1.0942E-01 -5.4871E-04 5.0671E-08 -1.2379E-09 + 7.0968E-01 7.0968E-01 2.7710E-01 -2.3730E-03 1.2642E+02 1.4824E+01 -1.1153E-01 -4.8212E-04 4.5604E-08 -1.2425E-09 + 7.4194E-01 7.4194E-01 2.6742E-01 -2.3821E-03 1.2594E+02 1.5261E+01 -1.1336E-01 -4.1570E-04 4.0537E-08 -1.2473E-09 + 7.7419E-01 7.7419E-01 2.5774E-01 -2.3916E-03 1.2544E+02 1.5728E+01 -1.1491E-01 -3.4962E-04 3.5470E-08 -1.2523E-09 + 8.0645E-01 8.0645E-01 2.4806E-01 -2.4015E-03 1.2492E+02 1.6227E+01 -1.1619E-01 -2.8410E-04 3.0403E-08 -1.2574E-09 + 8.3871E-01 8.3871E-01 2.3839E-01 -2.4118E-03 1.2439E+02 1.6762E+01 -1.1720E-01 -2.1940E-04 2.5335E-08 -1.2628E-09 + 8.7097E-01 8.7097E-01 2.2871E-01 -2.4225E-03 1.2384E+02 1.7340E+01 -1.1795E-01 -1.5581E-04 2.0268E-08 -1.2684E-09 + 9.0323E-01 9.0323E-01 2.1903E-01 -2.4337E-03 1.2327E+02 1.7964E+01 -1.1845E-01 -9.3676E-05 1.5201E-08 -1.2743E-09 + 9.3548E-01 9.3548E-01 2.0935E-01 -2.4454E-03 1.2268E+02 1.8650E+01 -1.1870E-01 -3.3611E-05 1.0134E-08 -1.2804E-09 + 9.6774E-01 9.6774E-01 1.9968E-01 -2.4577E-03 1.2207E+02 1.9362E+01 -1.1872E-01 2.7046E-05 5.0671E-09 -1.2868E-09 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 3.2258E-02 1.9478E-02 2.2500E-02 3.2550E-05 7.8467E-05 -3.1334E-03 + 6.4516E-02 2.1325E-02 2.2500E-02 -3.5478E-04 4.1369E-05 -8.6125E-04 + 9.6774E-02 2.1989E-02 2.2500E-02 -3.6454E-04 2.8934E-05 -1.7566E-04 + 1.2903E-01 2.2102E-02 2.2500E-02 -3.6809E-04 2.2667E-05 -5.2179E-05 + 1.6129E-01 2.2162E-02 2.2500E-02 -3.3337E-04 1.8822E-05 -2.3467E-05 + 1.9355E-01 2.2216E-02 2.2500E-02 -2.8661E-04 1.6204E-05 -1.4020E-05 + 2.2581E-01 2.2265E-02 2.2500E-02 -2.4007E-04 1.4302E-05 -9.1989E-06 + 2.5806E-01 2.2307E-02 2.2500E-02 -1.9958E-04 1.2861E-05 -6.1336E-06 + 2.9032E-01 2.2341E-02 2.2500E-02 -1.6698E-04 1.1737E-05 -4.1462E-06 + 3.2258E-01 2.2366E-02 2.2500E-02 -1.4199E-04 1.0839E-05 -2.8908E-06 + 3.5484E-01 2.2385E-02 2.2500E-02 -1.2338E-04 1.0109E-05 -2.1083E-06 + 3.8710E-01 2.2398E-02 2.2500E-02 -1.0968E-04 9.5070E-06 -1.6140E-06 + 4.1935E-01 2.2408E-02 2.2500E-02 -9.9546E-05 9.0052E-06 -1.2912E-06 + 4.5161E-01 2.2416E-02 2.2500E-02 -9.1875E-05 8.5832E-06 -1.0697E-06 + 4.8387E-01 2.2422E-02 2.2500E-02 -8.5809E-05 8.2261E-06 -9.0934E-07 + 5.1613E-01 2.2426E-02 2.2500E-02 -8.0704E-05 7.9233E-06 -7.8594E-07 + 5.4839E-01 2.2431E-02 2.2500E-02 -7.6031E-05 7.6666E-06 -6.8563E-07 + 5.8065E-01 2.2436E-02 2.2500E-02 -7.1350E-05 7.4501E-06 -5.9890E-07 + 6.1290E-01 2.2441E-02 2.2500E-02 -6.6211E-05 7.2692E-06 -5.2025E-07 + 6.4516E-01 2.2447E-02 2.2500E-02 -6.0134E-05 7.1207E-06 -4.4543E-07 + 6.7742E-01 2.2454E-02 2.2500E-02 -5.2524E-05 7.0025E-06 -3.7273E-07 + 7.0968E-01 2.2464E-02 2.2500E-02 -4.2636E-05 6.9131E-06 -3.0197E-07 + 7.4194E-01 2.2477E-02 2.2500E-02 -2.9473E-05 6.8520E-06 -2.3709E-07 + 7.7419E-01 2.2495E-02 2.2500E-02 -1.1716E-05 6.8193E-06 -1.8750E-07 + 8.0645E-01 2.2519E-02 2.2500E-02 1.2436E-05 6.8158E-06 -1.7374E-07 + 8.3871E-01 2.2552E-02 2.2500E-02 4.5427E-05 6.8433E-06 -2.3464E-07 + 8.7097E-01 2.2597E-02 2.2500E-02 9.0675E-05 6.9043E-06 -4.4227E-07 + 9.0323E-01 2.2660E-02 2.2500E-02 1.5359E-04 7.0025E-06 -9.3185E-07 + 9.3548E-01 2.2729E-02 2.2500E-02 2.2386E-04 7.1456E-06 -1.7715E-06 + 9.6774E-01 2.3073E-02 2.2500E-02 5.7553E-04 7.3233E-06 -9.7491E-06 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_no_axis b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_no_axis new file mode 100644 index 000000000..7fdb4eab6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mercier.solovev_no_axis @@ -0,0 +1,23 @@ + S PHI IOTA SHEAR VP WELL ITOR ITOR' PRES PRES' +------------------------------------------------------------------------------------------------------------------------ + 1.0000E-01 1.0000E-01 1.0000E+00 0.0000E+00 1.2399E+02 -6.3669E+00 -5.4992E-02 -4.4346E-03 1.4137E-07 -1.2669E-09 + 2.0000E-01 2.0000E-01 1.0000E+00 0.0000E+00 1.2466E+02 -6.9990E+00 -1.1002E-01 -4.4183E-03 1.2566E-07 -1.2601E-09 + 3.0000E-01 3.0000E-01 1.0000E+00 0.0000E+00 1.2537E+02 -7.2213E+00 -1.6514E-01 -4.4001E-03 1.0996E-07 -1.2530E-09 + 4.0000E-01 4.0000E-01 1.0000E+00 0.0000E+00 1.2609E+02 -7.3030E+00 -2.2035E-01 -4.3821E-03 9.4248E-08 -1.2457E-09 + 5.0000E-01 5.0000E-01 1.0000E+00 0.0000E+00 1.2683E+02 -7.3792E+00 -2.7565E-01 -4.3645E-03 7.8540E-08 -1.2385E-09 + 6.0000E-01 6.0000E-01 1.0000E+00 0.0000E+00 1.2757E+02 -7.4709E+00 -3.3106E-01 -4.3474E-03 6.2832E-08 -1.2313E-09 + 7.0000E-01 7.0000E-01 1.0000E+00 0.0000E+00 1.2832E+02 -7.5694E+00 -3.8658E-01 -4.3306E-03 4.7124E-08 -1.2241E-09 + 8.0000E-01 8.0000E-01 1.0000E+00 0.0000E+00 1.2908E+02 -7.6703E+00 -4.4221E-01 -4.3142E-03 3.1416E-08 -1.2169E-09 + 9.0000E-01 9.0000E-01 1.0000E+00 0.0000E+00 1.2986E+02 -7.7738E+00 -4.9796E-01 -4.2983E-03 1.5708E-08 -1.2096E-09 + + S DMerc DShear DCurr DWell Dgeod +---------------------------------------------------------------------------------------------------- + 1.0000E-01 -8.1710E-04 0.0000E+00 0.0000E+00 -2.0151E-05 -7.9695E-04 + 2.0000E-01 -3.0979E-05 0.0000E+00 0.0000E+00 -1.1176E-05 -1.9804E-05 + 3.0000E-01 -2.0456E-05 0.0000E+00 0.0000E+00 -7.7579E-06 -1.2698E-05 + 4.0000E-01 -9.8176E-06 0.0000E+00 0.0000E+00 -5.9396E-06 -3.8780E-06 + 5.0000E-01 -5.6584E-06 0.0000E+00 0.0000E+00 -4.8472E-06 -8.1123E-07 + 6.0000E-01 -4.4337E-06 0.0000E+00 0.0000E+00 -4.1293E-06 -3.0449E-07 + 7.0000E-01 -3.7943E-06 0.0000E+00 0.0000E+00 -3.6214E-06 -1.7290E-07 + 8.0000E-01 -3.3468E-06 0.0000E+00 0.0000E+00 -3.2431E-06 -1.0371E-07 + 9.0000E-01 -3.0373E-06 0.0000E+00 0.0000E+00 -2.9513E-06 -8.6037E-08 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mgrid_solovev.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mgrid_solovev.nc new file mode 100644 index 000000000..5ca4f7427 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/mgrid_solovev.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f17260704b9f6ca96c0f7202cc99dbfe8bdb625d1103d4597fd8ca5197b96fb1 +size 25215108 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/regenerate_test_data.sh b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/regenerate_test_data.sh new file mode 100755 index 000000000..71e270440 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/regenerate_test_data.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Activate the inofficial Bash Strict Mode. +# Reference: http://redsymbol.net/articles/unofficial-bash-strict-mode/ +set -euo pipefail +IFS=$'\n\t' + +# Make sure this script is run from inside //vmecpp/test_data. +if [[ $PWD != *vmecpp_large_cpp_tests/test_data ]] +then + echo "You must run this script from within //vmecpp_large_cpp_tests/test_data." + exit 255 +fi + +# Use indata2json to convert the Fortran input files to JSON. +# You can get it from here: https://github.com/jonathanschilling/indata2json +# Re-generate JSON input files from input files for Fortran educational_VMEC. +# The Fortran files have the mgrid file relative to this folder, i.e., without subfolder. +# The JSON files need to have vmecpp/test_data as prefix to work in the Bazel tests, +# so add that prefix via the new --mgrid_folder option of indata2json. +# Only do this for the free-boundary cases, +# as we would otherwise write "mgrid_file":"vmecpp/test_data/NONE". +indata2json input.solovev +indata2json input.solovev_analytical +indata2json --mgrid_folder vmecpp_large_cpp_tests/test_data input.solovev_free_bdy +indata2json input.solovev_no_axis +indata2json input.cth_like_fixed_bdy +indata2json input.cth_like_fixed_bdy_nzeta_37 +indata2json input.cma +indata2json --mgrid_folder vmecpp_large_cpp_tests/test_data input.cth_like_free_bdy + +# Re-do mgrid file for the cth_like_free_bdy case. +makegrid makegrid_parameters_cth_like.json coils.cth_like +makegrid makegrid_parameters_solovev.json coils.solovev + +# educational_VMEC is used to generate the reference data. +# You can get it from here: https://github.com/jonathanschilling/educational_VMEC +EDUCATIONAL_VMEC_EXECUTABLE=/home/jons/code/educational_VMEC/build/bin/xvmec + +# now re-do VMEC runs +rm -rf solovev && ${EDUCATIONAL_VMEC_EXECUTABLE} input.solovev +rm -rf solovev_analytical && ${EDUCATIONAL_VMEC_EXECUTABLE} input.solovev_analytical +rm -rf solovev_free_bdy && ${EDUCATIONAL_VMEC_EXECUTABLE} input.solovev_free_bdy +rm -rf solovev_no_axis && ${EDUCATIONAL_VMEC_EXECUTABLE} input.solovev_no_axis +rm -rf cth_like_fixed_bdy && ${EDUCATIONAL_VMEC_EXECUTABLE} input.cth_like_fixed_bdy +rm -rf cth_like_fixed_bdy_nzeta_37 && ${EDUCATIONAL_VMEC_EXECUTABLE} input.cth_like_fixed_bdy_nzeta_37 +rm -rf cma && ${EDUCATIONAL_VMEC_EXECUTABLE} input.cma +rm -rf cth_like_free_bdy && ${EDUCATIONAL_VMEC_EXECUTABLE} input.cth_like_free_bdy + +echo "formatting JSON files..." +find . -name "*.json" -print0 | while IFS= read -r -d '' f; do + python -m json.tool --indent 4 "$f" > "$f.tmp" && mv "$f.tmp" "$f" +done +echo "done" diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev.json new file mode 100644 index 000000000..8d1013639 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9725eabb1bc02647221aaad280a30c2697d56ee3dbb042692d548668fe529331 +size 1269 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev.out.h5 b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev.out.h5 new file mode 100644 index 000000000..c08e71b99 Binary files /dev/null and b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev.out.h5 differ diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00005_000001_01.solovev.json new file mode 100644 index 000000000..8ae0cd997 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9da4a5764f9a181caf0d832b7f306ef8e0157d87d8eaba2db8f3d13ad946b03f +size 2429 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00005_000002_01.solovev.json new file mode 100644 index 000000000..a6ede47eb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd6bd26e310ff62f32164e390a0b1d623d24dd7ae0c773a135e8b664f16a8a42 +size 2436 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00011_000001_01.solovev.json new file mode 100644 index 000000000..69a9bf745 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24f47e5e7337565f887960e968708d0069aac469169799b0bd72c9fbf273e3ab +size 5461 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00011_000002_01.solovev.json new file mode 100644 index 000000000..d92d14a04 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2ef63c4fe20e8cc94a796fb4b620ac1a74b60c30b7ccbc6551e73ff819f23cd +size 5473 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000001_01.solovev.json new file mode 100644 index 000000000..7115150f4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cdc7975ee37521e0427b772853faae199eac92f7aa7ba6263667c72e7dfcae1 +size 27735 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000002_01.solovev.json new file mode 100644 index 000000000..5a4b0ff45 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d588300bd890bf4c58ea91ca6935e7d9bc9a7ca7b1501aa5494fe4ead930e24 +size 27753 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000203_01.solovev.json new file mode 100644 index 000000000..f8de9b45d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/add_fluxes/add_fluxes_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d5a17c513cf411f613356a9a995abaaed533335087e25085b4e819278235523 +size 27742 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00005_000001_01.solovev.json new file mode 100644 index 000000000..371719b99 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a9c58bd32ec1248545c4cf928c8cfd4cdec495f5c9356b910a8b68d49956159 +size 3318 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00005_000002_01.solovev.json new file mode 100644 index 000000000..226e6766a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c310598b9f97c9034601f060216bffcedfc452e0d0d89198ab0498cfa1ab04c +size 3321 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00011_000001_01.solovev.json new file mode 100644 index 000000000..33355d0f0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:088613e262c0f0889d207ad14946726883882d2daa9886c14aa1e04c727bf76c +size 7445 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00011_000002_01.solovev.json new file mode 100644 index 000000000..fab52388a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:253fb38c68a84d7646ac7e98940900e81b03dfbfc52e2c9f49fe242656998e7d +size 7450 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000001_01.solovev.json new file mode 100644 index 000000000..4c38e6659 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9e5904ea0e8be4f732890a7de5ffece9c3a250eef8fff528a7e437bd82872b1 +size 37675 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000002_01.solovev.json new file mode 100644 index 000000000..25e6f9060 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:550133d58e0b35ce6f92b26dee2eaaef6660f5eef75389a819a13401af7e0e5b +size 37691 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000203_01.solovev.json new file mode 100644 index 000000000..d4f3c5939 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcontrav/bcontrav_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82bbb079b6023b91868991ab8e35c0ecb0328f863a77b449f3288b404b2f6fd7 +size 37702 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00005_000001_01.solovev.json new file mode 100644 index 000000000..248eba140 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84eeab59104804090de60c11a16c72f21f27704be562b1a27fd089f82488e197 +size 6060 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00005_000002_01.solovev.json new file mode 100644 index 000000000..bf969b2c4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9517abccf5122da29bb8ab58088d33ab88ebc16886f99ce502212db9cc7845e7 +size 6068 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00011_000001_01.solovev.json new file mode 100644 index 000000000..b5356ed7b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:496f4340ee13ce3869d5268952ae161652081083e9d246d033d3907ac9d564e5 +size 13758 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00011_000002_01.solovev.json new file mode 100644 index 000000000..b03143a4f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14ff080350eec8e75af08cdc2f2a86c2b1a69bfafd588d5da011996fb3a356b4 +size 13763 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000001_01.solovev.json new file mode 100644 index 000000000..257fe6644 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa24978d1870410c8249ccb16818fc82f4be5941c384b63ff55643ec6f69dbd1 +size 70285 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000002_01.solovev.json new file mode 100644 index 000000000..f3d532c38 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:636affbd990d1e7ad3d597892a3134d43c8c0bbfc2870cd698838e7564cca352 +size 70280 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000203_01.solovev.json new file mode 100644 index 000000000..bc5bee202 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov/bcov_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b2eeb439e5d32c076f17c7aa7f3a9a2e483cc31580c285ad96d18b560445d88 +size 70311 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00005_000001_01.solovev.json new file mode 100644 index 000000000..3614a13c3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:515d9b41cad76ffbb87c7b1467a48b99fca7d3e12f520d21982a1b6852adf07d +size 4405 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00005_000002_01.solovev.json new file mode 100644 index 000000000..5f3b9a199 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbf3ba019f476fb01cf5a77de8d8aa8d956414a0d9f71372bbafe10d4ed3027d +size 4404 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00011_000001_01.solovev.json new file mode 100644 index 000000000..e0bd61b04 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:542f7f66859f500720ff531be471c3e65b16a1d4965c35fadcb9f75331f53904 +size 9560 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00011_000002_01.solovev.json new file mode 100644 index 000000000..7aa5524ce --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1773e21340bd9e34faf1e2119b0f6e6817b98d11688df6c51f4a193c7cd42092 +size 9569 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000001_01.solovev.json new file mode 100644 index 000000000..f3456c9bb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cdeb22d2db0f150d11c24ddae7a9e33a7e6ec42ff75be26aa09d3947e5c5b57 +size 47297 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000002_01.solovev.json new file mode 100644 index 000000000..8bfe5387d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a4de73b30330b0cc1f83652b14f5bb15511240d5b1557dfbdffcc2e2d341e05 +size 47304 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000203_01.solovev.json new file mode 100644 index 000000000..0717e1f96 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcov_full/bcov_full_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7647b02eec8acbbf2d55eb671cddde10eb1688c5fd3fa73dcb3f8b30327e8de5 +size 47324 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcovar_fileout/bcovar_fileout_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcovar_fileout/bcovar_fileout_00055_000000_01.solovev.json new file mode 100644 index 000000000..6751879dd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bcovar_fileout/bcovar_fileout_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:790664cb23e19c699d66f61b382756b4bab9004cdeae7df24d8e8128143585c2 +size 138284 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bss/bss_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bss/bss_00055_000000_01.solovev.json new file mode 100644 index 000000000..28719f91b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/bss/bss_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f698feaf0bf81328585c8fa2a0fe3ddada1ec1ac71234db2fd2f8950ca11fae +size 201109 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00005_000001_01.solovev.json new file mode 100644 index 000000000..86b3f6c92 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0663eeceeb0c362cfa00fac22a3062c9899276668019e15422d63614a810dd0 +size 953 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00005_000002_01.solovev.json new file mode 100644 index 000000000..a1819b1f0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1094f362c55d753c3076e856ac192a343faf819971ee2d14152b56d8411d0b3d +size 960 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00011_000001_01.solovev.json new file mode 100644 index 000000000..6df9d552e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d7151e9dfd94606fc78184f28a98af2594898cb887ab134583cddb473a2ec5b +size 2219 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00011_000002_01.solovev.json new file mode 100644 index 000000000..9b894c0b8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6688bd2eb4222ecdd61d0429af9bd9f18fd427153192ad0a2735553982a33ae +size 2221 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000001_01.solovev.json new file mode 100644 index 000000000..5f2030484 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:207cba07f433cdd1f39829eeec0a1d8a3cbbe6e35f5b023a636ae30600bce2c8 +size 11390 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000002_01.solovev.json new file mode 100644 index 000000000..82a3cd7cd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:276761e1d8ad7fb37fbe982767f184c4150045d1d4f91127e0fb67a0f06fce0e +size 11390 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000203_01.solovev.json new file mode 100644 index 000000000..a743d60a0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/calc_fbal/calc_fbal_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee50188b12909efbf6970779f5b9963053d67f7a2b8804de8d6c5e23bda99f32 +size 11381 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00005_000001_01.solovev.json new file mode 100644 index 000000000..1cf85195c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da35837cb81070875395cf3838b71fbeb5cf47cd2acca6745a3ac7a9bea9ce26 +size 18413 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00005_000002_01.solovev.json new file mode 100644 index 000000000..423ff339a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76f1d6b903a82e21b210921b53eb52e37b56537e7150312e20c6fecc6345d2a6 +size 18927 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00011_000001_01.solovev.json new file mode 100644 index 000000000..0f214628c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:300d02f8809380f6a3e2344fe0d5738bfd8129d811113140b063f6298e59acb6 +size 43818 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00011_000002_01.solovev.json new file mode 100644 index 000000000..2c009a02c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e562b3621411ade59dc98d0e7682c60ed2a263d89d869b323b4af07524aba33 +size 43878 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000001_01.solovev.json new file mode 100644 index 000000000..6f0c7bc65 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e2a8e2500156693ecf1378b4610353876174ce05ecde12bd82ef7459fad6609 +size 226194 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000002_01.solovev.json new file mode 100644 index 000000000..defc9782b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:568f8bcf0fa8e2f9e7e7682ad8de247ad6b775659403823a2aee780653ff277c +size 226228 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000203_01.solovev.json new file mode 100644 index 000000000..63ff355d7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/constraint_force/constraint_force_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9df4951786551db17bcc73e4724f80eaa70c0a4f6f5b99dd8217f2ec4b35338 +size 226166 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00005_000001_01.solovev.json new file mode 100644 index 000000000..836665da6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02d8c5f43f4587e1ffc56db0203b261e9c0667a7ec19a53183c710968a279948 +size 23149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00005_000002_01.solovev.json new file mode 100644 index 000000000..bdf3bd71b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2662039bff325924fc71f1b603f24ef33146e901e5a4cd2d5d647b760ae842e7 +size 24898 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00011_000001_01.solovev.json new file mode 100644 index 000000000..3a3857d3d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bc1544e3c4a0b73bcd3c052d48107b537a54d7e779bc3e1fe172cde69db2047 +size 53830 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00011_000002_01.solovev.json new file mode 100644 index 000000000..5e6aec613 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:535ee20e5dbc15aba4f0c0d1db0201090afb4798ff4c8466b982b345c8a2541b +size 56679 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00055_000001_01.solovev.json new file mode 100644 index 000000000..de56df3ac --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0706ea2741cb8033cdcdf5b2ffc9fd37c254b8ec3af072436fc5b28751f84d3 +size 273085 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00055_000002_01.solovev.json new file mode 100644 index 000000000..27003f3e8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/evolve/evolve_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2732eeb75c91a437d6f2269450cbecb79020caa9778a143df9c76e43512bbb26 +size 289288 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fixaray/fixaray_00000_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fixaray/fixaray_00000_000001_01.solovev.json new file mode 100644 index 000000000..86e3f07e9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fixaray/fixaray_00000_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45db5c5af3387589f343cf86b2a40eeef867f8c454eb9a55ff5745febf1b6c02 +size 70478 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00005_000001_01.solovev.json new file mode 100644 index 000000000..99df392b6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd048eeb951ba472ef754eddce96160bbbf1f44a8c32388e8f11895a04f744ac +size 6603 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00011_000001_01.solovev.json new file mode 100644 index 000000000..7914c9ade --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb5140234f18f3c0193d86124833f578271ad7e894f47e176fe813e53361ead6 +size 16184 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00055_000001_01.solovev.json new file mode 100644 index 000000000..a8d532ce1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forceNorms_tcon/forceNorms_tcon_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78c8da228beb763a82049a4f26a8a0673a5a3a24acac555868af12e4af982a6c +size 80989 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00005_000001_01.solovev.json new file mode 100644 index 000000000..9e122cbcd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd9fe99843bf3578a5eed6bd9184cbec5e271993b2f1987f23a0043358370be5 +size 97445 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00005_000002_01.solovev.json new file mode 100644 index 000000000..281f497f5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ab80ec6ac2151d0cdd244fb98ace2c7390916d08c152273053e87be2f896b1b +size 99818 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00011_000001_01.solovev.json new file mode 100644 index 000000000..2db27e249 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:292253601149222259320d5dee7d009282d180515209d15334cab77a959022cf +size 225675 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00011_000002_01.solovev.json new file mode 100644 index 000000000..126d7c4b0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dea583c9d3aa19b23de44f313d983e1599283ff18cdda63f9b441ef3adc7053e +size 225604 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000001_01.solovev.json new file mode 100644 index 000000000..27eae4c0f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e81a847f2b52b0d98fb4573fe565ed1bac77b8bee3d8138b1fd0b8986ab5559 +size 1148647 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000002_01.solovev.json new file mode 100644 index 000000000..8b5f4a1c1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c75b1b0a34415bfc9973f8c478aa4a3407e3d06f8655dac7a699fd375942cd7b +size 1148859 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000203_01.solovev.json new file mode 100644 index 000000000..4c7623749 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/forces/forces_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f5dea08afaec48a357a3ba1136b07eef08047082d615f6e0c5b8e502f86cc7e +size 1148797 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00005_000001_01.solovev.json new file mode 100644 index 000000000..67adcaee0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d6ab257baf0291effe7ff7b08144cef59b1b6af7b0bd5632b098861e62430a3 +size 239 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00005_000002_01.solovev.json new file mode 100644 index 000000000..2a3210ea8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1a3189f746b0253042a13d31b3e7c494d93a736b1afaa0bb5b0098f57c5e59d +size 243 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00011_000001_01.solovev.json new file mode 100644 index 000000000..5ffa2e78d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9510b2009d5b40f4a9457dba3b6b7bc38dcc0ead96265e6e589abccfa06bbb50 +size 246 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00011_000002_01.solovev.json new file mode 100644 index 000000000..86f0f065c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba7d05901f0aaa0358091016fed18fc9cd661d927c2e6500767e4f6ba55c402 +size 246 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000001_01.solovev.json new file mode 100644 index 000000000..f3567af0d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c2041b4e08280f3074ad42e9c9cefa56b70f61d705f2a10186e6b0e3f525655 +size 247 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000002_01.solovev.json new file mode 100644 index 000000000..4802bad2c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9440eb9e40b29086d6a312900579646d160b1a015d507275ec7c231d56a9f50 +size 243 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000203_01.solovev.json new file mode 100644 index 000000000..f31944eb2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq/fsq_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2d0a3bc18690c2b53ef805b1e6948ca42251abbe9e1e74ef1dd60b3333e98ab +size 244 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00005_000001_01.solovev.json new file mode 100644 index 000000000..ece6fd103 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:738c28e5274cf94f201766061f80a5f00510c4c6fde72a6e3d58ff5653acd27d +size 143 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00005_000002_01.solovev.json new file mode 100644 index 000000000..33021513e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bd77e7b04cfbac75e6df191af388ad6327b47ce47615919d860441614b73d79 +size 147 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00011_000001_01.solovev.json new file mode 100644 index 000000000..8d3e56beb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79e77b9a9dc774f88f17611f6f1291a8f256ebc293c924ed3bdc03dba3b95b15 +size 148 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00011_000002_01.solovev.json new file mode 100644 index 000000000..5aebda0b5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f317994153c08f718d115e3ac32eb6b13cd457b1139e141815e17da80cefaafc +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000001_01.solovev.json new file mode 100644 index 000000000..be8ed4038 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cadb11b133c69372498c5dbc48f926911d0d49795b52d15435b9025602086a4 +size 149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000002_01.solovev.json new file mode 100644 index 000000000..a04dea4b7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7ab4e9f7d62a2d4708ac04520cc999d567a96b95aab8999aedaedeb03049089 +size 149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000203_01.solovev.json new file mode 100644 index 000000000..bb3dc1e8d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/fsq1/fsq1_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3fa4c8165471aee42cae69d279f8502d7353062df0cf8849501079e55355a35 +size 148 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00005_000001_01.solovev.json new file mode 100644 index 000000000..44c4cd6ab --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77bc010a2f59d3519279cd39cd10f3182251c926c10d3ab5d62224900f05e8ff +size 38844 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00005_000002_01.solovev.json new file mode 100644 index 000000000..49ff651b6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:728b3cbc03fc79504f94118cfeb9c992dc217a2886e780bcc6567dbd25b42653 +size 41977 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00011_000001_01.solovev.json new file mode 100644 index 000000000..84322296d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9743576c469b2964f924f61015f13da6e220402802e39bd52ce53b1ed3ef86c6 +size 94283 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00011_000002_01.solovev.json new file mode 100644 index 000000000..1b1ce8e11 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d15ea6404a40e79e09699a4e0712ccf2c60cc1e8a603b694b0b8db206928167 +size 94312 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000001_01.solovev.json new file mode 100644 index 000000000..abf6bc368 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69014c6484e49eb3f8f4739d7086c000adc272abfe13fdfdd0d2a18931d7df48 +size 478807 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000002_01.solovev.json new file mode 100644 index 000000000..530be34c9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0f44bc552a4828cd91e2ac04e7f6f777f124faefdce5f3708c1eb02179d30c4 +size 478741 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000203_01.solovev.json new file mode 100644 index 000000000..ffa6fb8d9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/funct3d_geometry/funct3d_geometry_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba9469d94ecba00ffe544e6d3441f9cc97c2e27f8accc3973062c3d648a1a363 +size 478836 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/interp/interp_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/interp/interp_00011_000001_01.solovev.json new file mode 100644 index 000000000..a80e686b9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/interp/interp_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5fa7378b36f3c282520a620c6c32a1ca6778550c66a5aaaa90d513d47c2bf3f +size 27090 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/interp/interp_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/interp/interp_00055_000001_01.solovev.json new file mode 100644 index 000000000..c3ebaff08 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/interp/interp_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:833b50ce08e9156fcb9de93ae2712b0e671e47d0992ee0a2771d22524b0f2199 +size 122772 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00005_000001_01.solovev.json new file mode 100644 index 000000000..b6ac621bf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb526bf40562a6994ae2cda27f1c81996488872b5492cd64c1dea6d930d59122 +size 12563 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00005_000002_01.solovev.json new file mode 100644 index 000000000..db5803785 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:337b91cec24ee3b128d1e3e769f0f43fea326a3cc5d3b649ade7b084f657953d +size 12511 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00011_000001_01.solovev.json new file mode 100644 index 000000000..23a0920bb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10d8e3e9f0df5e09774ef93b8cc2dd1114698a62c50c9f34a57a6329604a985f +size 27399 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00011_000002_01.solovev.json new file mode 100644 index 000000000..2e6add798 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b06834b1a11b671f66f7442aff45ce5286fc0512aec94eef27c01b017148579 +size 27389 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000001_01.solovev.json new file mode 100644 index 000000000..414e97b4e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a45b4be9209e8c4dbedfb2d3f67bab17df7ef7864cf40b65a2a06fe5b5dcf455 +size 136440 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000002_01.solovev.json new file mode 100644 index 000000000..bbd8393f6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b678b38f577d1707772768eec3d6873843ba15a01c7852fb74c6cfe482f307af +size 136457 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000203_01.solovev.json new file mode 100644 index 000000000..6bd531c49 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jacobian/jacobian_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a9f145ce6e8f9f20a859e51caffb81a83029937645d3e32926f373ee7b3b255 +size 136479 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00055_000000_01.solovev.json new file mode 100644 index 000000000..008967858 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1aa424d64bd36a2e74c8fd294a96a12645afad24458ab0907ae6b4868866b85 +size 194075 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jxbout/jxbout_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jxbout/jxbout_00055_000000_01.solovev.json new file mode 100644 index 000000000..897981dc8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/jxbout/jxbout_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64c218f38ebf0aa99d70add11b0dc1fa3f587029268da1773dde7b9d39f910c7 +size 352523 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00005_000001_01.solovev.json new file mode 100644 index 000000000..0d852915c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c650347a0fc06f7c167b5bf1af6021dc0c6c642c839c0481c83d2e7a88ed162e +size 9419 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00005_000002_01.solovev.json new file mode 100644 index 000000000..0a8afe919 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2290b1a86f0661e208e2e19d5cc8b3d22aa545bcf819b765cc3ca9aa48579542 +size 10267 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00011_000001_01.solovev.json new file mode 100644 index 000000000..310944440 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:377b67ded672a1a72bef97da7c26b6ddc96f297931c343f183b4a6d4781fef4a +size 22607 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00011_000002_01.solovev.json new file mode 100644 index 000000000..4686057f0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3a0d270bcb951ff0e537dbdc0e457b976412d0599d72fd5576cabc7012af76f +size 22628 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000001_01.solovev.json new file mode 100644 index 000000000..c8bfdcb45 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3402c9b42c65e0e0a843df2d6d542eaa9800acee90fbcc69a9ffb77174f52b5e +size 113310 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000002_01.solovev.json new file mode 100644 index 000000000..4017273ab --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d4dce7bcd4ce15c129f90007f724c4583bda6dae99b2ae72784e107411a0e66 +size 113338 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000203_01.solovev.json new file mode 100644 index 000000000..475fc4d9c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lambda_forces/lambda_forces_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:606b9dea5ef2a8bef37d1ae0081f95a7fdb5fc8b090446e7bc107a2a023b8991 +size 113314 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00005_000001_01.solovev.json new file mode 100644 index 000000000..661411dec --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1641febb8eac032d05129218f14de1c301f1e2de148c4b834c07d977cc446fac +size 1790 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00011_000001_01.solovev.json new file mode 100644 index 000000000..71ec8a8a1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4c7284da137581f0e55d282917a0c0d86b7db796ec33b92a63f170c5b2e5334 +size 3826 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00055_000001_01.solovev.json new file mode 100644 index 000000000..e7f7da041 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lamcal/lamcal_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:457dd8a82312cc623a3c606fd46c189f9c3b91df0679d41d3ade5efb36fe97d8 +size 18848 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00005_000001_01.solovev.json new file mode 100644 index 000000000..606224a8b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e0b00f082c50c27069df733f0e5639f705a79fcff1721692b71ef5880fb3650 +size 24468 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00005_000002_01.solovev.json new file mode 100644 index 000000000..c128dab55 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39d2ed177faa1f33c1ea7e5fb7dc9b96bf3aedbd05d80ac85bc795f4619cb78e +size 25337 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00011_000001_01.solovev.json new file mode 100644 index 000000000..39d20f23b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31e9ef8556d9cd760f49db43a984dccc96d2ea0fecfba50bac8430fbb3a4bca3 +size 56890 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00011_000002_01.solovev.json new file mode 100644 index 000000000..ae806cae6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6e2b433e22c71469596f4e70864ccafbb998bb7e2cb2d16e96aa367a7f5edb0 +size 56914 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000001_01.solovev.json new file mode 100644 index 000000000..25ab79337 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1d61c0f4879b4bb39e93445366e7c2ba6744193a8eac54f66eeb4b0ed5a29da +size 288433 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000002_01.solovev.json new file mode 100644 index 000000000..d4dd3a6a6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76479707cbdfb472f24b41e4582a41927c76468f0ac1696f8865c888596a4b79 +size 288313 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000203_01.solovev.json new file mode 100644 index 000000000..48cece805 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/lulv_comb/lulv_comb_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be2270aa2d9651f654471addd99f0df951f6dd3321814733d54ac83336e24cc +size 288291 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/mercier/mercier_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/mercier/mercier_00055_000000_01.solovev.json new file mode 100644 index 000000000..a026007ae --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/mercier/mercier_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87159b0028d7205dcaffc0f4b3a089ffab0ad8a13c61af64a44defc95aaf702e +size 113476 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00005_000001_01.solovev.json new file mode 100644 index 000000000..78599d4ff --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9067d21bcd805d2bead12027919cc189adb70706b8442fbfb7523221f7d7840f +size 8198 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00005_000002_01.solovev.json new file mode 100644 index 000000000..d5921d3b8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:427fcfbe6dfc53f690f72263f7216c19d10d7f4e72124dc7770094f3b24089e9 +size 8216 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00011_000001_01.solovev.json new file mode 100644 index 000000000..797f08982 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f09d337860ac6076a1af592caa756ead7dd2a2433b07a632a9d24dee5fbafd24 +size 18007 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00011_000002_01.solovev.json new file mode 100644 index 000000000..a7ffbef71 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1645571b9d6d2a15e10ecbaf2a60307e43ed311b3948efad0e4b2f7b2aabc813 +size 18003 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000001_01.solovev.json new file mode 100644 index 000000000..5e2357d27 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:123e5578f5b9ba6adb5e76332539b24b068419c2f9d367b856c3203eb7dc1a93 +size 89765 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000002_01.solovev.json new file mode 100644 index 000000000..a71151894 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80eeb7507f5d3ffaa6715614af664a6e18793f93a0cdacec760815abc686a812 +size 89681 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000203_01.solovev.json new file mode 100644 index 000000000..f7dcd1755 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/metric/metric_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69b0ad3d5bb0c9f07685f1543d33fee57ed0a7bb0a45c83ba207669c8e8b7d71 +size 89717 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00005_000187_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00005_000187_00.solovev.json new file mode 100644 index 000000000..96cd9d516 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00005_000187_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:862dfd1b5d7c457f51d9d76a8917a304400c428eb31132ce0bb31c319fae4400 +size 9661 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00011_000134_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00011_000134_00.solovev.json new file mode 100644 index 000000000..ae7d4d1be --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00011_000134_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e238b9cf3c0c32bd5eff942e43db77c17854d0ec6cb2cae0259cc2a4fa10fe1 +size 21972 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00055_000204_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00055_000204_00.solovev.json new file mode 100644 index 000000000..d94588d36 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/multigrid_result/multigrid_result_00055_000204_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2615d992321307aa909cf42baee3fe309214ac6bb4c60e5aa6a83ada24eeb91 +size 110299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00005_000001_01.solovev.json new file mode 100644 index 000000000..69600c205 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70cc07a049150b31755f9de5fa40ec918677023938808c8cfd0c780ab27c4b62 +size 4327 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00005_000002_01.solovev.json new file mode 100644 index 000000000..18c3f3707 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:483aa666553a861187a07789d18f91af099d4934c004b4508f73729986d57df0 +size 4324 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00011_000001_01.solovev.json new file mode 100644 index 000000000..bdda140fb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a95ccc89fcb6a9fc31727b4e13dda8d0de65ecdfb340e444d59a26cfeb1f0a21 +size 10014 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00011_000002_01.solovev.json new file mode 100644 index 000000000..1fe328ff4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be5efa202027eca2e7dab8f8915b538f47f37d2b552e5e3523da9f751c6f4b3c +size 10011 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000001_01.solovev.json new file mode 100644 index 000000000..ce302304f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04a19b1f24e8936fa73758c2110aa7e7870441d358f1020c13861b3d4a0c92cb +size 51428 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000002_01.solovev.json new file mode 100644 index 000000000..986a0a17b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ad375373ebc93dc64255faf1eeaa7dfe9ead70c2ff770cbca8586c8d97efed7 +size 51476 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000203_01.solovev.json new file mode 100644 index 000000000..8eafbfc06 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/phys_gc/phys_gc_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:698fac5ba272f811f72121883976133715ca996b6306e7b409a91095998328e2 +size 51559 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00005_000001_01.solovev.json new file mode 100644 index 000000000..362b32316 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a45b599dee8db60f641b41a15e90c2b7d1c30eab890173fab98dbdfe302a0d8e +size 4049 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00011_000001_01.solovev.json new file mode 100644 index 000000000..84f1366d2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60344d4c2de1f1cc99c613626ba9f789896a60e80056a681bb6f0ace2790c17b +size 8299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00055_000001_01.solovev.json new file mode 100644 index 000000000..ca12bf00a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/precondn/precondn_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77cbaa7a4bcc123f8c940b5103f05ca4e04e05b2eb58121e67341873d1d3917f +size 39471 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00005_000001_01.solovev.json new file mode 100644 index 000000000..6b435e5a0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de419f5e99c2e95d9c860747c73a0e6e52b75d9161c374e16e40c5a9ac1b8c44 +size 4464 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00011_000001_01.solovev.json new file mode 100644 index 000000000..c60935ec4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06e9b962f87daa653e87ff43ef0703b1175f014f378e1dc70407efd3597934a0 +size 9639 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00055_000001_01.solovev.json new file mode 100644 index 000000000..139d8421c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f89a21a97be42759b78a7c022740fe03c07dc14f1c1b2448a3938b10d6d2054 +size 47931 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00055_000203_01.solovev.json new file mode 100644 index 000000000..7e29745d1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/printout/printout_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:162513ee54e3f5aba68f85d30f1698f1ebbb7c94111c992a00caf1c9d7d72273 +size 58804 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00005_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00005_000001_00.solovev.json new file mode 100644 index 000000000..dcf4d3baf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00005_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e99523022e32f31dcb21d635131096a8577081c0f70165d46e5ae1cde674e9da +size 1929 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00011_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00011_000001_00.solovev.json new file mode 100644 index 000000000..a247208a9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00011_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53a0a3ac006086e745b2e465879b630a43ca74f168d42dfb00c45e337b4793a8 +size 3927 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00055_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00055_000001_00.solovev.json new file mode 100644 index 000000000..a93ae4338 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil1d/profil1d_00055_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:090dac73601ae05bd5d8c97ac9ccab07c2c073f5f79e3e5f4cf18ffb02b15783 +size 18518 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00005_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00005_000001_00.solovev.json new file mode 100644 index 000000000..0366cb3fc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00005_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:882d87dbc661e97de9e1c3fbd30d88717f05f47a0336029a9c9fc5bdd43fd26d +size 3458 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00011_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00011_000001_00.solovev.json new file mode 100644 index 000000000..3a62b77f3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00011_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3164cffca35c979654a729d5bc9b1b7b47e86ebaba239e88fca996f3408449a +size 7853 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00055_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00055_000001_00.solovev.json new file mode 100644 index 000000000..43717f98a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/profil3d/profil3d_00055_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24483b9971edcfbea6c06b6797a07b89764f0d6afc3200c8a4dd2275943a565a +size 39750 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/readin_boundary/readin_boundary_00000_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/readin_boundary/readin_boundary_00000_000001_01.solovev.json new file mode 100644 index 000000000..3efb9ac03 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/readin_boundary/readin_boundary_00000_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1774b826f630bc84ed6fd53a53d8df4c1259ab9354580ee0800cb51fcd223546 +size 404 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00005_000001_01.solovev.json new file mode 100644 index 000000000..255743b4f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7660cdf523c1a30b038786b9f13c5d660394238f91422c8b5feeabadfb71ee3 +size 2839 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00005_000002_01.solovev.json new file mode 100644 index 000000000..0ad8d194c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b62493829d1e0425316d755dce7828ca9893a70c4780a1807eecfa29e8c97414 +size 2847 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00011_000001_01.solovev.json new file mode 100644 index 000000000..916ce37bd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d23a1b03419048e17a1944a6666640df6fc6eb19b16a5c0247dac6b0e6a04446 +size 6677 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00011_000002_01.solovev.json new file mode 100644 index 000000000..a5922408f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01f414edbebb18e574d4791c4b6abbed49a0af5e44ef575873e6ceff00997fa7 +size 6683 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000001_01.solovev.json new file mode 100644 index 000000000..edf4c446b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7b3a711823cc12220e57f24bc87f333b386c59963a7d9b366713709f1225ce8 +size 34549 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000002_01.solovev.json new file mode 100644 index 000000000..333c73e89 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c52b4efeab64cc9f32ecd2761e77ac0241675c313b20a54715bfd6ec84f4127 +size 34621 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000203_01.solovev.json new file mode 100644 index 000000000..d3ae49e14 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scale_m1/scale_m1_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb85f94175084cbfaf8208183754b507b2935233a4ec5fb5e0e63f6ac6b9c67e +size 34672 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00005_000001_01.solovev.json new file mode 100644 index 000000000..df8b9f0df --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f48cb7fc65c00a5b4e242751d4e6bd6c13b75f8201e8e25c9e7b7debf7bda0c +size 3502 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00005_000002_01.solovev.json new file mode 100644 index 000000000..df8b9f0df --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f48cb7fc65c00a5b4e242751d4e6bd6c13b75f8201e8e25c9e7b7debf7bda0c +size 3502 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00011_000001_01.solovev.json new file mode 100644 index 000000000..41b032112 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24fe7cc622260c200ec698a5f9e6edf641434a1f78f5e8c978a49124e101fdab +size 8213 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00011_000002_01.solovev.json new file mode 100644 index 000000000..41b032112 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24fe7cc622260c200ec698a5f9e6edf641434a1f78f5e8c978a49124e101fdab +size 8213 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000001_01.solovev.json new file mode 100644 index 000000000..1a99fede5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c73858dcf0ee8d780a6328def3974af5bd67f8181fc4551ea45ffc9b7e99e8c +size 42840 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000002_01.solovev.json new file mode 100644 index 000000000..1a99fede5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c73858dcf0ee8d780a6328def3974af5bd67f8181fc4551ea45ffc9b7e99e8c +size 42840 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000203_01.solovev.json new file mode 100644 index 000000000..f227fee90 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_R/scalfor_R_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0256cb7b2f7f2e26792eca06a1efd19f633096787809f722e12a417192dcb408 +size 42845 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00005_000001_01.solovev.json new file mode 100644 index 000000000..b7327fdd3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:455ea30a591526c8a09312b62106e1541d445d77869c455cdd4091740aade6d1 +size 3513 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00005_000002_01.solovev.json new file mode 100644 index 000000000..b7327fdd3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:455ea30a591526c8a09312b62106e1541d445d77869c455cdd4091740aade6d1 +size 3513 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00011_000001_01.solovev.json new file mode 100644 index 000000000..1cd747e65 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81dcb4e82d8fb0d8cf346635f04d70e6f820280b04b6ba96190b60ac35a49ca4 +size 8230 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00011_000002_01.solovev.json new file mode 100644 index 000000000..1cd747e65 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81dcb4e82d8fb0d8cf346635f04d70e6f820280b04b6ba96190b60ac35a49ca4 +size 8230 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000001_01.solovev.json new file mode 100644 index 000000000..f835ad100 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7190f69a7972b8862e7ffac4ffe5207b6dc6ca94bf1481390cbebf9a25481dcd +size 42742 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000002_01.solovev.json new file mode 100644 index 000000000..f835ad100 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7190f69a7972b8862e7ffac4ffe5207b6dc6ca94bf1481390cbebf9a25481dcd +size 42742 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000203_01.solovev.json new file mode 100644 index 000000000..b605608e0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_Z/scalfor_Z_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80da8ce3e59711ae15a783662e0106bd73c497785847d3147d487374c321ee1c +size 42817 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00005_000001_01.solovev.json new file mode 100644 index 000000000..69bfcb3ce --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:877e06a88ef50392fa1aa76e1283da5004025571b74e4128b2fc93b466a1fe42 +size 8371 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00005_000002_01.solovev.json new file mode 100644 index 000000000..5378ea370 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41c91ac8d06785df3b534610605faa4fc1068e4d8e5d68670b95758af4a4b4bc +size 8377 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00011_000001_01.solovev.json new file mode 100644 index 000000000..061af9acc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30456b9dc5d452f6b0e1e79f0d5356b6170d57e19fee2a08122a870ba80aa86e +size 18335 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00011_000002_01.solovev.json new file mode 100644 index 000000000..e338e9c45 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d42a1256285d564fd7cc00ab7fb290b084240fafbc5bef5384c17cd8177e7449 +size 18350 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000001_01.solovev.json new file mode 100644 index 000000000..3f954bdf7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b001901c4b80d0733cd94026f27257756fb5c7eec56e4efcaf5871a2dc0efba +size 91249 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000002_01.solovev.json new file mode 100644 index 000000000..bff729fcc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99290e1ef2bad818c945ad78bd958d1f31ac54bd41814ee6cb74ecf8f8e4a017 +size 91210 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000203_01.solovev.json new file mode 100644 index 000000000..f6b14d259 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/scalfor_out/scalfor_out_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0491d418cffb87f071b3b79ab4270ad87293142c5f7810e0dfaa9c0607deca79 +size 91195 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/spectral_constraint/spectral_constraint_00000_000001_00.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/spectral_constraint/spectral_constraint_00000_000001_00.solovev.json new file mode 100644 index 000000000..a67099001 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/spectral_constraint/spectral_constraint_00000_000001_00.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:029efb5e9c637a41ad0f7d3997604f22046bd4b8283a44a7125aa729e12d491a +size 609 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_axis/threed1_axis_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_axis/threed1_axis_00055_000000_01.solovev.json new file mode 100644 index 000000000..abfc5640b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_axis/threed1_axis_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d7e4d44fac6d5044759ac27357efc5802ad16ea9cb001b71b724f6e0b1c7e59 +size 167 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_beta/threed1_beta_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_beta/threed1_beta_00055_000000_01.solovev.json new file mode 100644 index 000000000..886e68d46 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_beta/threed1_beta_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9faf1856709ba002fda7881b3d984e765964206a80d24843e514b0d85ad6fab8 +size 225 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_firstTable/threed1_firstTable_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_firstTable/threed1_firstTable_00055_000000_01.solovev.json new file mode 100644 index 000000000..88063d587 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_firstTable/threed1_firstTable_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8cff9b80ce76bf58c9a2e772f701d00b0519f9b89deed5ef11c08798777e117 +size 27814 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_geomag/threed1_geomag_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_geomag/threed1_geomag_00055_000000_01.solovev.json new file mode 100644 index 000000000..9cbf5f51f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_geomag/threed1_geomag_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:145126b9b5467b79d16c6630d540add2d75129923275c951414856389d72b9b8 +size 18747 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_shafrint/threed1_shafrint_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_shafrint/threed1_shafrint_00055_000000_01.solovev.json new file mode 100644 index 000000000..2da99534a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_shafrint/threed1_shafrint_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1450137b64c1740581d9282d99205857480075bbc5cd69622e09b9fa4aeded85 +size 514 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_volquant/threed1_volquant_00055_000000_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_volquant/threed1_volquant_00055_000000_01.solovev.json new file mode 100644 index 000000000..1df7862a3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/threed1_volquant/threed1_volquant_00055_000000_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:878f9a82460ea90c4ee1466f626d558cd3a3eb643e21dad25696e4c77f451588 +size 356 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00005_000001_01.solovev.json new file mode 100644 index 000000000..97191ea02 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffe4a2174a987447bb2a6ec3cc26f5ea8b99c607dab599770fb067fa5faef21e +size 3725 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00005_000002_01.solovev.json new file mode 100644 index 000000000..7e1532ba6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b22da69c147df37ab16aab0a8837d40c5266bbb68bab324ff735ec143c62b40 +size 3727 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00011_000001_01.solovev.json new file mode 100644 index 000000000..405e0c050 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29db0b59008164cd798f244eb4d6c449812cf109db0b1f31f14040859bfbf343 +size 8686 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00011_000002_01.solovev.json new file mode 100644 index 000000000..3e2a7b3f6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f0e8eeef5db5751cdd4a67c7c532334dd51a9d391f56bb0a09d4a66b3176cb6 +size 8682 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000001_01.solovev.json new file mode 100644 index 000000000..6016fe91f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137f172f742391f3f6f8668654d843e3f6b39ac1ef3326cc87fb29d740447d0e +size 44828 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000002_01.solovev.json new file mode 100644 index 000000000..5c50fdaaa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cfe06fb88d8878bb8af9b0b680f55c5169ae19ee9b769bd8c22d2d4dc86c396 +size 44889 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000203_01.solovev.json new file mode 100644 index 000000000..8691b055f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/tomnsps/tomnsps_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3522c5861f6bc97f86702a6be3e20d1e1a139f3f10214ec9f6f9110d6ffc2a5 +size 44948 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00005_000001_01.solovev.json new file mode 100644 index 000000000..0af58b92c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c360b8f427354bd6a2e3510400f65657316b6c5018952ffc441e68b395ab21c +size 4256 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00005_000002_01.solovev.json new file mode 100644 index 000000000..2a910a357 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c87fd524e9b48bd040570c3159ddff191bda22dec8359001f006f5b367151bf +size 4994 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00011_000001_01.solovev.json new file mode 100644 index 000000000..4817bdc91 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b1ba8b5417c7d27669f1d8c81140c66c6abefe892f560556fddc2f1321a9b6f +size 11241 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00011_000002_01.solovev.json new file mode 100644 index 000000000..1836154e6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77778c2cebb4ea9c5f72d082f3fb27e0c66e6f90ff173913117d02c24e9c7b86 +size 11245 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000001_01.solovev.json new file mode 100644 index 000000000..6c91c47a4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9c412d5703fd67cabfa89cf093198b59c4b39d168de3cd76527b10bd9fe09da +size 57052 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000002_01.solovev.json new file mode 100644 index 000000000..0443e43bb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74a04e7e6e22ef3fc0b959e51c4bb525532e5d55cfcbf3484bd574e1c685b6d5 +size 57050 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000203_01.solovev.json new file mode 100644 index 000000000..5a09a2188 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/totzsp_input/totzsp_input_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4da630aafeaed9436bf24acd1c0f2fa0afcdce9657cf489cc1a0fe3785fbf398 +size 57125 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00005_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00005_000001_01.solovev.json new file mode 100644 index 000000000..89d102125 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00005_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0457cfc6183c85ace8f37e6b581a259ee362378376133c75c10ecf0e10e3c820 +size 186 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00005_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00005_000002_01.solovev.json new file mode 100644 index 000000000..668b78061 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00005_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:943d68f9c8bd0e77b043f155d27f16ac623a70f3f344820f471b03c94cebee40 +size 190 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00011_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00011_000001_01.solovev.json new file mode 100644 index 000000000..f897fd9ec --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00011_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d907983adc9400d955e544e2b51a7fc6f28fa3b0169d533884b7bf823a76588 +size 353 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00011_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00011_000002_01.solovev.json new file mode 100644 index 000000000..15e9625ce --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00011_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc99ab45f913ea8d6ee365d0ca39e80ffa47e0cbbaa23fba64b5d180145251c5 +size 355 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000001_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000001_01.solovev.json new file mode 100644 index 000000000..6d4a28f79 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000001_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f65cd0218132f575bebba484c1aba2185c897b1fabb318259df06c7d5aa49eb7 +size 1569 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000002_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000002_01.solovev.json new file mode 100644 index 000000000..dba7b08ee --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000002_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a420a17caf58344e146f184e83bc456de78bacea1c0e6856bf78f2334566a99c +size 1563 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000203_01.solovev.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000203_01.solovev.json new file mode 100644 index 000000000..5391e05e8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev/volume/volume_00055_000203_01.solovev.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fee0b15d812816a88ba1239374f84a60b4cecdc6e28ed2343b21fb55083bbf9a +size 1563 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical.json new file mode 100644 index 000000000..a68562377 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9acd66d80f381e6e95c4a7175f58c46451047f2fdef66eb27efc260d49a5761 +size 2595 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/add_fluxes/add_fluxes_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/add_fluxes/add_fluxes_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..63b47883f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/add_fluxes/add_fluxes_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a5a3de7cfd9dda8604bb59dbb266f0ee0eafa57b8452083dc7b020ee28b0226 +size 24457 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/add_fluxes/add_fluxes_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/add_fluxes/add_fluxes_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..ab9d363b2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/add_fluxes/add_fluxes_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19876f0e679789ec0987b12e7a49ab6f290ed88a9a300b6c27ec5f3fc6aa19bf +size 24492 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcontrav/bcontrav_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcontrav/bcontrav_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..cb767b10d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcontrav/bcontrav_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c027bafd43287a6332751d9c60d8cd1716cc37df5a5a155037fffdc7402cfa85 +size 33684 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcontrav/bcontrav_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcontrav/bcontrav_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..0b6d42896 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcontrav/bcontrav_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:832c9d3bb2e21e862ffe3ff7b2b8e2b8ba0c565d267ec3f97c022a0129d0829d +size 33704 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov/bcov_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov/bcov_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..e24b0028b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov/bcov_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5e0dc645267c2a925a9ce6bae24908b6f1f10db9b2c02c783c3cac381353962 +size 62369 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov/bcov_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov/bcov_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..c99b9213b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov/bcov_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bde897228b0a8aedbdf4f4bbeb0ac34d6c1516500f06db591c9f96ae176aca83 +size 62457 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov_full/bcov_full_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov_full/bcov_full_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..884d7cef6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov_full/bcov_full_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:423b68badcc097676def52bfc8db0174903a49b32904dcf4f5e77509542bcbbe +size 42572 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov_full/bcov_full_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov_full/bcov_full_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..2ed30a954 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/bcov_full/bcov_full_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69a65ab61fc9897a2c6920ed55a70cf146b76dd0c7f6ae0489bba1f5a4605805 +size 42544 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/calc_fbal/calc_fbal_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/calc_fbal/calc_fbal_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..76cf1af77 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/calc_fbal/calc_fbal_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:699dee06b0820bd4a37164e5a37738edcee1e3b12233d79e9c1808fdc931a1ed +size 6157 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/calc_fbal/calc_fbal_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/calc_fbal/calc_fbal_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..3b7da5fda --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/calc_fbal/calc_fbal_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73b052b7e82cdce5da903dc3096a8773409b4efc826d8d642b16ff3323c556ad +size 6169 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/constraint_force/constraint_force_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/constraint_force/constraint_force_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..b30a3f4e8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/constraint_force/constraint_force_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8757d1d15e60f7f662d562c85b3a6459c6ea080a42f6912b09226c700cf83a4 +size 195831 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/constraint_force/constraint_force_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/constraint_force/constraint_force_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..bc6599873 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/constraint_force/constraint_force_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1faf92337ba7a100dfce5cd0d3bd13a18eb7444fc8b9218334b8df98916fa7ad +size 202728 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/evolve/evolve_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/evolve/evolve_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..9e82cfb88 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/evolve/evolve_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c83a366a5338c23bdf24ef34efc22de703b6211b35ae3df9218f6ce188410b3 +size 281826 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/evolve/evolve_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/evolve/evolve_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..1f8af678b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/evolve/evolve_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29d5de83e0a325c56012701900cfcf999c4e8e0d27fe7c7663ec1b412482d74e +size 314560 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fixaray/fixaray_00000_000001_01.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fixaray/fixaray_00000_000001_01.solovev_analytical.json new file mode 100644 index 000000000..32ed9893b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fixaray/fixaray_00000_000001_01.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4197e3d8a69029a2cfcbdea97b3836e5d2dd06a5087b0b0f2008ea41f15531ea +size 204536 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forceNorms_tcon/forceNorms_tcon_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forceNorms_tcon/forceNorms_tcon_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..9dce6a9c6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forceNorms_tcon/forceNorms_tcon_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2aff5d6838f6cbbf570898464f189d7aea4c93f428ffe92aed403befed34f263 +size 71624 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forces/forces_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forces/forces_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..aa295ec4b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forces/forces_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0abf3bfd252699d599ec5458194bfdf5b233764391d37665e576d1650ae78b4d +size 979782 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forces/forces_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forces/forces_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..38b7e6e64 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/forces/forces_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c05ae0dd1215148dfd3fe5796c4c0391b60264441402f429e2f8cfed48e1458e +size 1016180 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq/fsq_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq/fsq_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..8bc3c24fe --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq/fsq_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:435c4a942794925e4ffa25db4e9666eebe91af72f79e198ca6f0185929d818fa +size 244 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq/fsq_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq/fsq_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..ebbd1753f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq/fsq_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61d40a55a03848e48e0d5ddea3a8f644457b4798439d35fa26bfc5bff2902286 +size 247 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq1/fsq1_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq1/fsq1_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..8a3a146ad --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq1/fsq1_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:475b1ace79c7b19729a7f35090d1ab95e193e57d81832564a7333e430fe5ee17 +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq1/fsq1_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq1/fsq1_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..aee75d6c8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/fsq1/fsq1_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9876b6b871ce6c7348a0f7872e6d21c89f6f146be8499323b32dd2c017dc0524 +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000001_01.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000001_01.solovev_analytical.json new file mode 100644 index 000000000..97d53fd5c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000001_01.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd091283dc8867243d30201de8c839be023b9478f7db53c70a0cf1f47a67b6c1 +size 374541 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..dc0692f5f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c067c3e31f424141188867e9ca3d9ca05be43ff82155efd02c0b0f90f9dee441 +size 374691 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..e92106fe3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/funct3d_geometry/funct3d_geometry_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4a95b96e63c33adaf8e1554cb3679636b058609207a8ef73ebcb12ce098a154 +size 426443 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/guess_axis/guess_axis_00031_000001_01.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/guess_axis/guess_axis_00031_000001_01.solovev_analytical.json new file mode 100644 index 000000000..bf8bcb744 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/guess_axis/guess_axis_00031_000001_01.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a23b0ce4d4e56ebe5f567acc7c61e3cd495f6c0e88ab43847484b83083a02c60 +size 13068 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000001_01.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000001_01.solovev_analytical.json new file mode 100644 index 000000000..9845a19b4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000001_01.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b07d4069455a785b8a6305e8169dc288719430d06436ee6ab7275f1ae494b27e +size 118347 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..2ec96be92 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b26f16e8da01b7b483e1b8ab77d1236af9c4925c52f63f90d6dfec52f4db9f8e +size 119369 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..442ee59fc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/jacobian/jacobian_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee78eb3450892a1ffb579673cce6b6bc4d1e56d580e4414273e9d62ac4f3bcbd +size 124787 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lambda_forces/lambda_forces_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lambda_forces/lambda_forces_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..032d44193 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lambda_forces/lambda_forces_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eac774577b0f393d3ac503eea00c4e18b75be74528528062700e3a8bc5f25d7 +size 92635 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lambda_forces/lambda_forces_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lambda_forces/lambda_forces_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..13a85eec0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lambda_forces/lambda_forces_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2f745e29c84a0da0c889f2c7aa94222e08907971cdaf9a3fb7f1c1625101567 +size 102114 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lamcal/lamcal_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lamcal/lamcal_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..29060a99f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lamcal/lamcal_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f99717b4754be866decd46a693474b7c3dc0ef7d81bfc2e5b890d39f736cbfe +size 19166 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lulv_comb/lulv_comb_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lulv_comb/lulv_comb_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..6660e58ef --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lulv_comb/lulv_comb_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9184444a076f642d0cddbe408b8f6ce37c4ae88b4a38e7eca5b8bbb2ddb7fefb +size 244736 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lulv_comb/lulv_comb_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lulv_comb/lulv_comb_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..cf96dac20 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/lulv_comb/lulv_comb_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37b7c6968730740bcaeda66b6cd710597c17c4d9a82d6e09d504300e48f67f00 +size 253638 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/metric/metric_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/metric/metric_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..fcbccc171 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/metric/metric_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c03e7126d5cb26948d30e332df235ade614e86cd20b6eef1c96044611d614454 +size 81823 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/metric/metric_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/metric/metric_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..f95c4e219 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/metric/metric_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38354cb70819ee7da08f3226817ccf484ef9713859e301960dff796f841b9cec +size 81813 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/multigrid_result/multigrid_result_00031_000400_00.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/multigrid_result/multigrid_result_00031_000400_00.solovev_analytical.json new file mode 100644 index 000000000..d3f95dc84 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/multigrid_result/multigrid_result_00031_000400_00.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7f18f47ec0589ce267ab14530325158c1081de8036fca3faaf8da1d651d208c +size 116049 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/phys_gc/phys_gc_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/phys_gc/phys_gc_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..675ef5a81 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/phys_gc/phys_gc_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aeab477dbefe6ef68c7986ca8c857ea3fd2e4b7347597b1a0ee4c138e1e32778 +size 56002 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/phys_gc/phys_gc_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/phys_gc/phys_gc_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..0da5f256b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/phys_gc/phys_gc_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9be555282bd26fac432a57b300b09352165e3c3831f7a5f4b4b7d645c21a35a6 +size 56025 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/precondn/precondn_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/precondn/precondn_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..f9a826888 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/precondn/precondn_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37892fd720df65dd06a64957770696c7a6f0863cbe70fbb355f2c81f56a8b3c2 +size 22147 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/printout/printout_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/printout/printout_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..28bdfabce --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/printout/printout_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e38dbeb89115d493c4aba0f3b8b8bc31edf28608e4c6568172e2ce1a5fe8811 +size 51328 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil1d/profil1d_00031_000001_00.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil1d/profil1d_00031_000001_00.solovev_analytical.json new file mode 100644 index 000000000..560972f76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil1d/profil1d_00031_000001_00.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3017d8ea062b9dcf8adf7324b4787da4ddef5aaf8a6fdf4df0706970e9ac6c9 +size 9911 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil3d/profil3d_00031_000001_00.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil3d/profil3d_00031_000001_00.solovev_analytical.json new file mode 100644 index 000000000..0a7c61609 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil3d/profil3d_00031_000001_00.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b36928ee974b73e82f77a2724219fafb836e6cfa048a8fc9882702c34effd75 +size 44503 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil3d/profil3d_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil3d/profil3d_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..90c18c820 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/profil3d/profil3d_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f7c2d77e9328ee863cc63901945a50fa030d438b19deb8b549897c23b264951 +size 44532 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/readin_boundary/readin_boundary_00000_000001_01.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/readin_boundary/readin_boundary_00000_000001_01.solovev_analytical.json new file mode 100644 index 000000000..b04e65577 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/readin_boundary/readin_boundary_00000_000001_01.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea2021ab8dadd73cea84de370e7e04783171d71b2c78b71e2db400a0d9a1f9be +size 836 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scale_m1/scale_m1_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scale_m1/scale_m1_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..093a714b7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scale_m1/scale_m1_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2002b13c0b4c4aa67795373935a17f6dff70991c70e5c0855c0bcd580155fee8 +size 37299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scale_m1/scale_m1_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scale_m1/scale_m1_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..9f0960cf2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scale_m1/scale_m1_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c48a07ead207cd5b4a204fc352fdebfc08dd9005d9000ae2081294065771ba9 +size 37323 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_R/scalfor_R_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_R/scalfor_R_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..3dbf78487 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_R/scalfor_R_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40146e997909bc04761cf33841fc3b55df2c29624145cc59db08786506eab0dd +size 46524 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_R/scalfor_R_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_R/scalfor_R_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..3dbf78487 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_R/scalfor_R_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40146e997909bc04761cf33841fc3b55df2c29624145cc59db08786506eab0dd +size 46524 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_Z/scalfor_Z_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_Z/scalfor_Z_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..370c7525d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_Z/scalfor_Z_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f5b7ad20d1592b87cef07e7607acd90d7e7c72a05e8b9ccd8f204e65448c399 +size 46706 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_Z/scalfor_Z_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_Z/scalfor_Z_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..370c7525d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_Z/scalfor_Z_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f5b7ad20d1592b87cef07e7607acd90d7e7c72a05e8b9ccd8f204e65448c399 +size 46706 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_out/scalfor_out_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_out/scalfor_out_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..224e7d6b7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_out/scalfor_out_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:403ab09722ee5e007633fa5c328d1e02e4394ca22bc53c5ff7712cc50e5e3168 +size 78753 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_out/scalfor_out_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_out/scalfor_out_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..a76fcbd76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/scalfor_out/scalfor_out_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:801740120428a649f6a82156f2aaaa519d11f816da16a71ef1a30b524361d201 +size 78807 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/spectral_constraint/spectral_constraint_00000_000001_00.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/spectral_constraint/spectral_constraint_00000_000001_00.solovev_analytical.json new file mode 100644 index 000000000..3cbc6f54c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/spectral_constraint/spectral_constraint_00000_000001_00.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c34e2729b946bc2160b0c172762fa3216cbcc5d611cd0fa446591197bf57ee8 +size 1387 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/tomnsps/tomnsps_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/tomnsps/tomnsps_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..eda83fdb9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/tomnsps/tomnsps_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ee59cf67b3efa43ddc2aca0e922b74b3652bb71bed3accf9678abd9ef5ecc51 +size 49674 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/tomnsps/tomnsps_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/tomnsps/tomnsps_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..1fe78097e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/tomnsps/tomnsps_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f37924fe9dddc88f0d457100f8afdf5ccc5d5703ff5930ea0ebd41371d63570 +size 49725 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000001_01.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000001_01.solovev_analytical.json new file mode 100644 index 000000000..ef8f490ea --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000001_01.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05e98d8cec66def6608667a9eb5a470b089d37ad98e8515bb7118356b063ef15 +size 50351 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..fc835b090 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c54461aeb4272a57072aee2d2fbe7d975922ae2addabdc1ac9578995146edab +size 50380 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..def1e568b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/totzsp_input/totzsp_input_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aaab044d038c70d3e109a78892ba02ae4122e7d6ec04bbd37df3baef04ceaff8 +size 62812 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/volume/volume_00031_000001_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/volume/volume_00031_000001_02.solovev_analytical.json new file mode 100644 index 000000000..e6fd69481 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/volume/volume_00031_000001_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8753ecb988986e947c3d53649d39961594a14114cf0137b0e7758326c6da3b07 +size 904 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/volume/volume_00031_000002_02.solovev_analytical.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/volume/volume_00031_000002_02.solovev_analytical.json new file mode 100644 index 000000000..c86ef1200 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_analytical/volume/volume_00031_000002_02.solovev_analytical.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e911e7e5ee4ffeb00824c8aeb9568761fdc17f816d39e506891781253e6b499 +size 909 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy.json new file mode 100644 index 000000000..121f5530a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:394dfe3e5759a6a07e9b026438781b13062e770b9eb29a4267fc0e74b1755296 +size 1674 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..a7ee119ef --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69bf1cd3be6fcb63410ce2c30fbe35452d695b84dca1d38da5f4cffe2f635823 +size 11779 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..aa136e1c8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f07263eeb9fe4520215c7842e6dc5a771b70761059cec8838def5287d1391926 +size 11784 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..ccebbeab8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b067ef3ebd9b1b82ba49d4c0545c2ff847108e48cda893e2ddc429c35455d9dc +size 24386 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..b12d5bee4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/add_fluxes/add_fluxes_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a76e80b08618124365b0556ce2d6a16b3dc4a0b3c686bcffae220b49d86bdb50 +size 24375 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..84459ef75 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0a9ca54b0d3ef351d41fcc760455b4d68750ab8e6d63f2b2a956237e23e18d1 +size 16466 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..841d9bf84 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b13264986290b9b6a95a02f64d7e26c13294e6f86dca2ac7f967121f341b37f9 +size 16453 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..cb528a49b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:240e3a8fd0f9eb47f9d229c2191f8aeac8aa07e5c4d66577ed285feb5529c5e2 +size 33156 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..a0b3ee680 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcontrav/bcontrav_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5705b9ea91aed303a14a791ae78e2110c6e56981522cea2c24409d1c9fc51aa +size 33195 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..c6696930f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66a5f15a8f33627651e9ad8cd00afac67df6f18e496f53ed0cd5b86ced312532 +size 30658 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..33eb8836e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:122090ef1f41d430b430b093b53b93429bafd1c56f4c10e8c738ecb9902128eb +size 30643 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..73f1a169f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b2dd71672a1cea0ca94e04e3012c9852d3d202c649fb134c69cd83594a4d105 +size 61992 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..c91dddb67 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov/bcov_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:421f1056a1535d133d35bd49ac3db66735ef09138ccf50f902ff6e11a93e3351 +size 61993 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..3c3ab5684 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f0176ebc30f988ecb9669de5dfc3c83c0651ee404398dc7a4303f869fd47091 +size 21038 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..536a74fa3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ee950a62f1ec8370770ebb0b86410dc156463e0f7f114bf67d372e4769fc894 +size 21027 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..0c0a3dc87 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f7081b8d8c54b0455e1910168e9c964e7c7c6817d87028a13c910fe4906278c +size 41947 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..f0f5289ca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcov_full/bcov_full_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a1734e1304aa6c35ea058fa72d77319b72ca91ad9a7c735af3eb5deadd41860 +size 41959 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcovar_fileout/bcovar_fileout_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcovar_fileout/bcovar_fileout_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..cc1f3a6c4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bcovar_fileout/bcovar_fileout_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e05efc9411b7630992c5ca9b799e1ba198422fd114162907cc55287de153407 +size 122793 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bss/bss_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bss/bss_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..878284ed7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/bss/bss_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b183f5029a38a982049bcabe544b1a8d38d7f872b922788a74905c001c3688e9 +size 179374 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..be7bdfafd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8cb14efe48fa4f0966fa9a6d5ddb8f8f41369f772ed70da3f2b20a5516c4c2e +size 3284 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..8a2a77251 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1bb129f59f3863c0490bfd7b4cda4b2cecb051cf1881df6f429ff9f9cf2c16a +size 3307 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..a170e92f6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6710b9c1a05ca724b75568572756bcf0446d685c85b90e780fc1a5555d4a06be +size 6663 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..24f816d47 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/calc_fbal/calc_fbal_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97b5c17d063ee33b02c3aba0967c21efd11c42eeedc8982e8cb0974401bf930f +size 6680 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..72eedfaaa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:231d02f08b7775b339432b4128f4b2287cdbf9985448da5cd2fa442a7d759065 +size 101429 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..c2ef54f66 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ab93c91d6011a8975e0b61c4e71424c529eb42c8245cd487c91f54c4f59f082 +size 102459 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..9f91b8aaa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a0836600984fd8ed87877f57e63589211adc25f17eb87559bdf5e16906c0319 +size 192184 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..27603de69 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/constraint_force/constraint_force_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3a5290c1cfaf40788bdbac4c043a4dbe3d1dcefae8422382c08cc9e479daa2a +size 191626 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..e6782ac33 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd337dbe4c1ae0e923aefa43fd29f5ff8863fffc11286396b47e74a518895334 +size 131882 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..8b4a0b20a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e469ab96ee39b7dbc489b153845b3bdeba965597d66884040aae5ab3782589c +size 149105 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..5219c51a1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4e05dd840b196c8e77a401b9393e7a7db0bc923bd8468dd80598016db83dde4 +size 284021 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..3d8dc59b1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/evolve/evolve_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7818e2799069d601298ba70b48bf13deaa5a7c6ed48e49a700c4eb072edaa4c +size 303714 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fixaray/fixaray_00000_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fixaray/fixaray_00000_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..e74680d4e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fixaray/fixaray_00000_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d73734c6118a136914593a8b3fc2dca58a73586f49929ff2ffb40fd5675078d +size 181574 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forceNorms_tcon/forceNorms_tcon_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forceNorms_tcon/forceNorms_tcon_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..fc2361b12 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forceNorms_tcon/forceNorms_tcon_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f32faec5ff08ff48dc0eb4ec99d0f16dd1f52fa6bf339770fe38e69b45dee870 +size 32244 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forceNorms_tcon/forceNorms_tcon_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forceNorms_tcon/forceNorms_tcon_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..5cfaa925d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forceNorms_tcon/forceNorms_tcon_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ccdaa90b9d71ee83175a5bd0511c6e9b5a5a7ac543a379237596f3afcaf70a1 +size 81165 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..a4e9bcc67 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e48001f4d09c46f0f0a8c2c941cd212a0070fc7cfabd2ba2d9df7d50c3b2027 +size 497277 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..ecd6a6939 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1d4b85cdb3c545974781f7618e4821847ce3aca9314cfa029246eb232be0d91 +size 506848 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..0f1ca8566 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee8d6f4c4edc2133df26b8dd4ff067767f926ed872d27e8b15243a804d329a93 +size 1006549 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..caa1de884 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/forces/forces_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12b62e0c7bc27c47cfdf7dc06829e4d3192f5c9d57f756bc5d6f7b2af67f6a21 +size 1005078 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/freeb_data/freeb_data_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/freeb_data/freeb_data_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..1ad19ce47 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/freeb_data/freeb_data_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8761796a77be25f5d305e5eaa01e64b1da9d7e7e11d87f5f0a0553fb49bc081a +size 7189 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..cacaa655d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46ac10c71254aa95c5aeaa7e36f1ada0d780a7f3b973fa7928f1d0c5f4edd917 +size 242 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..f198eda12 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e19af269e39d8a98f13d451622e7995e33620daf12102bf52bacb433133fe333 +size 244 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..674b057d3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ea3c2f8bac00b94f29c72aee017b8af0048fc1745dd55b8bdab48c238377af1 +size 252 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..357411757 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq/fsq_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d42516133cdc0148680dd27de5cbb4a62cd5fba0e18585a2fde2ededef650d6a +size 257 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..116e05d87 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abb8ea13074e82acfb12b8d78f78644d7dbb49e1ec0c20c11166a9dfa9c266da +size 148 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..0d557466b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:856ce3c7102f6ede04079f2a2d4a4278798b53c00518b52f1e58a9de5bc401a9 +size 147 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..f4dbd8296 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c32174fdf89356093b108abd8f856d2de88e883cb1c9b7addcc196b5663870d +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..ff44eec61 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/fsq1/fsq1_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e578dcd5ff09099814712a983f796373101b09cca48bfc38f6299458760def9 +size 149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..557ceff59 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4b6314839065cd35e4929e7c08dd7ae8d3878ebc50646a2a80e286cd6516f9b +size 189587 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..7d86ee762 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bc3da6475e7d01c070c16a1c95003ee474347d6da0c1628fa3227dbb3cb10b5 +size 207943 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..ddc816f95 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e5c5b0b0df5926996c421a4b9f2b8690020b1c23b18345badca0d28c7370d00 +size 417145 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..23ac42c3d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/funct3d_geometry/funct3d_geometry_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a77ac33b828c59a1c3f7b283c2f6a5bf418193321168bd66fae621063d3334f +size 417133 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/interp/interp_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/interp/interp_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..06e7cb550 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/interp/interp_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b99c1637a20503f395fe70f9cbde66472c5d19fb22e586d760f07b03c259bd7 +size 143451 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..0e9eb83d5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48d863472d4ba3c8a3fa48f74440cb667a8b82d6d426d7cea0f6b2f1324c8526 +size 61235 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..242f98879 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f047afff6f485d71cd5cf4784e3e6ed23bca03765ea8179e0da4c576922267eb +size 61162 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..eaf103713 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd85bd08ed628bf2b9d11be7d93a096be46fed8459f41bddaae62c0b9e181e3d +size 121977 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..fe6741da4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jacobian/jacobian_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50a5f47dc7691e17f3391b8fd1f0b6d5df5516b8a2e8c931fc15b12c7078ccbb +size 121925 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..8325217bd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e069d50eab980873dd0f9791ac8ae6bb7309dfb944d8ebd8fe81761fe871b1 +size 171779 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jxbout/jxbout_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jxbout/jxbout_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..ce63f2c4b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/jxbout/jxbout_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1515bfd5c1d726e91c3681f10d736c7dbbd800b079617ea591f65faaae7407d4 +size 308425 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..f02019d14 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf5eb4ea762bda3908c73857befc640848f40904da10b8e7f582914072e856fc +size 45556 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..3ac28b167 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e584b3d4996410b8a8f71b99a1d6b224c7d4fb2098892123bb8ce7cfcaa53365 +size 49964 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..e71db9dbb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a118f932a24e190bb2e672f19e6231324cde5ee06eeb11e78314e1fda6680947 +size 99795 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..1b41e8227 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lambda_forces/lambda_forces_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14ba223378af84bb02fb7c82ca11b6888d50c4fca8dd4457891a27f681d08e11 +size 99756 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lamcal/lamcal_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lamcal/lamcal_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..d18d7a1e6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lamcal/lamcal_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84ddc12add57a3347bb936a2d5fa5fc2b3539e183e73ac011b85c237405d5404 +size 9106 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lamcal/lamcal_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lamcal/lamcal_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..01560ac7e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lamcal/lamcal_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f495326a1af5b188ce0dc0a13dedc8b5e655ada4e428ae9105a9073768915d22 +size 18228 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..f2874f86c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8932dbc99a6d724285509eb2fee8c8d4e3b3040405e31a463ba6c645a968460a +size 122738 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..c3b21bb17 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d758239894369d6e2a7e3a63f9fc9def6b9db5ff70645b4eee64d40dfa4d4ff8 +size 127243 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..9117830f8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fcdbe65d6de632ddcda3f33292d57e397a50d99e81e285634ec2b93f90a7fd9 +size 255930 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..eeadfbe59 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/lulv_comb/lulv_comb_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28735f9825cca956ef881ba691010f08c3df544b1597b266a9817f95014c4bdc +size 256047 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/mercier/mercier_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/mercier/mercier_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..3f51d0a93 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/mercier/mercier_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:599198deae6b9899e406a6e329838d2f157090f801ecc85ef18ddeb528b0b9dd +size 93959 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..b2c71a61f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0bbb3c36427eb3e0e12b943de4ad8c485daf927e8dd0a324187ff88687dcaf6 +size 39944 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..ab0f06fa3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb1de12e15c5ce7a5b80d9a722dbc4fd9ff5bef9d1e4eb09bbefc731a6d269b6 +size 39945 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..10f83b0e9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66378d55f24b481004fe79625318d7ef9b21c820251a037ec8204f943104140e +size 79850 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..9db59fdeb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/metric/metric_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e26a74cb030f0272795ecbcb0b13f73d3f9f4f140d80ebece1554ed4f2d31faf +size 79850 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/multigrid_result/multigrid_result_00016_000420_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/multigrid_result/multigrid_result_00016_000420_00.solovev_free_bdy.json new file mode 100644 index 000000000..229828727 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/multigrid_result/multigrid_result_00016_000420_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b2319686df5c402841e4cfa2df0f3f74c2b0124f0cb1024a77bef75f2bfae35 +size 56011 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/multigrid_result/multigrid_result_00032_000774_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/multigrid_result/multigrid_result_00032_000774_00.solovev_free_bdy.json new file mode 100644 index 000000000..cadb1d314 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/multigrid_result/multigrid_result_00032_000774_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac4858d433f4f5fe5997aac766aa0c5479e74e07bb6f34b89ca647906c3dd622 +size 112807 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..f05776360 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a701aa439b5863cb1458ce4ee9bdf9f6a5fcfcd68b143b26bcb4d1f34761a12f +size 26766 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..ccef78ef2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ca9ec7b3ab16a3f88a66686bb6e3e08dcab093475b2676baf72b988e75e6548 +size 26748 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..489adb98f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cf0bf64eceacd6701694c8803e22a8baf0c62b305ec9e98a1f54393d529bcd4 +size 54843 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..0d2e6bcf9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/phys_gc/phys_gc_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8825b7878eed286a77575812ae6e7b09945597a42bdb12159d2b2e275e9a7022 +size 54800 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/precondn/precondn_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/precondn/precondn_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..655ec27ed --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/precondn/precondn_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bc48f22f67d8441ceb39063bcffd87ec3d707b8b8d179830c98b10d5f2bb7ed +size 11846 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/precondn/precondn_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/precondn/precondn_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..ae3b1e811 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/precondn/precondn_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:765baf67474b8accdb70fbd528b0942237676c4b9a1719f0f9abf5e9e2a28683 +size 23192 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/printout/printout_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/printout/printout_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..a66ccb671 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/printout/printout_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a7f93734148f60101c9da5d7fa16d2776f530fa68dac0ab82e41ab257e92ae8 +size 22278 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/printout/printout_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/printout/printout_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..8537f6b71 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/printout/printout_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4639d3dcb1e5ee57793cf3c45e448bb24238ea8b0659f4226f1146a7eee3daf +size 44454 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil1d/profil1d_00016_000001_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil1d/profil1d_00016_000001_00.solovev_free_bdy.json new file mode 100644 index 000000000..8e7964e9f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil1d/profil1d_00016_000001_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8293f061490eec62fb48968b37cdf234ba398831727d049f38c1a6de5c01186f +size 5760 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil1d/profil1d_00032_000001_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil1d/profil1d_00032_000001_00.solovev_free_bdy.json new file mode 100644 index 000000000..04e2b4e3b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil1d/profil1d_00032_000001_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b37f9e5b4733cb57da5d2169399d8cdd43222988e91d1cf5f345dca9617c8aef +size 11877 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil3d/profil3d_00016_000001_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil3d/profil3d_00016_000001_00.solovev_free_bdy.json new file mode 100644 index 000000000..f2ac3a238 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil3d/profil3d_00016_000001_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a82bd3d91c12a394590e79034dde80f9479c8822c7c6a9df65ad23f037ef8af +size 18911 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil3d/profil3d_00032_000001_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil3d/profil3d_00032_000001_00.solovev_free_bdy.json new file mode 100644 index 000000000..0f166d206 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/profil3d/profil3d_00032_000001_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ecdd540ae63454496b3f30ff49d5c9f57d80169a407fdd1145205339ce63b54 +size 37964 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/rbsq/rbsq_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/rbsq/rbsq_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..999cd9795 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/rbsq/rbsq_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dae70e79c86e0b0df109c8fdfea4630c405e450d14de1a119e672f5b8c98233 +size 547 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/readin_boundary/readin_boundary_00000_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/readin_boundary/readin_boundary_00000_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..a2e4f50f0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/readin_boundary/readin_boundary_00000_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd390b08c8977d49b60a543736d9b8c8b1bc356121910e040423b73519d7fa8f +size 608 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..772e17de7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fc7816f8450c69b5ea1a91f29d2707e5674db01af94ffe4680e53db96705ba9 +size 17811 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..559e22e09 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc44b44a509c9dc6724acc7485ada0c0a5bec2822e97d3bca9a0205276b181e2 +size 17787 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..4eafd1f0d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0df3d2db93caaff7b36d0b1c7012b18a68c8790363d81ba70bb588a8235b51fc +size 36695 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..02c811b81 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scale_m1/scale_m1_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33c026068e2916d7f52f27497ae42b61f7c7e2144616418aa49a15011ff81ba3 +size 36675 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..8095994dd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d00387b343784e56e4ad0b2cec044585df3403757b402c904c26ef21cf0dc434 +size 21870 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..8095994dd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d00387b343784e56e4ad0b2cec044585df3403757b402c904c26ef21cf0dc434 +size 21870 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..e2a928ff7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64c1d8527a530cace3a3bfed24f37fe6f100b69400756a4a985835c62b4c9ccf +size 45132 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..e2a928ff7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_R/scalfor_R_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64c1d8527a530cace3a3bfed24f37fe6f100b69400756a4a985835c62b4c9ccf +size 45132 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..518cd8d76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3a129bb7a2d00e864e051f458c2bf81e5864629cb884dc5d3a942d64dd433ec +size 21934 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..518cd8d76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3a129bb7a2d00e864e051f458c2bf81e5864629cb884dc5d3a942d64dd433ec +size 21934 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..39433ba1e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d08062b067bebc783517fe984dd8938536812b5a682c813cc4df2a15d3fd0487 +size 45245 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..39433ba1e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_Z/scalfor_Z_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d08062b067bebc783517fe984dd8938536812b5a682c813cc4df2a15d3fd0487 +size 45245 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..9ccdff73a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ab2d0d96a43df366289c8f3e0dcd398acfd44e4a55d41fb798907489c7bc67e +size 38571 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..4efd1fd44 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a36053fde98e9955a5738d26dcf869ae9c1a2b0470e6887dfef03432dd8a165 +size 38650 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..9c2c79edb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dcf4fa953adc80616e9a4be5cd654b0f05676a8ffff8d8f7d4cea90d7668eb4 +size 77981 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..d319eda64 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/scalfor_out/scalfor_out_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a5ee72be37aa5fa578e76ef57347734cadcf99b42bb0c1d68f9da6aa650fce4 +size 78014 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/spectral_constraint/spectral_constraint_00000_000001_00.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/spectral_constraint/spectral_constraint_00000_000001_00.solovev_free_bdy.json new file mode 100644 index 000000000..fafe36b46 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/spectral_constraint/spectral_constraint_00000_000001_00.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:418678c712f728e08b6a6065e7847bf39adb4b5bebb4044a2ee5490bcf07fa08 +size 1273 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_axis/threed1_axis_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_axis/threed1_axis_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..bc2bd36c6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_axis/threed1_axis_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1ece37c94e0d5b2b398957fefcde314c896ff489c27522e0df9c168a5847da3 +size 166 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_beta/threed1_beta_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_beta/threed1_beta_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..fac86cc8b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_beta/threed1_beta_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:601c91c78787da6d5056f8f4d1e9ada0e7197f8b5258197c07578b570d3567cd +size 223 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_firstTable/threed1_firstTable_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_firstTable/threed1_firstTable_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..247ff418b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_firstTable/threed1_firstTable_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4070a511a83a711d7a460a2aec1ce852ce3cc0b86d0e634e09225f27bdcd92f +size 16912 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_geomag/threed1_geomag_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_geomag/threed1_geomag_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..fd87cceae --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_geomag/threed1_geomag_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d563229e7c245af4c335100e72de2990ad9193fd78ac17ed1da5747cf4a81e5 +size 12763 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_shafrint/threed1_shafrint_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_shafrint/threed1_shafrint_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..98fb77f87 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_shafrint/threed1_shafrint_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df8bbf31f0953bcc14914d07aad7b72b10e677c6ce3f9b9a67f72d321a53dd00 +size 505 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_volquant/threed1_volquant_00032_000000_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_volquant/threed1_volquant_00032_000000_01.solovev_free_bdy.json new file mode 100644 index 000000000..be92e49ca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/threed1_volquant/threed1_volquant_00032_000000_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14976acff4bdc5271c7b34252521d11375b714ab817f51689946a0ecbe6b6112 +size 352 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..1e7ad78fd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a30c3878197498fe79004c9f098f7bc74be7419c07994555bd772ae300391c0c +size 23720 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..213528ea1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:927b75d194699b3c8b967daa69c8ab409c956ca369f3da8e64bd72208e4b9e6e +size 23676 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..b19ce3e4f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f9935ae44aba54901a91a7027a61f182235af6aa7744acc298a3f1f3a758c74 +size 48689 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..e8b012ad7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/tomnsps/tomnsps_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc4d3609e8810498456492b9412268b754da0d4ce87b724c56226e36422fa246 +size 48635 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..18525a4ad --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1a32fd46d62d0ae6355f2faf8ed7fa0734501d305bd1e3313a5d8a5d05d43d0 +size 21729 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..3c1409c1e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a695917eff754565586bdd43729b6d2fc8d7353a1e02b51e04e99f0317be7fd +size 29719 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..b22e84ed3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d82b040bcd8c1b023d479f198944a5fa65da73ca4f7f4d568727e2a6f74476f +size 60371 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..4752e142a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/totzsp_input/totzsp_input_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:047b69e24076b2e07a6d2eb24e8d51ce958adb487d9b955ad2cdee464f5ceb97 +size 60372 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_analyt/vac1n_analyt_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_analyt/vac1n_analyt_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..838c5f2b3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_analyt/vac1n_analyt_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:965898c20ca7b531a837aaeb31a868a84df5b4f908ee2f9b39018a08d15a429c +size 19092 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_bextern/vac1n_bextern_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_bextern/vac1n_bextern_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..25e889090 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_bextern/vac1n_bextern_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6856e2102b8ac533db5194ebc5e41b219b2471b0eafceacb2670d960b761c3f +size 11213 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..ca5857daa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_bsqvac/vac1n_bsqvac_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dedae285b954dbbec612d42cbae480b55df0680688a274e175cbb884ed13a39 +size 4835 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_solver/vac1n_solver_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_solver/vac1n_solver_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..a915caf2f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_solver/vac1n_solver_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:663da64185fccdf9cf977c2a81ccafe6e83c786ce414ae171f43bc4388b2637f +size 7328 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_surface/vac1n_surface_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_surface/vac1n_surface_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..147c6b4ba --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_surface/vac1n_surface_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e4f5d62bb74bbc68d2b7b91bc2041bb65a14aaa6953337062db4a897a134c23 +size 13376 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_vacuum/vac1n_vacuum_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_vacuum/vac1n_vacuum_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..9b6d4792a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/vac1n_vacuum/vac1n_vacuum_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d4c8d61ad7f13c3a06d579de28254c7e5cba98412f8d8cd48586f0c591b8c7d +size 2001 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00016_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00016_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..c5b7361c7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00016_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cc8f4cde323d2f7cf4780634329f4db8a98c870b3e24ced0cb080af1e69249d +size 475 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00016_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00016_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..9f1ef29eb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00016_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c497d8a4a6e48f2c3a5c2261835a4db47f86e9ffc968aceaef93bcfbc29e903 +size 488 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00032_000001_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00032_000001_01.solovev_free_bdy.json new file mode 100644 index 000000000..d411e49f3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00032_000001_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b970e22f8e2161bbdc0faba01d5a625a3ba8088c69a706fb57d79497732e8d3c +size 936 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00032_000002_01.solovev_free_bdy.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00032_000002_01.solovev_free_bdy.json new file mode 100644 index 000000000..19bbba3f4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_free_bdy/volume/volume_00032_000002_01.solovev_free_bdy.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e8f300309104b6c1f7e2398e7ad4011f989e239a71fd9ace06576954ea9c779 +size 926 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis.json new file mode 100644 index 000000000..057973514 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd37411dbeefed66f6b81476e7d7630da0c8da608cddd0fa97b715ba4986c6eb +size 1228 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..f51863894 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a23bcd48de7e427ad4186f1f753a8a9580187fb5038b540651b05323d146629 +size 2434 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..fc2fb8be3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:087032b8502de11c46f6cc3c02bf1099c92d317b9e5bba1024025374264780c6 +size 2429 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..a542bf76c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf6647ee8b6d7d7b22baf260b7b1e2e2b14e6ad3d39159617b787670d3043f56 +size 5477 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..4af49f9de --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/add_fluxes/add_fluxes_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bceea44c7d3cae1ab62a5d7c19111b900feae3941bc1f61b52e92af99a3046f +size 5474 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..682bf0a06 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5457c89e0f79472f5ca7a6a27689a96b638e40b2c2ee3c18549d8ff552f105d5 +size 3323 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..af22812c2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23ce0703d1a4e5a5c8198f41920a09f55861464a1392890aa0a9f21436392cd4 +size 3323 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..c43a7659d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5625d1baa4fcf5cecea58f5c3ecc342923ab58921981a34f9b401d0537f3d71b +size 7444 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..c0aa5f2a8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcontrav/bcontrav_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:371b675785f737122994eb34136171fe912d43a82e7d09b2811981d519e868af +size 7447 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..67728a80e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b62c65cfbe06af0a523a1929095c612ebbdd509058b8249cf85888aa3d4a25c9 +size 6053 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..aac0e132b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8adbe18aafaeecbb81afbbf6650fa38568eac5e99427d3041ead700aca7f71b7 +size 6054 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..8eefa47ee --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:926542f540a98e2e1f3eb69164294fcb7e2eaeb7deeec39f1d5d002f9471837f +size 13775 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..05c1ec338 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov/bcov_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88effa53e7490e86a80633868b21718363b602834a839c38b40807f71a55eb9d +size 13778 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..c1b36ed8a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c701b9d1e293be8ae28598c739286cb5f5ddee40bdfd6c5e935bc5df8dd49d5 +size 4408 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..043ddf001 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0d47f84b3b01fa7291c39b3f9887e8a63d99e94a59b617091695e4345d0cc42 +size 4406 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..034362c58 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b1abc6de909d308b518f632160c61e953b78a3439d872b9f98f4e6330c67dc2 +size 9574 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..8e12adace --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcov_full/bcov_full_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2248b573ea5265f54f015249cc7eecef8cf28706189c2f5984911722c19bad02 +size 9562 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcovar_fileout/bcovar_fileout_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcovar_fileout/bcovar_fileout_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..1d1fe732d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bcovar_fileout/bcovar_fileout_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fae96ddb4566cdb1b16900de7c2fe1d81daaf4ba46967f9dcd6b37f78a1d638d +size 27007 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bss/bss_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bss/bss_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..7173d2dc9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/bss/bss_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6384acb9551d2e30920aaf20241edfc133c3f38bb5b63a5418dacf82b01f65e1 +size 39853 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..9a646eef5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e387a4399dd1bbc9278e6fb0ce069d6b4bc6735c95978d0c88d83fa1ef2ebe1d +size 961 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..9445e17a4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef28ef01cf8c8e7bb3633b41335120cfc01e10a67295b523db47a3bf20f972ae +size 962 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..21979f85b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecb53cce1b9bf5a022d103f063e383b8d2a299bad7815454b177d1a2a64c4652 +size 2211 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..1159c45f8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/calc_fbal/calc_fbal_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9aa17d845d4be1a6e8aea00132cd03fbd8c74043b8f0e24b1913df6c23ce932c +size 2213 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..c99160359 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f312b8de043db74083d74e16228253c9c766b820effb221ae3b26b38a9914ec +size 18413 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..37990a558 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9114b4da3a4f007bc8e5ae586886d2fa3e4e99b07e20f398d90ab372c94bda61 +size 18908 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..75aca7a9f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65aa79a7cb65d4c29ff57e50eee7075344988598b37350b6f37986ca5594686c +size 43802 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..2c29ca5da --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/constraint_force/constraint_force_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ff7534f1fa7634f338caba0eb2d2ee07e553cce6ab0d4b2d8089792fdb36268 +size 43841 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..3594973e0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c42d02f8955b4adf50808a04f72329b8664f8535ee5f5f37f7c1106e1e9559d3 +size 23164 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..42fb3367b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:805ffb68d9e3982c2e10dfecbe3ac54a42ca594ff41843c8103768374335c627 +size 24960 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..c36a67b68 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90ebf4a2ad3f1d96b5aecb6521af4ae1c01518bc65a17a7ca0135dcb50f90d4e +size 53841 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..c5642a74e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/evolve/evolve_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0af03bf6ad39566205c45a124a42f119ed0f72f23daabc9f65aa7b24fa1de408 +size 56681 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fixaray/fixaray_00000_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fixaray/fixaray_00000_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..86e3f07e9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fixaray/fixaray_00000_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45db5c5af3387589f343cf86b2a40eeef867f8c454eb9a55ff5745febf1b6c02 +size 70478 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forceNorms_tcon/forceNorms_tcon_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forceNorms_tcon/forceNorms_tcon_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..0da21ad6f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forceNorms_tcon/forceNorms_tcon_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d9c6692712458144a3ae7ea8a9bc354d515ce85b562c11e22939ef43e00f820 +size 6579 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forceNorms_tcon/forceNorms_tcon_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forceNorms_tcon/forceNorms_tcon_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..042042cd7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forceNorms_tcon/forceNorms_tcon_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e3f3874425b845ff745bf452f1cf381ab1aec27812074052efbcc76159f06b2 +size 16182 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..1ba84ce6b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07c447a70216cbf8b751b805b88b035b11ab2f215aafb2ae34c193125806dc05 +size 97283 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..155d9c4af --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c71e5817d656e4d7c64c4e42900c817d9b6212f3e81d00641818803e9849142 +size 99771 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..cb6533621 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7da34814662d0e2e6829aa627d1d0974c3b0b167ea996474f35350fbdc1eb5e +size 225643 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..320258535 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/forces/forces_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98a833d691d8dc0f4bd522ebfef143aa9d988ad902ea899c28afac4317c02381 +size 225629 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..675b503c2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c9d81c470aa5b079d980df84d2bd088fe52c792782e5cc28c9a1bfcd0f408d3 +size 241 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..9c2b8637e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f71a7cc2c0c34ce2ac7214d10aacd7d8ace87c2ed55e298a8a0c80091b2b6f1e +size 242 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..e3520dc3b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a19ea499b8fc99b4797cc0e595c8197e574e7fb950e8871befe98bf21e9846ac +size 246 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..6657872b1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq/fsq_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0aa6671c34fa47b8db0344fa7306ea17c5c0b5d9fd1a13551449d2796d11eb5 +size 242 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..52c1d4268 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:211e8ba5dbc8aba1ebf756e0d03da27c50b3823cc8953a1df7359c1b1adc0512 +size 143 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..01a37658a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3a07855ab9ce52958cea8a9ab5fe1e6df2aeac9a9a3f040af1b1d4bac92ae24 +size 146 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..9879800cc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83b0471de3f39555d3330eee941e7cde8a3939f72dec9fdf0e3d30ad3f2ab3ba +size 149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..f6ae174b0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/fsq1/fsq1_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63fba2a0590754b88c56db98cacf47260984c1cfd5790ec5bb5051b8ba0db012 +size 149 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..c3b9a8282 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f06c256bd87c37c3c7fedcdf19bd87d7021c442db4ba40292c53f04ca5c5473c +size 38874 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..fbd67c490 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b8ce05dfa94a7102454aaaceb982b5165aa3845e3a2b886685db2b183d0df7c +size 38808 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..e793587c3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7c08735e1e2a07f1123141f762e1de6a23173dac2ae86648fa7a5fad06c002a +size 41980 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..6328ec0a7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8d96906349ac80302e75d6dd2f86022f89e6cbe28554845fd3a98964a3b8625 +size 94332 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..8d6175fcc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/funct3d_geometry/funct3d_geometry_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0dce899ea3827479c854222744b37bc876f59ccdb96f8d0643154bb4916c61f +size 94278 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/guess_axis/guess_axis_00005_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/guess_axis/guess_axis_00005_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..dd7fa5a90 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/guess_axis/guess_axis_00005_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0c7e04d31afeff6945ec93cb93e3f8d514fad22cc2b6c09fa0e373bb113835e +size 7596 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/interp/interp_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/interp/interp_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..94e5cc6be --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/interp/interp_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dd4e321c97c492fa7c57a4b0164182fb6531f252353a0e89dcb4e0f0291a47d +size 27094 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..d607e84c6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c353591fb10cdc84fb26dc48a3139a577e654c85828aec48877075729e006a7 +size 12393 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..1e92ea741 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf65449142ecaed7f4d8d96b8e5139e2a2c4112b2e7af60678f05c9d682c7360 +size 12400 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..cfca205ef --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6a2a5c36296c7dcde6d61b53b9247bf0563b8d31e9bccc5a1f7b0e24961405e +size 12496 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..003ad802c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7b3c158aec9362af200785b32d08aa376761a5934bf934b67ea22f82d5f63ad +size 27381 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..8e8121a5d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jacobian/jacobian_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f147ee1682d6114ff72f24e7e2fe8e1551b0392ea02708ce2412678b6673c2f +size 27406 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..f0465ea7f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jxbforce_bsub_lowpass/jxbforce_bsub_lowpass_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c32872bbcff3984e723868bdb9f88ff15edd07ff03c87467a0c7aaa9a6b3dfb7 +size 38097 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jxbout/jxbout_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jxbout/jxbout_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..82a91e0ad --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/jxbout/jxbout_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84bf88cc5e9646e46cc44f7861f82dff93c566cd822e4784cebe97e2428e5016 +size 67044 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..a5a72cccc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:438f10a3cbb8d3e696fff1baa93a562822e706080aec977e33eb51004cf2fd86 +size 9427 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..b76372bf2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d90ca075c5ecd41dbc5c5114cfc3ba5cef686a18a60dc72c3b5a94dda1558f7e +size 10274 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..e24151264 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:122b95d5370207dc59ad356aaebe7d682f320f29aa5e6a081e13a430026c7f6d +size 22624 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..1f8d9eea5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lambda_forces/lambda_forces_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2a6ab84ccbdf10ccd4d5bc74fa4d81891a433f9f22d0c25bd2285c20cac910d +size 22600 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lamcal/lamcal_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lamcal/lamcal_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..f19f171da --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lamcal/lamcal_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97eb775ec2d0bdff3dff9ca48f54182e191b357e92167f4345c9d0c56cbc9d62 +size 1785 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lamcal/lamcal_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lamcal/lamcal_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..bf0c5cdaa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lamcal/lamcal_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6322edf9c0e0335a0191be1a0a46d9ebceec7bedda11e49179c1ce01231686dc +size 3823 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..7c244dd76 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a7d3007c01874710fbe4df12d87e3bff06ce7fda5fbf1d7889b0d091ec2b56a +size 24480 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..9850dd8a3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6db280f7fdbf65b8a7e88da5e080a30630ae2c7c8f9a47b9c7e4dd3d42c06a59 +size 25332 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..5a362fa81 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d07109ec449f35b48641054b6c87eebc7526b89dfbe91b91bffef87a2c9ebfc +size 56892 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..09990e3bd --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/lulv_comb/lulv_comb_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffe9e4e9296c241db24b3d517675ac6dab241e39b838ffab34b4bc2742e12331 +size 56888 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/mercier/mercier_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/mercier/mercier_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..24de0e73d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/mercier/mercier_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5c1eec2e5152187f7f23fa4cf64f02f6f02271611aab47bed8765cf10f7cb4a +size 20415 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..3162da8d8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bd172f2c0c009d55322eba1bd3451a2c77ff81d4084de24086e8fc095d6b699 +size 8214 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..40b51d72b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5fa511fc197bfadb9d8e21cdc5267508ce1baa5764ba37149a269a3a6d50e90 +size 8219 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..1b7d956bc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b40853a6236aa057b2b6a26f825d09442c46facd4d25e438562b486769ab8a65 +size 18013 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..3258614a3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/metric/metric_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24efe86c372f99f13d74791c41ed6499d50d1cdf9644414b777d6cd92fee303e +size 18003 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/multigrid_result/multigrid_result_00005_000178_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/multigrid_result/multigrid_result_00005_000178_00.solovev_no_axis.json new file mode 100644 index 000000000..b6fe413c6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/multigrid_result/multigrid_result_00005_000178_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4e582b76aaec08da4d3de61aaffe9a3a491f8f121456ed3f00e4188e4b6b884 +size 9666 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/multigrid_result/multigrid_result_00011_000134_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/multigrid_result/multigrid_result_00011_000134_00.solovev_no_axis.json new file mode 100644 index 000000000..774c85ff7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/multigrid_result/multigrid_result_00011_000134_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a00251a2ae9bea03da69ef9867cd03a48894d1fcf51c544b44809c41e77a5c79 +size 21971 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..5b60a3a1e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e01d5cb5ef319ac6462efd93dcaed0841c67945d0b6496f1c5bbc4d5cf570003 +size 4316 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..71a2959d0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5827bbac1a421cc8bcb7d4652f3e353e0ad5884b8d8ddea6f840ef328fed1bb6 +size 4321 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..fa4d07519 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25867c5181b35cb9ea968009b9c26c5e8d5c2da35fac01fabd27a3ed0b09262a +size 10010 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..45a6cda2e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/phys_gc/phys_gc_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d53c646c5c190a934da766d48d8371f86a5b9bd824d5115d78fc7d72451e8c52 +size 10015 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/precondn/precondn_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/precondn/precondn_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..00c0e4e57 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/precondn/precondn_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c96f07b86748385efd701b61fb56c8678a20a5e7926ac05ad67efb169dd9a433 +size 4045 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/precondn/precondn_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/precondn/precondn_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..3fd93e52b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/precondn/precondn_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:613471a6e89d59aac158691fcf68116e9621bba0b6a345c7cb64b53e85d341c3 +size 8299 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/printout/printout_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/printout/printout_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..9956b76cc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/printout/printout_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b929fc6bface47fe9604d32f192beab6dc7fbde773f9d7cc9f79875ec4c9dcf6 +size 4449 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/printout/printout_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/printout/printout_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..270cf92bc --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/printout/printout_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:deff27bee57be389b1f6d4e7a8cf2df7c684006384c03c2ade12502bf91bc46a +size 9628 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil1d/profil1d_00005_000001_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil1d/profil1d_00005_000001_00.solovev_no_axis.json new file mode 100644 index 000000000..dcf4d3baf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil1d/profil1d_00005_000001_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e99523022e32f31dcb21d635131096a8577081c0f70165d46e5ae1cde674e9da +size 1929 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil1d/profil1d_00011_000001_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil1d/profil1d_00011_000001_00.solovev_no_axis.json new file mode 100644 index 000000000..a247208a9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil1d/profil1d_00011_000001_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53a0a3ac006086e745b2e465879b630a43ca74f168d42dfb00c45e337b4793a8 +size 3927 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00005_000001_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00005_000001_00.solovev_no_axis.json new file mode 100644 index 000000000..323173340 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00005_000001_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d8e9050560c3adfa5ac70b1e48597575b17c19d3e38221a990ebdc73242d29e +size 3469 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..29663d3bf --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:795ca31443b11567365b7c1114a1073fe9205ba77b2dc7cd3f254ab4f429f599 +size 3443 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00011_000001_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00011_000001_00.solovev_no_axis.json new file mode 100644 index 000000000..9ca5bda24 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/profil3d/profil3d_00011_000001_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b109732d5b8ac0ac85fb07260a37245d45ab430b5ee17d80771193ee446b252 +size 7842 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/readin_boundary/readin_boundary_00000_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/readin_boundary/readin_boundary_00000_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..3efb9ac03 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/readin_boundary/readin_boundary_00000_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1774b826f630bc84ed6fd53a53d8df4c1259ab9354580ee0800cb51fcd223546 +size 404 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..a764ab1b9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed04a52ba334a54c04a58ca0db53990e5de0f376465e3b9db8f3d0abd494ccca +size 2841 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..fc789c037 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf10807238f7b691ab2f39867adc37c9180d2496a5e6bfea7b75e12c4173a80e +size 2843 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..a819374f7 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6a89fd28c655a9293a2775e38f4890cad3a80b8b8eb6ea65b2eb47683b3a939 +size 6675 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..1cce92ae9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scale_m1/scale_m1_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2e9b3f721762bbb2d491050b30c2eb128acb2c91a0c43913b64c754c2bab3aa +size 6691 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..3d77adafa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec937e1e1d8a7488fb397f0ac8a103e54105226e974b3c7a75dcc742baefee5 +size 3486 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..3d77adafa --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec937e1e1d8a7488fb397f0ac8a103e54105226e974b3c7a75dcc742baefee5 +size 3486 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..e729fc4a8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2df6b4356b0047b0f05bb9cdd5701f418ac9b5e83340634a36fa5c1a1cc4fc7d +size 8215 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..e729fc4a8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_R/scalfor_R_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2df6b4356b0047b0f05bb9cdd5701f418ac9b5e83340634a36fa5c1a1cc4fc7d +size 8215 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..efdf4fb2e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86b171058add93ce7d6a855dfb060c8e03a48cea142139e51d0a9049e1a5b3f2 +size 3513 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..efdf4fb2e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86b171058add93ce7d6a855dfb060c8e03a48cea142139e51d0a9049e1a5b3f2 +size 3513 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..f767e61e2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89a253c5c44655b77ec791b34f3677bd2465064a889f20ebf4fa0d2d9ccb3b63 +size 8235 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..f767e61e2 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_Z/scalfor_Z_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89a253c5c44655b77ec791b34f3677bd2465064a889f20ebf4fa0d2d9ccb3b63 +size 8235 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..61450288c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e08ce169c0ffb1102a633ddf2e492f3f220180e15cb960f611edf2cbbc21cf8 +size 8376 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..042f70bdb --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:717fbbcc07c4ce8a6488ef3b3025ae46dc7f3c3c3a1000c99eb384229fa00073 +size 8390 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..6df7fd84a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:179e817936c9ae1b3b6dda2a35d2c7e6df501cfc3305b099666f5952744df835 +size 18343 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..301748a0e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/scalfor_out/scalfor_out_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3381e987bb4f725cf9863308040816a9395eaa7469109e1698290b4c4f954784 +size 18363 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/spectral_constraint/spectral_constraint_00000_000001_00.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/spectral_constraint/spectral_constraint_00000_000001_00.solovev_no_axis.json new file mode 100644 index 000000000..a67099001 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/spectral_constraint/spectral_constraint_00000_000001_00.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:029efb5e9c637a41ad0f7d3997604f22046bd4b8283a44a7125aa729e12d491a +size 609 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_axis/threed1_axis_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_axis/threed1_axis_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..f67425496 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_axis/threed1_axis_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b569a94fb1738bd532b62a9e5ec1d2e2843033c7c984cd40655a2247222a9389 +size 167 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_beta/threed1_beta_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_beta/threed1_beta_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..8ea365f22 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_beta/threed1_beta_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27eb90fa83a6e3bd867ea122bb5bcad8259a117880b435009d0aaa0270a28518 +size 224 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_firstTable/threed1_firstTable_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_firstTable/threed1_firstTable_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..5d968b191 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_firstTable/threed1_firstTable_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06ea606bb9d4f86f0bef6bc85695862e6efaf06b7a166af27a15fbff7007a05c +size 5745 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_geomag/threed1_geomag_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_geomag/threed1_geomag_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..93c5a1ff4 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_geomag/threed1_geomag_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3514fd46d1be50f77914a487b6372be2f29a03c9d479160f04d4c32e20795fa +size 5922 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_shafrint/threed1_shafrint_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_shafrint/threed1_shafrint_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..ec88166ab --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_shafrint/threed1_shafrint_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:463d99021424c88a12c0ceacb080ec8d1d077721976334a61b5c1711804974ba +size 515 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_volquant/threed1_volquant_00011_000000_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_volquant/threed1_volquant_00011_000000_01.solovev_no_axis.json new file mode 100644 index 000000000..9d38cde24 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/threed1_volquant/threed1_volquant_00011_000000_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16558c5c77f2b405cc35a6d31b4fb9babcba7c2b7529a24a955ba5a1f3c89a54 +size 358 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..f40dd924c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddc26a084d08705379e113dedf6ab957f95b8d3cad617829bf17c90d9d187e29 +size 3708 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..849e13978 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:502994dcbe7d7e74292ecab3f10bb00f01fbf37a489014c9f6c3b70d94f5bfd2 +size 3723 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..939b2aaa9 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b802b3568d74bfc4a5bd017f59054091d77c5e1f2194cb173615911837c95d4 +size 8680 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..1f8cd167b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/tomnsps/tomnsps_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b77c68aa43ad663017f527775ed654db298a19852bd581f54953feb838b3ac9 +size 8686 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..d550ea955 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c01e25d7562ff3bbc076ebb914071d0a4673c414d5eed83881c86160155ff31 +size 4267 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..c3c48f68f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b82bbcd79da7b335e1958b43b9d874bc4ab1835386a42a405d56ea6689c5e1b +size 4241 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..08ed20d52 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fca0c7d938eb1acafbf5133d22cab3d64fcea2d73a8d5aad2229357d14f759a +size 4999 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..b58273c7b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc5c0d29b1c6db2a3e2a3997a3574b5cf83994458dffd965ce4b89e0691d0bf0 +size 11243 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..6a717f11a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/totzsp_input/totzsp_input_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a88552302d926762427229a7612824fd1b3ca59bc7850453fb2629daef2b5392 +size 11235 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00005_000001_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00005_000001_02.solovev_no_axis.json new file mode 100644 index 000000000..6d291ae28 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00005_000001_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c990eefac959fcb3a523197b5b1706c7e699bb1cc15d2d95c8d0c3caa89c2a77 +size 189 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00005_000002_02.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00005_000002_02.solovev_no_axis.json new file mode 100644 index 000000000..e21e298ca --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00005_000002_02.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a35038ec911f884a1a78983a151070f042391da004ad67e50749182f0aa114d7 +size 189 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00011_000001_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00011_000001_01.solovev_no_axis.json new file mode 100644 index 000000000..c0c86edff --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00011_000001_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f1c93971371adebd47fa9d37323feb981e45b474d582eae70ef2866dcff0402 +size 354 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00011_000002_01.solovev_no_axis.json b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00011_000002_01.solovev_no_axis.json new file mode 100644 index 000000000..bc5233e18 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/solovev_no_axis/volume/volume_00011_000002_01.solovev_no_axis.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b754b9819df1bb0c597905d44ccd00499ad67ed20e242311b9f950ce28b8c9ed +size 352 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cma b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cma new file mode 100644 index 000000000..6b018fdc3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cma @@ -0,0 +1,417 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 51 16 16 5 6 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 2 0.000E+00 1.000E+00 3.000E-02 0.000E+00 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 1 60000 25 200 1 1.00E-06 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'power_series' + ----------------------------------- + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + TOROIDAL CURRENT DENSITY (*V') COEFFICIENTS ac (EXPANSION IN NORMALIZED RADIUS): + PCURR parameterization type is 'power_series' + -------------------------------------- + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 1.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 1 0 -7.6443E-02 0.0000E+00 0.0000E+00 3.0741E-01 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 2 0 -1.3241E-02 0.0000E+00 0.0000E+00 1.5421E-03 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 3 0 1.4210E-02 0.0000E+00 0.0000E+00 -9.1447E-03 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 4 0 -5.5044E-03 0.0000E+00 0.0000E+00 3.4608E-03 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 5 0 2.5534E-04 0.0000E+00 0.0000E+00 9.8836E-05 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 6 0 -1.1850E-03 0.0000E+00 0.0000E+00 -2.8801E-06 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + -6 1 -1.2020E-04 0.0000E+00 0.0000E+00 -3.8244E-05 + -5 1 6.9418E-04 0.0000E+00 0.0000E+00 8.1089E-04 + -4 1 -8.0946E-04 0.0000E+00 0.0000E+00 2.6558E-04 + -3 1 6.7138E-03 0.0000E+00 0.0000E+00 3.6481E-03 + -2 1 -2.5679E-02 0.0000E+00 0.0000E+00 -7.3826E-03 + -1 1 2.0503E-02 0.0000E+00 0.0000E+00 5.7238E-03 + 0 1 1.5726E-01 0.0000E+00 0.0000E+00 2.3684E-01 + 1 1 1.0473E-01 0.0000E+00 0.0000E+00 -9.9397E-02 + 2 1 5.2457E-02 0.0000E+00 0.0000E+00 -2.4257E-02 + 3 1 -1.3709E-02 0.0000E+00 0.0000E+00 3.6557E-04 + 4 1 2.3039E-03 0.0000E+00 0.0000E+00 -1.4057E-03 + 5 1 -1.7980E-03 0.0000E+00 0.0000E+00 4.0325E-05 + 6 1 -1.1278E-03 0.0000E+00 0.0000E+00 8.8400E-04 + -6 2 6.9203E-04 0.0000E+00 0.0000E+00 1.3207E-04 + -5 2 -9.5431E-04 0.0000E+00 0.0000E+00 -5.5737E-04 + -4 2 -1.6803E-03 0.0000E+00 0.0000E+00 -8.4272E-04 + -3 2 4.9534E-03 0.0000E+00 0.0000E+00 5.8057E-03 + -2 2 -4.5569E-03 0.0000E+00 0.0000E+00 -2.4959E-03 + -1 2 -1.7732E-03 0.0000E+00 0.0000E+00 -1.6087E-02 + 0 2 -1.2191E-02 0.0000E+00 0.0000E+00 1.6174E-02 + 1 2 -3.5835E-03 0.0000E+00 0.0000E+00 1.0242E-02 + 2 2 -1.0309E-02 0.0000E+00 0.0000E+00 -1.9015E-02 + 3 2 6.1412E-03 0.0000E+00 0.0000E+00 -1.5262E-02 + 4 2 -6.2552E-03 0.0000E+00 0.0000E+00 -4.3390E-03 + 5 2 -2.1712E-03 0.0000E+00 0.0000E+00 2.6385E-03 + 6 2 9.4421E-04 0.0000E+00 0.0000E+00 -2.5283E-04 + -6 3 6.4711E-04 0.0000E+00 0.0000E+00 1.9760E-04 + -5 3 3.7563E-05 0.0000E+00 0.0000E+00 -4.2608E-04 + -4 3 -1.8816E-04 0.0000E+00 0.0000E+00 -4.3415E-04 + -3 3 -5.4166E-04 0.0000E+00 0.0000E+00 7.1668E-05 + -2 3 -2.6031E-03 0.0000E+00 0.0000E+00 1.9201E-03 + -1 3 2.0328E-03 0.0000E+00 0.0000E+00 2.1341E-03 + 0 3 -3.5944E-03 0.0000E+00 0.0000E+00 5.0702E-03 + 1 3 1.1844E-02 0.0000E+00 0.0000E+00 4.7227E-03 + 2 3 8.3622E-06 0.0000E+00 0.0000E+00 1.1833E-03 + 3 3 9.5096E-04 0.0000E+00 0.0000E+00 -4.3167E-03 + 4 3 1.6162E-03 0.0000E+00 0.0000E+00 -1.7482E-03 + 5 3 1.6048E-04 0.0000E+00 0.0000E+00 -6.6007E-04 + 6 3 -2.6275E-04 0.0000E+00 0.0000E+00 1.0579E-03 + -6 4 4.4474E-05 0.0000E+00 0.0000E+00 -1.0321E-04 + -5 4 2.5215E-07 0.0000E+00 0.0000E+00 4.9508E-05 + -4 4 1.4978E-04 0.0000E+00 0.0000E+00 -1.7067E-04 + -3 4 -3.9044E-05 0.0000E+00 0.0000E+00 -3.3506E-04 + -2 4 1.9607E-04 0.0000E+00 0.0000E+00 5.6660E-04 + -1 4 1.9900E-03 0.0000E+00 0.0000E+00 -2.5360E-04 + 0 4 -1.5525E-03 0.0000E+00 0.0000E+00 1.3831E-04 + 1 4 3.7131E-05 0.0000E+00 0.0000E+00 3.1944E-04 + 2 4 2.9654E-03 0.0000E+00 0.0000E+00 -2.0467E-04 + 3 4 -3.6312E-03 0.0000E+00 0.0000E+00 1.8392E-03 + 4 4 -1.1913E-03 0.0000E+00 0.0000E+00 8.2478E-04 + 5 4 7.4516E-05 0.0000E+00 0.0000E+00 -1.8120E-04 + 6 4 8.5263E-05 0.0000E+00 0.0000E+00 -1.2551E-04 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 25 NO. FOURIER MODES = 59 FTOLV = 1.000E-06 NITER = 1000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 3.27E+01 4.50E-01 3.75E-02 5.44E-02 3.26E+01 4.41E-01 2.65E-01 4.16E-05 4.05E-04 4.66E-07 1.30E-05 4.09E-05 4.00E-04 8.58E-03 5.00E-01 8.162E-01 4.9203E-02 0.000E+00 1.333 + 200 1.77E-06 1.35E-07 3.69E-03 2.58E-02 3.69E-03 2.58E-02 1.49E-07 1.65E-10 5.05E-11 1.51E-07 1.75E-05 1.50E-07 1.75E-05 1.99E-09 4.85E-01 8.721E-01 4.4973E-02 0.000E+00 1.379 + 217 9.86E-07 8.51E-08 3.70E-03 2.59E-02 3.69E-03 2.59E-02 9.67E-08 1.22E-10 3.39E-11 1.52E-07 1.76E-05 1.51E-07 1.76E-05 1.30E-09 4.85E-01 8.730E-01 4.4972E-02 0.000E+00 1.378 + + MHD Energy = 4.497220E-02 + + NS = 51 NO. FOURIER MODES = 59 FTOLV = 1.000E-06 NITER = 60000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 4.85E-02 4.35E-03 5.01E-06 5.65E-06 4.86E-02 4.35E-03 1.18E-05 5.01E-10 7.21E-10 1.71E-10 1.36E-09 5.54E-10 1.33E-09 1.39E-06 5.00E-01 8.730E-01 4.4972E-02 0.000E+00 1.323 + 200 1.02E-06 1.73E-07 2.02E-04 1.74E-04 2.04E-04 1.75E-04 5.00E-09 1.07E-11 2.37E-12 9.65E-09 8.23E-08 9.68E-09 8.23E-08 1.01E-10 5.00E-01 8.786E-01 4.4971E-02 0.000E+00 1.379 + 206 9.96E-07 1.35E-07 2.13E-04 1.82E-04 2.14E-04 1.82E-04 4.69E-09 9.35E-12 2.49E-12 1.01E-08 8.59E-08 1.02E-08 8.59E-08 9.85E-11 5.00E-01 8.789E-01 4.4971E-02 0.000E+00 1.379 + + MHD Energy = 4.497072E-02 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 3.00E+00 -0.0000E+00 5.6894E-01 4.638E+03 1.860E-10 -1.621E+01 0.000E+00 1.000 0.000E+00 0.000E+00 4.771E-01 -4.115E+02 1.849E-01 + 2.00E-02 1.00E+00 6.0000E-04 5.6978E-01 1.252E+03 -2.131E-10 -1.623E+01 0.000E+00 1.012 0.000E+00 5.125E-19 4.771E-01 -1.288E+02 1.847E-01 + 4.00E-02 -1.00E+00 1.2000E-03 5.7079E-01 -2.124E+03 -6.111E-10 -1.626E+01 0.000E+00 1.028 0.000E+00 6.404E-19 4.771E-01 1.539E+02 1.844E-01 + 6.00E-02 1.00E+00 1.8000E-03 5.7191E-01 3.507E+03 -2.724E-09 -1.628E+01 0.000E+00 1.044 0.000E+00 1.159E-18 4.771E-01 -1.112E+02 1.841E-01 + 8.00E-02 1.00E+00 2.4000E-03 5.7295E-01 5.518E+03 6.148E-09 -1.630E+01 0.000E+00 1.060 0.000E+00 6.251E-19 4.771E-01 1.984E+02 1.839E-01 + 1.00E-01 1.00E+00 3.0000E-03 5.7393E-01 8.284E+03 -2.021E-09 -1.632E+01 0.000E+00 1.076 0.000E+00 -1.694E-20 4.771E-01 -1.636E+02 1.836E-01 + 1.20E-01 -1.00E+00 3.6000E-03 5.7486E-01 -6.712E+03 2.453E-09 -1.635E+01 0.000E+00 1.092 0.000E+00 -8.470E-20 4.771E-01 2.715E+02 1.834E-01 + 1.40E-01 1.00E+00 4.2000E-03 5.7576E-01 6.979E+03 -4.488E-09 -1.637E+01 0.000E+00 1.108 0.000E+00 2.338E-19 4.771E-01 -1.490E+02 1.832E-01 + 1.60E-01 1.00E+00 4.8000E-03 5.7665E-01 8.055E+03 -3.118E-09 -1.638E+01 0.000E+00 1.124 0.000E+00 1.423E-18 4.771E-01 3.053E+02 1.830E-01 + 1.80E-01 1.00E+00 5.4000E-03 5.7760E-01 5.135E+02 6.316E-09 -1.640E+01 0.000E+00 1.140 0.000E+00 9.216E-19 4.771E-01 -2.607E+02 1.828E-01 + 2.00E-01 1.00E+00 6.0000E-03 5.7862E-01 1.155E+04 -1.642E-09 -1.642E+01 0.000E+00 1.156 0.000E+00 1.897E-19 4.771E-01 9.226E+01 1.826E-01 + 2.20E-01 1.00E+00 6.6000E-03 5.7969E-01 4.702E+03 -6.000E-09 -1.644E+01 0.000E+00 1.172 0.000E+00 1.389E-18 4.771E-01 -1.751E+02 1.824E-01 + 2.40E-01 -1.00E+00 7.2000E-03 5.8078E-01 -8.333E+02 2.195E-08 -1.646E+01 0.000E+00 1.187 0.000E+00 -1.118E-18 4.771E-01 2.987E+02 1.822E-01 + 2.60E-01 1.00E+00 7.8000E-03 5.8190E-01 9.187E+03 -1.895E-09 -1.647E+01 0.000E+00 1.202 0.000E+00 -4.269E-18 4.771E-01 -1.658E+02 1.820E-01 + 2.80E-01 1.00E+00 8.4000E-03 5.8305E-01 7.020E+03 -6.649E-09 -1.649E+01 0.000E+00 1.217 0.000E+00 -2.924E-18 4.771E-01 1.568E+02 1.818E-01 + 3.00E-01 1.00E+00 9.0000E-03 5.8421E-01 5.846E+03 -6.513E-09 -1.651E+01 0.000E+00 1.233 0.000E+00 -8.504E-19 4.771E-01 -2.179E+02 1.816E-01 + 3.20E-01 1.00E+00 9.6000E-03 5.8537E-01 2.520E+03 -8.503E-09 -1.652E+01 0.000E+00 1.247 0.000E+00 1.518E-18 4.771E-01 2.511E+02 1.814E-01 + 3.40E-01 1.00E+00 1.0200E-02 5.8653E-01 9.381E+03 -1.201E-08 -1.654E+01 0.000E+00 1.262 0.000E+00 4.757E-18 4.771E-01 -2.789E+02 1.812E-01 + 3.60E-01 1.00E+00 1.0800E-02 5.8770E-01 6.057E+03 2.618E-08 -1.656E+01 0.000E+00 1.277 0.000E+00 2.514E-18 4.771E-01 2.465E+02 1.811E-01 + 3.80E-01 1.00E+00 1.1400E-02 5.8886E-01 5.947E+03 -1.760E-08 -1.658E+01 0.000E+00 1.292 0.000E+00 1.159E-18 4.771E-01 -3.097E+02 1.809E-01 + 4.00E-01 1.00E+00 1.2000E-02 5.9002E-01 7.545E+03 9.152E-09 -1.659E+01 0.000E+00 1.306 0.000E+00 2.494E-18 4.771E-01 2.750E+02 1.807E-01 + 4.20E-01 1.00E+00 1.2600E-02 5.9117E-01 6.652E+03 2.409E-08 -1.661E+01 0.000E+00 1.321 0.000E+00 -2.778E-18 4.771E-01 -3.081E+02 1.805E-01 + 4.40E-01 1.00E+00 1.3200E-02 5.9232E-01 8.958E+03 -2.650E-08 -1.663E+01 0.000E+00 1.335 0.000E+00 -2.392E-18 4.771E-01 2.456E+02 1.803E-01 + 4.60E-01 1.00E+00 1.3800E-02 5.9347E-01 4.019E+03 2.558E-09 -1.665E+01 0.000E+00 1.349 0.000E+00 1.409E-18 4.771E-01 -2.935E+02 1.801E-01 + 4.80E-01 1.00E+00 1.4400E-02 5.9461E-01 1.312E+04 2.312E-08 -1.666E+01 0.000E+00 1.364 0.000E+00 -2.677E-18 4.771E-01 2.289E+02 1.799E-01 + 5.00E-01 1.00E+00 1.5000E-02 5.9574E-01 2.207E+03 -1.935E-08 -1.668E+01 0.000E+00 1.378 0.000E+00 -3.273E-18 4.771E-01 -2.734E+02 1.797E-01 + 5.20E-01 1.00E+00 1.5600E-02 5.9688E-01 1.407E+04 -1.474E-08 -1.670E+01 0.000E+00 1.393 0.000E+00 2.162E-18 4.772E-01 1.661E+02 1.795E-01 + 5.40E-01 1.00E+00 1.6200E-02 5.9800E-01 2.661E+03 1.689E-08 -1.672E+01 0.000E+00 1.407 0.000E+00 1.816E-18 4.772E-01 -1.605E+02 1.793E-01 + 5.60E-01 1.00E+00 1.6800E-02 5.9913E-01 1.349E+04 -8.647E-09 -1.674E+01 0.000E+00 1.421 0.000E+00 5.014E-19 4.772E-01 5.252E+01 1.791E-01 + 5.80E-01 1.00E+00 1.7400E-02 6.0025E-01 4.276E+03 1.359E-08 -1.676E+01 0.000E+00 1.436 0.000E+00 -2.914E-19 4.772E-01 -1.185E+02 1.789E-01 + 6.00E-01 1.00E+00 1.8000E-02 6.0136E-01 1.202E+04 -4.017E-09 -1.678E+01 0.000E+00 1.450 0.000E+00 -1.823E-18 4.772E-01 7.012E+01 1.786E-01 + 6.20E-01 1.00E+00 1.8600E-02 6.0247E-01 6.318E+03 1.123E-08 -1.680E+01 0.000E+00 1.464 0.000E+00 -2.982E-18 4.772E-01 -1.407E+02 1.784E-01 + 6.40E-01 1.00E+00 1.9200E-02 6.0358E-01 1.010E+04 -2.159E-08 -1.683E+01 0.000E+00 1.479 0.000E+00 -1.315E-18 4.772E-01 8.440E+01 1.782E-01 + 6.60E-01 1.00E+00 1.9800E-02 6.0468E-01 7.974E+03 2.847E-08 -1.685E+01 0.000E+00 1.493 0.000E+00 -2.426E-18 4.772E-01 -1.853E+02 1.780E-01 + 6.80E-01 1.00E+00 2.0400E-02 6.0577E-01 1.006E+04 -3.268E-08 -1.687E+01 0.000E+00 1.507 0.000E+00 -1.741E-18 4.772E-01 1.713E+02 1.777E-01 + 7.00E-01 1.00E+00 2.1000E-02 6.0686E-01 7.337E+03 -7.057E-09 -1.689E+01 0.000E+00 1.522 0.000E+00 4.662E-18 4.772E-01 -2.541E+02 1.775E-01 + 7.20E-01 1.00E+00 2.1600E-02 6.0795E-01 1.047E+04 8.138E-09 -1.692E+01 0.000E+00 1.536 0.000E+00 4.486E-18 4.772E-01 1.653E+02 1.772E-01 + 7.40E-01 1.00E+00 2.2200E-02 6.0903E-01 8.759E+03 1.617E-08 -1.694E+01 0.000E+00 1.551 0.000E+00 5.557E-19 4.772E-01 -2.107E+02 1.770E-01 + 7.60E-01 1.00E+00 2.2800E-02 6.1010E-01 9.083E+03 -2.903E-08 -1.696E+01 0.000E+00 1.565 0.000E+00 2.643E-18 4.772E-01 1.950E+02 1.767E-01 + 7.80E-01 1.00E+00 2.3400E-02 6.1117E-01 9.449E+03 2.748E-08 -1.699E+01 0.000E+00 1.580 0.000E+00 2.887E-18 4.772E-01 -2.963E+02 1.765E-01 + 8.00E-01 1.00E+00 2.4000E-02 6.1223E-01 6.883E+03 -3.837E-08 -1.701E+01 0.000E+00 1.594 0.000E+00 4.662E-18 4.772E-01 7.016E+01 1.762E-01 + 8.20E-01 1.00E+00 2.4600E-02 6.1326E-01 1.058E+04 6.838E-08 -1.704E+01 0.000E+00 1.609 0.000E+00 -2.304E-19 4.772E-01 -5.646E+01 1.760E-01 + 8.40E-01 1.00E+00 2.5200E-02 6.1428E-01 1.311E+04 -3.177E-08 -1.707E+01 0.000E+00 1.623 0.000E+00 -6.180E-18 4.772E-01 2.391E+02 1.757E-01 + 8.60E-01 1.00E+00 2.5800E-02 6.1527E-01 7.621E+03 3.819E-09 -1.709E+01 0.000E+00 1.638 0.000E+00 -1.626E-18 4.772E-01 -5.172E+02 1.754E-01 + 8.80E-01 1.00E+00 2.6400E-02 6.1623E-01 8.765E+03 2.984E-09 -1.712E+01 0.000E+00 1.653 0.000E+00 -2.738E-18 4.772E-01 3.931E+02 1.751E-01 + 9.00E-01 1.00E+00 2.7000E-02 6.1718E-01 1.473E+04 -1.192E-08 -1.715E+01 0.000E+00 1.667 0.000E+00 -1.274E-18 4.772E-01 -2.474E+02 1.748E-01 + 9.20E-01 1.00E+00 2.7600E-02 6.1813E-01 1.012E+04 -1.024E-08 -1.718E+01 0.000E+00 1.682 0.000E+00 2.358E-18 4.772E-01 9.159E+01 1.746E-01 + 9.40E-01 1.00E+00 2.8200E-02 6.1914E-01 7.392E+03 3.134E-08 -1.721E+01 0.000E+00 1.697 0.000E+00 -1.111E-18 4.772E-01 -1.145E+02 1.743E-01 + 9.60E-01 1.00E+00 2.8800E-02 6.2023E-01 1.094E+04 -3.895E-08 -1.724E+01 0.000E+00 1.712 0.000E+00 1.491E-19 4.772E-01 6.760E+01 1.740E-01 + 9.80E-01 1.00E+00 2.9400E-02 6.2136E-01 7.294E+03 1.521E-08 -1.727E+01 0.000E+00 1.727 0.000E+00 4.052E-18 4.772E-01 -1.597E+02 1.737E-01 + 1.00E+00 1.00E+00 3.0000E-02 6.2246E-01 3.663E+03 6.917E-08 -1.730E+01 0.000E+00 1.742 0.000E+00 -9.622E-19 4.772E-01 -3.870E+02 1.733E-01 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.324271 + BMAX(u=0) = 0.545067 + BMIN(u=pi) = 0.334684 + BMAX(u=pi) = 0.541748 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 6.107317 + Mean Elongation = 5.345399 + Plasma Volume = 0.501353 [M**3] + Cross Sectional Area = 0.081244 [M**2] + Normal Surface Area = 9.602429 [M**2] + Poloidal Circumference= 1.422272 [M] + Major Radius = 0.982136 [M] (from Volume and Cross Section) + Minor Radius = 0.160813 [M] (from Cross Section) + Minimum (inboard) R = 0.574950 [M] + Maximum (outboard) R = 1.217823 [M] + Maximum height Z = 0.558836 [M] + Waist (v = 0) in R = 0.623053 [M] + Full Height(v = 0) = 0.246276 [M] + Waist (v = pi) in R = 0.096586 [M] + Full Height(v = pi) = 0.575985 [M] + Toroidal Flux = 0.030000 [Wb] + Toroidal Current = 0.000000 [MA] + RBtor(s=1) = 0.477223 [T-m] + RBtor(s=0) = 0.477108 [T-m] + Volume Average B = 0.423553 [T] + Ion Larmor Radius = 0.007555 [M] X Ti(keV)**0.5 + / = ************** (Vol. Averaged) + / = ************** (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 0.00034 0.04261 0.39140 0.00000 -0.01856 0.00086 2.59E+27 2.59E+27 + 3 0.00068 0.06047 0.39157 0.00000 -0.02452 0.00057 1.21E+26 1.21E+26 + 4 0.00103 0.07420 0.39167 0.00000 -0.02970 -0.00030 4.06E+25 4.06E+25 + 5 0.00137 0.08577 0.39169 0.00000 -0.03379 -0.00128 2.63E+25 2.63E+25 + 6 0.00171 0.09597 0.39165 0.00000 -0.03742 -0.00224 2.31E+25 2.31E+25 + 7 0.00206 0.10519 0.39153 0.00000 -0.04054 -0.00316 2.07E+25 2.07E+25 + 8 0.00240 0.11367 0.39132 0.00000 -0.04339 -0.00401 1.99E+25 1.99E+25 + 9 0.00275 0.12157 0.39101 0.00000 -0.04600 -0.00478 1.79E+25 1.79E+25 + 10 0.00310 0.12900 0.39060 0.00000 -0.04843 -0.00549 1.70E+25 1.70E+25 + 11 0.00344 0.13604 0.39006 0.00000 -0.05072 -0.00614 1.56E+25 1.56E+25 + 12 0.00379 0.14275 0.38942 0.00000 -0.05287 -0.00673 1.51E+25 1.51E+25 + 13 0.00414 0.14918 0.38867 0.00000 -0.05491 -0.00728 1.40E+25 1.40E+25 + 14 0.00449 0.15535 0.38784 0.00000 -0.05684 -0.00778 1.41E+25 1.41E+25 + 15 0.00484 0.16131 0.38694 0.00000 -0.05868 -0.00825 1.36E+25 1.36E+25 + 16 0.00519 0.16708 0.38597 0.00000 -0.06044 -0.00868 1.39E+25 1.39E+25 + 17 0.00554 0.17266 0.38495 0.00000 -0.06213 -0.00908 1.37E+25 1.37E+25 + 18 0.00589 0.17809 0.38389 0.00000 -0.06375 -0.00944 1.45E+25 1.45E+25 + 19 0.00624 0.18337 0.38374 0.00000 0.11876 -0.00978 1.45E+25 1.45E+25 + 20 0.00659 0.18851 0.38449 0.00000 0.11720 -0.01010 1.55E+25 1.55E+25 + 21 0.00695 0.19353 0.38519 0.00000 0.11570 -0.01039 1.57E+25 1.57E+25 + 22 0.00730 0.19844 0.38586 0.00000 0.11425 -0.01066 1.69E+25 1.69E+25 + 23 0.00766 0.20324 0.38648 0.00000 0.11286 -0.01091 1.74E+25 1.74E+25 + 24 0.00801 0.20794 0.38708 0.00000 0.11150 -0.01115 1.86E+25 1.86E+25 + 25 0.00837 0.21255 0.38764 0.00000 0.11020 -0.01136 1.94E+25 1.94E+25 + 26 0.00873 0.21707 0.38817 0.00000 0.10892 -0.01156 2.09E+25 2.09E+25 + 27 0.00908 0.22151 0.38867 0.00000 0.10769 -0.01174 2.21E+25 2.21E+25 + 28 0.00944 0.22588 0.38914 0.00000 0.10648 -0.01191 2.37E+25 2.37E+25 + 29 0.00980 0.23017 0.38959 0.00000 0.10531 -0.01206 2.54E+25 2.54E+25 + 30 0.01016 0.23439 0.39001 0.00000 0.10416 -0.01220 2.71E+25 2.71E+25 + 31 0.01052 0.23855 0.39041 0.00000 0.10304 -0.01232 2.93E+25 2.93E+25 + 32 0.01088 0.24265 0.39079 0.00000 0.10195 -0.01243 3.15E+25 3.15E+25 + 33 0.01125 0.24669 0.39115 0.00000 0.10088 -0.01252 3.39E+25 3.39E+25 + 34 0.01161 0.25067 0.39149 0.00000 0.09983 -0.01260 3.67E+25 3.67E+25 + 35 0.01197 0.25460 0.39182 0.00000 0.09881 -0.01267 3.97E+25 3.97E+25 + 36 0.01233 0.25848 0.39212 0.00000 0.09780 -0.01272 4.32E+25 4.32E+25 + 37 0.01270 0.26231 0.39241 0.00000 0.09681 -0.01276 4.67E+25 4.67E+25 + 38 0.01306 0.26609 0.39269 0.00000 0.09584 -0.01279 5.07E+25 5.07E+25 + 39 0.01343 0.26982 0.39295 0.00000 0.09489 -0.01281 5.49E+25 5.49E+25 + 40 0.01380 0.27351 0.39320 0.00000 0.09396 -0.01282 5.93E+25 5.93E+25 + 41 0.01416 0.27716 0.39343 0.00000 0.09304 -0.01283 6.41E+25 6.41E+25 + 42 0.01453 0.28077 0.39366 0.00000 0.09213 -0.01282 6.89E+25 6.89E+25 + 43 0.01490 0.28433 0.39387 0.00000 0.09124 -0.01280 7.41E+25 7.41E+25 + 44 0.01527 0.28786 0.39408 0.00000 0.09036 -0.01277 7.90E+25 7.90E+25 + 45 0.01564 0.29135 0.39428 0.00000 0.08950 -0.01274 8.30E+25 8.30E+25 + 46 0.01601 0.29480 0.39447 0.00000 0.08864 -0.01269 8.92E+25 8.92E+25 + 47 0.01638 0.29821 0.39466 0.00000 0.08780 -0.01262 9.27E+25 9.27E+25 + 48 0.01675 0.30159 0.39483 0.00000 0.08696 -0.01254 1.07E+26 1.07E+26 + 49 0.01712 0.30493 0.39500 0.00000 0.08614 -0.01245 1.15E+26 1.15E+26 + 50 0.01749 0.30824 0.39514 0.00000 0.08532 -0.01235 1.19E+26 1.19E+26 + 51 0.01787 0.31153 0.39527 0.00000 0.08451 -0.01224 0.00E+00 0.00E+00 + +----------------------------------------------------------------------- + Toroidal Plane: Phi = 180/Nfp +----------------------------------------------------------------------- + + 2 0.00034 0.00741 6.83241 0.00000 -0.07957 -0.00970 + 3 0.00068 0.01040 6.84634 0.00000 -0.11199 -0.01405 + 4 0.00103 0.01267 6.83930 0.00000 -0.13613 -0.01740 + 5 0.00137 0.01456 6.82394 0.00000 -0.15658 -0.02008 + 6 0.00171 0.01621 6.79079 0.00000 -0.17439 -0.02220 + 7 0.00206 0.01769 6.73498 0.00000 -0.19007 -0.02379 + 8 0.00240 0.01905 6.68076 0.00000 -0.20466 -0.02500 + 9 0.00275 0.02030 6.58040 0.00000 -0.21685 -0.02569 + 10 0.00310 0.02148 6.47267 0.00000 -0.22791 -0.02605 + 11 0.00344 0.02258 6.37061 0.00000 -0.23840 -0.02618 + 12 0.00379 0.02364 6.27355 0.00000 -0.24843 -0.02611 + 13 0.00414 0.02464 6.18091 0.00000 -0.25807 -0.02588 + 14 0.00449 0.02560 6.09223 0.00000 -0.26736 -0.02553 + 15 0.00484 0.02652 6.00711 0.00000 -0.27634 -0.02506 + 16 0.00519 0.02741 5.92520 0.00000 -0.28504 -0.02451 + 17 0.00554 0.02827 5.84626 0.00000 -0.29348 -0.02388 + 18 0.00589 0.02910 5.77006 0.00000 -0.30168 -0.02320 + 19 0.00624 0.02991 5.69638 0.00000 -0.30967 -0.02247 + 20 0.00659 0.03070 5.62507 0.00000 -0.31747 -0.02171 + 21 0.00695 0.03146 5.55597 0.00000 -0.32508 -0.02091 + 22 0.00730 0.03220 5.48897 0.00000 -0.33252 -0.02009 + 23 0.00766 0.03292 5.42392 0.00000 -0.33981 -0.01925 + 24 0.00801 0.03363 5.36073 0.00000 -0.34696 -0.01840 + 25 0.00837 0.03432 5.29929 0.00000 -0.35397 -0.01754 + 26 0.00873 0.03499 5.23952 0.00000 -0.36088 -0.01668 + 27 0.00908 0.03565 5.18131 0.00000 -0.36766 -0.01580 + 28 0.00944 0.03630 5.12460 0.00000 -0.37434 -0.01493 + 29 0.00980 0.03693 5.05829 0.00000 -0.38010 -0.01403 + 30 0.01016 0.03755 4.98730 0.00000 -0.38526 -0.01312 + 31 0.01052 0.03815 4.91827 0.00000 -0.39032 -0.01222 + 32 0.01088 0.03874 4.85109 0.00000 -0.39530 -0.01133 + 33 0.01125 0.03933 4.78566 0.00000 -0.40018 -0.01045 + 34 0.01161 0.03990 4.72187 0.00000 -0.40499 -0.00958 + 35 0.01197 0.04046 4.65965 0.00000 -0.40972 -0.00872 + 36 0.01233 0.04101 4.59890 0.00000 -0.41438 -0.00788 + 37 0.01270 0.04155 4.53955 0.00000 -0.41898 -0.00705 + 38 0.01306 0.04208 4.48153 0.00000 -0.42352 -0.00623 + 39 0.01343 0.04261 4.42478 0.00000 -0.42800 -0.00542 + 40 0.01380 0.04312 4.36922 0.00000 -0.43243 -0.00463 + 41 0.01416 0.04363 4.31482 0.00000 -0.43680 -0.00385 + 42 0.01453 0.04412 4.26153 0.00000 -0.44112 -0.00308 + 43 0.01490 0.04461 4.20929 0.00000 -0.44540 -0.00233 + 44 0.01527 0.04510 4.15809 0.00000 -0.44962 -0.00159 + 45 0.01564 0.04557 4.10788 0.00000 -0.45380 -0.00086 + 46 0.01601 0.04604 4.05864 0.00000 -0.45792 -0.00015 + 47 0.01638 0.04651 4.01033 0.00000 -0.46200 0.00054 + 48 0.01675 0.04696 3.96294 0.00000 -0.46602 0.00121 + 49 0.01712 0.04741 3.91640 0.00000 -0.47000 0.00187 + 50 0.01749 0.04786 3.87068 0.00000 -0.47393 0.00251 + 51 0.01787 0.04829 3.82576 0.00000 -0.47782 0.00313 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 0.000000E+00 0.000000E+00 + bpol**2 /(2 mu0) = 6.030239E+03 1.202794E+04 + btor**2/(2 mu0) = 2.975633E+04 5.935208E+04 + b**2/(2 mu0) = 3.578657E+04 7.138001E+04 + EKIN (3/2p) = 0.000000E+00 0.000000E+00 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 9.9968E-01 -0.0000E+00 + 1 -7.5381E-02 2.7440E-01 + 2 -5.4282E-02 4.1162E-02 + 3 1.0844E-02 -2.0956E-03 + 4 -1.6974E-03 6.8859E-04 + 5 -4.4534E-04 8.1370E-04 + 6 1.3196E-04 7.1379E-05 + + From volume averages over plasma, betas are + beta total = 0.000000 + beta poloidal = 0.000000 + beta toroidal = 0.000000 + + R * Btor-vac = 0.477223 [Wb/M] + Peak Beta = 0.000000 + Beta-star = 0.000000 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 0.847803 [M] + RG (Geometric) = 0.886476 [M] + RL (Vol/2*pi*Area-Lao) = 0.982136 [M] + Poloidal Field Energy + Normalization Ratio = 0.000000 (Lao/Hirshman) + + s3 = -1.708686 + lsubi = 0.953241 + musubi = 2.904986 + betai = 0.000000 + lambda = 0.476621 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 0.043626 0.136776 + s1 = -2.904076 -2.991852 -3.208970 + s2 = 1.924250 2.012026 2.229144 + betai (Mui + s1) = 0.000910 -0.086867 -0.303984 + lambda (s1/2 + s2) = 0.472212 0.516100 0.624659 + 1st Shafr'v relation = -0.004036 -0.004036 -0.004036 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = 0.002528 -0.041208 -0.134594 + (Betai + Li + Mui)/(2*s2) - 1 + + + EXECUTION TERMINATED NORMALLY + + FILE : cma + NUMBER OF JACOBIAN RESETS = 0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_fixed_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_fixed_bdy new file mode 100644 index 000000000..a6f042ac0 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_fixed_bdy @@ -0,0 +1,309 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 25 16 36 5 4 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 5 0.000E+00 1.000E+00 -3.500E-02 4.323E+04 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 1 25000 25 200 1 1.00E-06 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + Pressure profile factor: 4.3229E+02 (multiplier for pressure) + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'two_power' + ----------------------------------- + 1.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + TOROIDAL CURRENT DENSITY (*V') COEFFICIENTS ac (EXPANSION IN NORMALIZED RADIUS): + PCURR parameterization type is 'two_power' + -------------------------------------- + 1.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 7.8091E-01 0.0000E+00 0.0000E+00 0.0000E+00 7.8604E-01 0.0000E+00 0.0000E+00 0.0000E+00 + 1 0 -4.6152E-02 0.0000E+00 0.0000E+00 4.4922E-02 -3.0298E-02 0.0000E+00 0.0000E+00 2.7316E-02 + 2 0 2.5347E-03 0.0000E+00 0.0000E+00 -1.5796E-03 9.1526E-04 0.0000E+00 0.0000E+00 -9.3710E-04 + 3 0 -2.9457E-04 0.0000E+00 0.0000E+00 1.1010E-04 -1.9196E-05 0.0000E+00 0.0000E+00 1.7418E-05 + 4 0 4.8763E-05 0.0000E+00 0.0000E+00 -3.4152E-05 1.4593E-06 0.0000E+00 0.0000E+00 -5.9122E-07 + -4 1 1.1099E-05 0.0000E+00 0.0000E+00 8.8624E-06 + -3 1 -6.6976E-05 0.0000E+00 0.0000E+00 -7.6199E-06 + -2 1 3.4481E-04 0.0000E+00 0.0000E+00 -1.0239E-04 + -1 1 -5.6609E-03 0.0000E+00 0.0000E+00 -3.0818E-03 + 0 1 1.3144E-01 0.0000E+00 0.0000E+00 1.6460E-01 + 1 1 -3.9386E-02 0.0000E+00 0.0000E+00 3.0339E-02 + 2 1 4.8887E-03 0.0000E+00 0.0000E+00 -4.5159E-03 + 3 1 -4.3812E-04 0.0000E+00 0.0000E+00 3.2239E-04 + 4 1 4.8165E-05 0.0000E+00 0.0000E+00 -3.4874E-05 + -4 2 -1.5301E-06 0.0000E+00 0.0000E+00 -1.2844E-06 + -3 2 2.3541E-05 0.0000E+00 0.0000E+00 2.9307E-05 + -2 2 -8.8303E-05 0.0000E+00 0.0000E+00 -1.9308E-04 + -1 2 1.4606E-04 0.0000E+00 0.0000E+00 9.1797E-04 + 0 2 1.4717E-03 0.0000E+00 0.0000E+00 -2.7225E-03 + 1 2 -3.2061E-03 0.0000E+00 0.0000E+00 3.5566E-03 + 2 2 2.2894E-03 0.0000E+00 0.0000E+00 -2.0530E-03 + 3 2 -3.1917E-04 0.0000E+00 0.0000E+00 3.2876E-04 + 4 2 2.6014E-05 0.0000E+00 0.0000E+00 -3.5793E-05 + -4 3 -2.2227E-06 0.0000E+00 0.0000E+00 3.8311E-06 + -3 3 8.9318E-07 0.0000E+00 0.0000E+00 -3.2473E-06 + -2 3 -1.8693E-05 0.0000E+00 0.0000E+00 -3.7785E-06 + -1 3 -1.0322E-04 0.0000E+00 0.0000E+00 -7.4305E-07 + 0 3 -1.0591E-04 0.0000E+00 0.0000E+00 1.2021E-04 + 1 3 -3.7046E-05 0.0000E+00 0.0000E+00 9.7059E-05 + 2 3 3.8495E-04 0.0000E+00 0.0000E+00 -3.0556E-04 + 3 3 -8.7346E-05 0.0000E+00 0.0000E+00 7.1282E-05 + 4 3 1.7056E-05 0.0000E+00 0.0000E+00 -1.1419E-05 + -4 4 -4.1161E-06 0.0000E+00 0.0000E+00 2.7911E-06 + -3 4 -3.6701E-06 0.0000E+00 0.0000E+00 -1.0123E-06 + -2 4 3.2766E-06 0.0000E+00 0.0000E+00 1.3374E-05 + -1 4 -5.4990E-05 0.0000E+00 0.0000E+00 -6.5630E-05 + 0 4 6.1104E-04 0.0000E+00 0.0000E+00 4.0853E-04 + 1 4 1.5775E-04 0.0000E+00 0.0000E+00 -1.1357E-03 + 2 4 2.3894E-04 0.0000E+00 0.0000E+00 4.5350E-04 + 3 4 -7.4586E-05 0.0000E+00 0.0000E+00 -5.0700E-05 + 4 4 1.0768E-05 0.0000E+00 0.0000E+00 5.2240E-06 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 25 NO. FOURIER MODES = 41 FTOLV = 1.000E-06 NITER = 25000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 2.41E-01 1.82E-02 1.59E-03 1.19E-03 2.39E-01 1.74E-02 5.32E-02 2.41E-03 1.98E-04 3.71E-07 1.26E-06 2.41E-03 1.98E-04 1.27E-02 7.00E-01 7.566E-01 5.3446E-02 1.838E-03 1.027 + 120 9.35E-07 3.11E-07 4.07E-05 1.82E-04 4.17E-05 1.82E-04 2.61E-07 5.32E-10 3.18E-10 2.59E-08 6.09E-07 2.64E-08 6.08E-07 1.59E-09 7.00E-01 7.555E-01 5.0572E-02 1.926E-03 1.031 + + MHD Energy = 5.057163E-02 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 -3.37E-03 -0.0000E+00 1.2428E+00 1.936E+06 1.548E+06 8.758E+00 -2.790E+01 1.000 4.323E+02 0.000E+00 -4.613E-01 -7.143E+05 3.310E-01 + 4.17E-02 2.88E-03 -1.4583E-03 1.2453E+00 1.909E+06 1.542E+06 8.789E+00 2.815E+00 1.001 4.323E+02 -6.292E-04 -4.606E-01 -7.116E+05 3.298E-01 + 8.33E-02 9.13E-03 -2.9167E-03 1.2483E+00 1.883E+06 1.537E+06 8.820E+00 3.353E+01 1.002 4.323E+02 -1.258E-03 -4.598E-01 -7.089E+05 3.287E-01 + 1.25E-01 1.05E-02 -4.3750E-03 1.2518E+00 1.875E+06 1.531E+06 8.852E+00 1.591E+02 1.003 4.321E+02 -1.887E-03 -4.590E-01 -7.061E+05 3.275E-01 + 1.67E-01 6.31E-03 -5.8333E-03 1.2554E+00 1.886E+06 1.524E+06 8.883E+00 4.908E+02 1.005 4.316E+02 -2.516E-03 -4.582E-01 -7.028E+05 3.263E-01 + 2.08E-01 1.53E-03 -7.2917E-03 1.2586E+00 1.893E+06 1.514E+06 8.914E+00 1.182E+03 1.007 4.304E+02 -3.143E-03 -4.575E-01 -6.988E+05 3.252E-01 + 2.50E-01 1.95E-04 -8.7500E-03 1.2613E+00 1.877E+06 1.500E+06 8.944E+00 2.423E+03 1.009 4.278E+02 -3.768E-03 -4.567E-01 -6.922E+05 3.242E-01 + 2.92E-01 -1.72E-04 -1.0208E-02 1.2630E+00 1.840E+06 1.478E+06 8.973E+00 4.425E+03 1.011 4.228E+02 -4.388E-03 -4.559E-01 -6.821E+05 3.231E-01 + 3.33E-01 -3.10E-05 -1.1667E-02 1.2631E+00 1.777E+06 1.444E+06 9.003E+00 7.393E+03 1.014 4.142E+02 -4.997E-03 -4.551E-01 -6.659E+05 3.220E-01 + 3.75E-01 1.54E-03 -1.3125E-02 1.2609E+00 1.678E+06 1.392E+06 9.032E+00 1.147E+04 1.017 4.004E+02 -5.591E-03 -4.544E-01 -6.419E+05 3.210E-01 + 4.17E-01 3.38E-03 -1.4583E-02 1.2554E+00 1.538E+06 1.317E+06 9.059E+00 1.665E+04 1.020 3.799E+02 -6.160E-03 -4.537E-01 -6.070E+05 3.201E-01 + 4.58E-01 4.15E-03 -1.6042E-02 1.2458E+00 1.359E+06 1.215E+06 9.084E+00 2.269E+04 1.023 3.512E+02 -6.693E-03 -4.531E-01 -5.598E+05 3.192E-01 + 5.00E-01 2.26E-03 -1.7500E-02 1.2311E+00 1.144E+06 1.082E+06 9.105E+00 2.897E+04 1.027 3.136E+02 -7.178E-03 -4.526E-01 -4.981E+05 3.184E-01 + 5.42E-01 -2.31E-03 -1.8958E-02 1.2106E+00 9.032E+05 9.209E+05 9.120E+00 3.450E+04 1.030 2.673E+02 -7.601E-03 -4.522E-01 -4.234E+05 3.179E-01 + 5.83E-01 -8.21E-03 -2.0417E-02 1.1840E+00 6.490E+05 7.373E+05 9.129E+00 3.796E+04 1.034 2.145E+02 -7.952E-03 -4.518E-01 -3.382E+05 3.175E-01 + 6.25E-01 -1.27E-02 -2.1875E-02 1.1517E+00 4.050E+05 5.452E+05 9.131E+00 3.806E+04 1.038 1.590E+02 -8.224E-03 -4.516E-01 -2.497E+05 3.173E-01 + 6.67E-01 -1.49E-02 -2.3333E-02 1.1147E+00 2.030E+05 3.631E+05 9.126E+00 3.407E+04 1.042 1.064E+02 -8.417E-03 -4.515E-01 -1.656E+05 3.173E-01 + 7.08E-01 -1.89E-02 -2.4792E-02 1.0747E+00 6.866E+04 2.105E+05 9.114E+00 2.647E+04 1.046 6.228E+01 -8.538E-03 -4.514E-01 -9.583E+04 3.175E-01 + 7.50E-01 -3.94E-02 -2.6250E-02 1.0338E+00 5.719E+03 1.012E+05 9.099E+00 1.710E+04 1.050 3.051E+01 -8.604E-03 -4.514E-01 -4.565E+04 3.179E-01 + 7.92E-01 -7.07E-02 -2.7708E-02 9.9393E-01 -9.730E+03 3.753E+04 9.081E+00 8.623E+03 1.055 1.175E+01 -8.633E-03 -4.514E-01 -1.701E+04 3.183E-01 + 8.33E-01 -2.69E-01 -2.9167E-02 9.5640E-01 -1.910E+03 9.572E+03 9.062E+00 3.057E+03 1.059 3.234E+00 -8.643E-03 -4.514E-01 -4.130E+03 3.187E-01 + 8.75E-01 -8.47E-01 -3.0625E-02 9.2188E-01 1.132E+04 1.376E+03 9.043E+00 6.348E+02 1.064 5.423E-01 -8.646E-03 -4.514E-01 -9.025E+02 3.192E-01 + 9.17E-01 -9.93E-01 -3.2083E-02 8.9035E-01 1.803E+04 7.614E+01 9.023E+00 5.368E+01 1.069 4.024E-02 -8.646E-03 -4.514E-01 -1.474E+02 3.197E-01 + 9.58E-01 -1.00E+00 -3.3542E-02 8.6161E-01 3.940E+03 -1.613E+01 9.003E+00 7.549E-01 1.075 5.505E-04 -8.646E-03 -4.514E-01 -2.617E+02 3.202E-01 + 1.00E+00 -1.01E+00 -3.5000E-02 8.3426E-01 -1.021E+04 -1.088E+02 8.983E+00 -5.217E+01 1.081 -5.504E-04 -8.646E-03 -4.514E-01 -3.760E+02 3.208E-01 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.286856 + BMAX(u=0) = 0.680628 + BMIN(u=pi) = 0.686782 + BMAX(u=pi) = 0.713119 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 5.485830 + Mean Elongation = 2.013607 + Plasma Volume = 0.315397 [M**3] + Cross Sectional Area = 0.064073 [M**2] + Normal Surface Area = 4.808799 [M**2] + Poloidal Circumference= 0.948115 [M] + Major Radius = 0.783437 [M] (from Volume and Cross Section) + Minor Radius = 0.142811 [M] (from Cross Section) + Minimum (inboard) R = 0.647045 [M] + Maximum (outboard) R = 1.020607 [M] + Maximum height Z = 0.216293 [M] + Waist (v = 0) in R = 0.182449 [M] + Full Height(v = 0) = 0.375124 [M] + Waist (v = pi) in R = 0.365566 [M] + Full Height(v = pi) = 0.265493 [M] + Toroidal Flux = -0.035000 [Wb] + Toroidal Current = 0.043229 [MA] + RBtor(s=1) = -0.451408 [T-m] + RBtor(s=0) = -0.461330 [T-m] + Volume Average B = 0.566838 [T] + Ion Larmor Radius = 0.005645 [M] X Ti(keV)**0.5 + / = 3476.743913 (Vol. Averaged) + / = 24.752190 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 -0.00181 0.01889 1.94946 0.00000 0.00532 0.01274 5.48E+12 1.42E+11 + 3 -0.00363 0.02673 1.95183 0.00000 0.00691 0.01851 1.86E+10 1.78E+07 + 4 -0.00546 0.03273 1.95580 0.00000 0.00737 0.02360 5.45E+08 3.14E+05 + 5 -0.00728 0.03779 1.96060 0.00000 0.00743 0.02836 4.23E+07 1.25E+04 + 6 -0.00912 0.04224 1.96597 0.00000 0.00726 0.03288 5.73E+06 9.87E+02 + 7 -0.01095 0.04625 1.97179 0.00000 0.00697 0.03721 1.11E+06 1.80E+02 + 8 -0.01280 0.04992 1.97792 0.00000 0.00664 0.04135 2.74E+05 6.50E+01 + 9 -0.01464 0.05333 1.98425 0.00000 0.00631 0.04531 8.10E+04 2.72E+01 + 10 -0.01648 0.05653 1.99065 0.00000 0.00602 0.04910 2.76E+04 1.31E+01 + 11 -0.01832 0.05954 1.99700 0.00000 0.00578 0.05273 1.04E+04 6.92E+00 + 12 -0.02014 0.06240 2.00318 0.00000 0.00556 0.05622 4.29E+03 4.26E+00 + 13 -0.02195 0.06512 2.00909 0.00000 0.00537 0.05959 1.89E+03 3.28E+00 + 14 -0.02373 0.06773 2.01463 0.00000 0.00517 0.06285 8.78E+02 2.98E+00 + 15 -0.02548 0.07024 2.01975 0.00000 0.00496 0.06602 4.25E+02 3.29E+00 + 16 -0.02719 0.07265 2.02440 0.00000 0.00474 0.06911 2.14E+02 4.00E+00 + 17 -0.02884 0.07498 2.02861 0.00000 0.00451 0.07214 1.12E+02 5.92E+00 + 18 -0.03044 0.07724 2.03244 0.00000 0.00427 0.07510 6.49E+01 1.08E+01 + 19 -0.03197 0.07942 2.03598 0.00000 0.00405 0.07801 5.61E+01 2.90E+01 + 20 -0.03345 0.08154 2.03935 0.00000 0.00386 0.08085 1.38E+02 1.24E+02 + 21 -0.03487 0.08359 2.04264 0.00000 0.00373 0.08364 1.02E+03 1.01E+03 + 22 -0.03624 0.08558 2.04594 0.00000 0.00365 0.08637 2.47E+04 2.47E+04 + 23 -0.03756 0.08751 2.04927 0.00000 0.00363 0.08905 2.95E+06 2.95E+06 + 24 -0.03884 0.08939 2.05264 0.00000 0.00367 0.09167 1.80E+10 1.80E+10 + 25 -0.04007 0.09122 2.05605 0.00000 0.00374 0.09424 0.00E+00 0.00E+00 + +----------------------------------------------------------------------- + Toroidal Plane: Phi = 180/Nfp +----------------------------------------------------------------------- + + 2 -0.00181 0.03469 0.80051 0.00000 0.00596 -0.01137 + 3 -0.00363 0.04917 0.79799 0.00000 0.00739 -0.01731 + 4 -0.00546 0.06043 0.79427 0.00000 0.00957 -0.02228 + 5 -0.00728 0.07005 0.79000 0.00000 0.01159 -0.02648 + 6 -0.00912 0.07863 0.78542 0.00000 0.01348 -0.03011 + 7 -0.01095 0.08650 0.78064 0.00000 0.01525 -0.03335 + 8 -0.01280 0.09383 0.77572 0.00000 0.01694 -0.03630 + 9 -0.01464 0.10075 0.77074 0.00000 0.01855 -0.03904 + 10 -0.01648 0.10732 0.76578 0.00000 0.02008 -0.04160 + 11 -0.01832 0.11362 0.76090 0.00000 0.02155 -0.04400 + 12 -0.02014 0.11967 0.75618 0.00000 0.02295 -0.04626 + 13 -0.02195 0.12550 0.75172 0.00000 0.02430 -0.04838 + 14 -0.02373 0.13112 0.74758 0.00000 0.02561 -0.05035 + 15 -0.02548 0.13656 0.74385 0.00000 0.02688 -0.05217 + 16 -0.02719 0.14182 0.74057 0.00000 0.02813 -0.05385 + 17 -0.02884 0.14690 0.73776 0.00000 0.02937 -0.05537 + 18 -0.03044 0.15182 0.73541 0.00000 0.03059 -0.05675 + 19 -0.03197 0.15659 0.73348 0.00000 0.03180 -0.05799 + 20 -0.03345 0.16122 0.73189 0.00000 0.03299 -0.05911 + 21 -0.03487 0.16573 0.73055 0.00000 0.03416 -0.06012 + 22 -0.03624 0.17013 0.72938 0.00000 0.03531 -0.06106 + 23 -0.03756 0.17443 0.72830 0.00000 0.03644 -0.06192 + 24 -0.03884 0.17865 0.72727 0.00000 0.03754 -0.06272 + 25 -0.04007 0.18278 0.72625 0.00000 0.03859 -0.06346 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 7.767433E+01 2.462750E+02 + bpol**2 /(2 mu0) = 2.438839E+03 7.732606E+03 + btor**2/(2 mu0) = 3.788246E+04 1.201105E+05 + b**2/(2 mu0) = 4.032130E+04 1.278431E+05 + EKIN (3/2p) = 1.165115E+02 3.694125E+02 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 7.8419E-01 -0.0000E+00 + 1 -2.9565E-02 2.6693E-02 + 2 8.5573E-04 -8.9286E-04 + 3 -1.6359E-05 1.7025E-05 + 4 -5.9587E-08 3.1228E-07 + + From volume averages over plasma, betas are + beta total = 0.001926 + beta poloidal = 0.031849 + beta toroidal = 0.002050 + + R * Btor-vac = -0.451408 [Wb/M] + Peak Beta = 0.003283 + Beta-star = 0.002386 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 0.854517 [M] + RG (Geometric) = 0.738269 [M] + RL (Vol/2*pi*Area-Lao) = 0.783437 [M] + Poloidal Field Energy + Normalization Ratio = 0.142553 (Lao/Hirshman) + + s3 = -0.715574 + lsubi = 0.843902 + musubi = 1.444398 + betai = 0.026877 + lambda = 0.448829 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -0.157459 -0.090728 + s1 = -1.417846 -1.263690 -1.323587 + s2 = 1.133176 0.979020 1.038917 + betai (Mui + s1) = 0.026552 0.180708 0.120812 + lambda (s1/2 + s2) = 0.424253 0.347175 0.377124 + 1st Shafr'v relation = -0.086900 -0.086900 -0.086900 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = 0.021544 0.182395 0.114227 + (Betai + Li + Mui)/(2*s2) - 1 + + + EXECUTION TERMINATED NORMALLY + + FILE : cth_like_fixed_bdy + NUMBER OF JACOBIAN RESETS = 0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_fixed_bdy_nzeta_37 b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_fixed_bdy_nzeta_37 new file mode 100644 index 000000000..99884f6af --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_fixed_bdy_nzeta_37 @@ -0,0 +1,309 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 25 16 37 5 4 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 5 0.000E+00 1.000E+00 -3.500E-02 4.323E+04 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 1 25000 25 200 1 1.00E-06 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + Pressure profile factor: 4.3229E+02 (multiplier for pressure) + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'two_power' + ----------------------------------- + 1.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + TOROIDAL CURRENT DENSITY (*V') COEFFICIENTS ac (EXPANSION IN NORMALIZED RADIUS): + PCURR parameterization type is 'two_power' + -------------------------------------- + 1.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 7.8091E-01 0.0000E+00 0.0000E+00 0.0000E+00 7.8604E-01 0.0000E+00 0.0000E+00 0.0000E+00 + 1 0 -4.6152E-02 0.0000E+00 0.0000E+00 4.4922E-02 -3.0298E-02 0.0000E+00 0.0000E+00 2.7316E-02 + 2 0 2.5347E-03 0.0000E+00 0.0000E+00 -1.5796E-03 9.1526E-04 0.0000E+00 0.0000E+00 -9.3710E-04 + 3 0 -2.9457E-04 0.0000E+00 0.0000E+00 1.1010E-04 -1.9196E-05 0.0000E+00 0.0000E+00 1.7418E-05 + 4 0 4.8763E-05 0.0000E+00 0.0000E+00 -3.4152E-05 1.4593E-06 0.0000E+00 0.0000E+00 -5.9122E-07 + -4 1 1.1099E-05 0.0000E+00 0.0000E+00 8.8624E-06 + -3 1 -6.6976E-05 0.0000E+00 0.0000E+00 -7.6199E-06 + -2 1 3.4481E-04 0.0000E+00 0.0000E+00 -1.0239E-04 + -1 1 -5.6609E-03 0.0000E+00 0.0000E+00 -3.0818E-03 + 0 1 1.3144E-01 0.0000E+00 0.0000E+00 1.6460E-01 + 1 1 -3.9386E-02 0.0000E+00 0.0000E+00 3.0339E-02 + 2 1 4.8887E-03 0.0000E+00 0.0000E+00 -4.5159E-03 + 3 1 -4.3812E-04 0.0000E+00 0.0000E+00 3.2239E-04 + 4 1 4.8165E-05 0.0000E+00 0.0000E+00 -3.4874E-05 + -4 2 -1.5301E-06 0.0000E+00 0.0000E+00 -1.2844E-06 + -3 2 2.3541E-05 0.0000E+00 0.0000E+00 2.9307E-05 + -2 2 -8.8303E-05 0.0000E+00 0.0000E+00 -1.9308E-04 + -1 2 1.4606E-04 0.0000E+00 0.0000E+00 9.1797E-04 + 0 2 1.4717E-03 0.0000E+00 0.0000E+00 -2.7225E-03 + 1 2 -3.2061E-03 0.0000E+00 0.0000E+00 3.5566E-03 + 2 2 2.2894E-03 0.0000E+00 0.0000E+00 -2.0530E-03 + 3 2 -3.1917E-04 0.0000E+00 0.0000E+00 3.2876E-04 + 4 2 2.6014E-05 0.0000E+00 0.0000E+00 -3.5793E-05 + -4 3 -2.2227E-06 0.0000E+00 0.0000E+00 3.8311E-06 + -3 3 8.9318E-07 0.0000E+00 0.0000E+00 -3.2473E-06 + -2 3 -1.8693E-05 0.0000E+00 0.0000E+00 -3.7785E-06 + -1 3 -1.0322E-04 0.0000E+00 0.0000E+00 -7.4305E-07 + 0 3 -1.0591E-04 0.0000E+00 0.0000E+00 1.2021E-04 + 1 3 -3.7046E-05 0.0000E+00 0.0000E+00 9.7059E-05 + 2 3 3.8495E-04 0.0000E+00 0.0000E+00 -3.0556E-04 + 3 3 -8.7346E-05 0.0000E+00 0.0000E+00 7.1282E-05 + 4 3 1.7056E-05 0.0000E+00 0.0000E+00 -1.1419E-05 + -4 4 -4.1161E-06 0.0000E+00 0.0000E+00 2.7911E-06 + -3 4 -3.6701E-06 0.0000E+00 0.0000E+00 -1.0123E-06 + -2 4 3.2766E-06 0.0000E+00 0.0000E+00 1.3374E-05 + -1 4 -5.4990E-05 0.0000E+00 0.0000E+00 -6.5630E-05 + 0 4 6.1104E-04 0.0000E+00 0.0000E+00 4.0853E-04 + 1 4 1.5775E-04 0.0000E+00 0.0000E+00 -1.1357E-03 + 2 4 2.3894E-04 0.0000E+00 0.0000E+00 4.5350E-04 + 3 4 -7.4586E-05 0.0000E+00 0.0000E+00 -5.0700E-05 + 4 4 1.0768E-05 0.0000E+00 0.0000E+00 5.2240E-06 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 25 NO. FOURIER MODES = 41 FTOLV = 1.000E-06 NITER = 25000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 2.41E-01 1.82E-02 1.59E-03 1.19E-03 2.39E-01 1.74E-02 5.32E-02 2.41E-03 1.98E-04 3.71E-07 1.26E-06 2.41E-03 1.98E-04 1.27E-02 7.00E-01 7.566E-01 5.3446E-02 1.838E-03 1.027 + 120 9.35E-07 3.11E-07 4.07E-05 1.82E-04 4.17E-05 1.82E-04 2.61E-07 5.32E-10 3.18E-10 2.59E-08 6.09E-07 2.64E-08 6.08E-07 1.59E-09 7.00E-01 7.555E-01 5.0572E-02 1.926E-03 1.031 + + MHD Energy = 5.057163E-02 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 -3.37E-03 -0.0000E+00 1.2428E+00 1.936E+06 1.548E+06 8.758E+00 -2.790E+01 1.000 4.323E+02 0.000E+00 -4.613E-01 -7.143E+05 3.310E-01 + 4.17E-02 2.88E-03 -1.4583E-03 1.2453E+00 1.909E+06 1.542E+06 8.789E+00 2.815E+00 1.001 4.323E+02 -6.292E-04 -4.606E-01 -7.116E+05 3.298E-01 + 8.33E-02 9.13E-03 -2.9167E-03 1.2483E+00 1.883E+06 1.537E+06 8.820E+00 3.353E+01 1.002 4.323E+02 -1.258E-03 -4.598E-01 -7.089E+05 3.287E-01 + 1.25E-01 1.05E-02 -4.3750E-03 1.2518E+00 1.875E+06 1.531E+06 8.852E+00 1.591E+02 1.003 4.321E+02 -1.887E-03 -4.590E-01 -7.061E+05 3.275E-01 + 1.67E-01 6.31E-03 -5.8333E-03 1.2554E+00 1.886E+06 1.524E+06 8.883E+00 4.908E+02 1.005 4.316E+02 -2.516E-03 -4.582E-01 -7.028E+05 3.263E-01 + 2.08E-01 1.53E-03 -7.2917E-03 1.2586E+00 1.893E+06 1.514E+06 8.914E+00 1.182E+03 1.007 4.304E+02 -3.143E-03 -4.575E-01 -6.988E+05 3.252E-01 + 2.50E-01 1.95E-04 -8.7500E-03 1.2613E+00 1.877E+06 1.500E+06 8.944E+00 2.423E+03 1.009 4.278E+02 -3.768E-03 -4.567E-01 -6.922E+05 3.242E-01 + 2.92E-01 -1.72E-04 -1.0208E-02 1.2630E+00 1.840E+06 1.478E+06 8.973E+00 4.425E+03 1.011 4.228E+02 -4.388E-03 -4.559E-01 -6.821E+05 3.231E-01 + 3.33E-01 -3.10E-05 -1.1667E-02 1.2631E+00 1.777E+06 1.444E+06 9.003E+00 7.393E+03 1.014 4.142E+02 -4.997E-03 -4.551E-01 -6.659E+05 3.220E-01 + 3.75E-01 1.54E-03 -1.3125E-02 1.2609E+00 1.678E+06 1.392E+06 9.032E+00 1.147E+04 1.017 4.004E+02 -5.591E-03 -4.544E-01 -6.419E+05 3.210E-01 + 4.17E-01 3.38E-03 -1.4583E-02 1.2554E+00 1.538E+06 1.317E+06 9.059E+00 1.665E+04 1.020 3.799E+02 -6.160E-03 -4.537E-01 -6.070E+05 3.201E-01 + 4.58E-01 4.15E-03 -1.6042E-02 1.2458E+00 1.359E+06 1.215E+06 9.084E+00 2.269E+04 1.023 3.512E+02 -6.693E-03 -4.531E-01 -5.598E+05 3.192E-01 + 5.00E-01 2.26E-03 -1.7500E-02 1.2311E+00 1.144E+06 1.082E+06 9.105E+00 2.897E+04 1.027 3.136E+02 -7.178E-03 -4.526E-01 -4.981E+05 3.184E-01 + 5.42E-01 -2.31E-03 -1.8958E-02 1.2106E+00 9.032E+05 9.209E+05 9.120E+00 3.450E+04 1.030 2.673E+02 -7.601E-03 -4.522E-01 -4.234E+05 3.179E-01 + 5.83E-01 -8.21E-03 -2.0417E-02 1.1840E+00 6.490E+05 7.373E+05 9.129E+00 3.796E+04 1.034 2.145E+02 -7.952E-03 -4.518E-01 -3.382E+05 3.175E-01 + 6.25E-01 -1.27E-02 -2.1875E-02 1.1517E+00 4.050E+05 5.452E+05 9.131E+00 3.806E+04 1.038 1.590E+02 -8.224E-03 -4.516E-01 -2.497E+05 3.173E-01 + 6.67E-01 -1.49E-02 -2.3333E-02 1.1147E+00 2.030E+05 3.631E+05 9.126E+00 3.407E+04 1.042 1.064E+02 -8.417E-03 -4.515E-01 -1.656E+05 3.173E-01 + 7.08E-01 -1.89E-02 -2.4792E-02 1.0747E+00 6.866E+04 2.105E+05 9.114E+00 2.647E+04 1.046 6.228E+01 -8.538E-03 -4.514E-01 -9.583E+04 3.175E-01 + 7.50E-01 -3.94E-02 -2.6250E-02 1.0338E+00 5.719E+03 1.012E+05 9.099E+00 1.710E+04 1.050 3.051E+01 -8.604E-03 -4.514E-01 -4.565E+04 3.179E-01 + 7.92E-01 -7.07E-02 -2.7708E-02 9.9393E-01 -9.730E+03 3.753E+04 9.081E+00 8.623E+03 1.055 1.175E+01 -8.633E-03 -4.514E-01 -1.701E+04 3.183E-01 + 8.33E-01 -2.69E-01 -2.9167E-02 9.5640E-01 -1.910E+03 9.572E+03 9.062E+00 3.057E+03 1.059 3.234E+00 -8.643E-03 -4.514E-01 -4.130E+03 3.187E-01 + 8.75E-01 -8.47E-01 -3.0625E-02 9.2188E-01 1.132E+04 1.376E+03 9.043E+00 6.348E+02 1.064 5.423E-01 -8.646E-03 -4.514E-01 -9.025E+02 3.192E-01 + 9.17E-01 -9.93E-01 -3.2083E-02 8.9035E-01 1.803E+04 7.614E+01 9.023E+00 5.368E+01 1.069 4.024E-02 -8.646E-03 -4.514E-01 -1.474E+02 3.197E-01 + 9.58E-01 -1.00E+00 -3.3542E-02 8.6161E-01 3.940E+03 -1.613E+01 9.003E+00 7.549E-01 1.075 5.505E-04 -8.646E-03 -4.514E-01 -2.617E+02 3.202E-01 + 1.00E+00 -1.01E+00 -3.5000E-02 8.3426E-01 -1.021E+04 -1.088E+02 8.983E+00 -5.217E+01 1.081 -5.504E-04 -8.646E-03 -4.514E-01 -3.760E+02 3.208E-01 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.287415 + BMAX(u=0) = 0.680628 + BMIN(u=pi) = 0.686789 + BMAX(u=pi) = 0.713119 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 5.485830 + Mean Elongation = 2.013607 + Plasma Volume = 0.315397 [M**3] + Cross Sectional Area = 0.064073 [M**2] + Normal Surface Area = 4.808799 [M**2] + Poloidal Circumference= 0.948115 [M] + Major Radius = 0.783437 [M] (from Volume and Cross Section) + Minor Radius = 0.142811 [M] (from Cross Section) + Minimum (inboard) R = 0.647045 [M] + Maximum (outboard) R = 1.020066 [M] + Maximum height Z = 0.216330 [M] + Waist (v = 0) in R = 0.182449 [M] + Full Height(v = 0) = 0.375124 [M] + Waist (v = pi) in R = 0.365032 [M] + Full Height(v = pi) = 0.259206 [M] + Toroidal Flux = -0.035000 [Wb] + Toroidal Current = 0.043229 [MA] + RBtor(s=1) = -0.451408 [T-m] + RBtor(s=0) = -0.461330 [T-m] + Volume Average B = 0.566838 [T] + Ion Larmor Radius = 0.005645 [M] X Ti(keV)**0.5 + / = 3476.743913 (Vol. Averaged) + / = 24.752190 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 -0.00181 0.01889 1.94946 0.00000 0.00532 0.01274 5.48E+12 1.42E+11 + 3 -0.00363 0.02673 1.95183 0.00000 0.00691 0.01851 1.86E+10 1.78E+07 + 4 -0.00546 0.03273 1.95580 0.00000 0.00737 0.02360 5.45E+08 3.14E+05 + 5 -0.00728 0.03779 1.96060 0.00000 0.00743 0.02836 4.23E+07 1.25E+04 + 6 -0.00912 0.04224 1.96597 0.00000 0.00726 0.03288 5.73E+06 9.87E+02 + 7 -0.01095 0.04625 1.97179 0.00000 0.00697 0.03721 1.11E+06 1.80E+02 + 8 -0.01280 0.04992 1.97792 0.00000 0.00664 0.04135 2.74E+05 6.50E+01 + 9 -0.01464 0.05333 1.98425 0.00000 0.00631 0.04531 8.10E+04 2.72E+01 + 10 -0.01648 0.05653 1.99065 0.00000 0.00602 0.04910 2.76E+04 1.31E+01 + 11 -0.01832 0.05954 1.99700 0.00000 0.00578 0.05273 1.04E+04 6.92E+00 + 12 -0.02014 0.06240 2.00318 0.00000 0.00556 0.05622 4.29E+03 4.26E+00 + 13 -0.02195 0.06512 2.00909 0.00000 0.00537 0.05959 1.89E+03 3.28E+00 + 14 -0.02373 0.06773 2.01463 0.00000 0.00517 0.06285 8.78E+02 2.98E+00 + 15 -0.02548 0.07024 2.01975 0.00000 0.00496 0.06602 4.25E+02 3.29E+00 + 16 -0.02719 0.07265 2.02440 0.00000 0.00474 0.06911 2.14E+02 4.00E+00 + 17 -0.02884 0.07498 2.02861 0.00000 0.00451 0.07214 1.12E+02 5.92E+00 + 18 -0.03044 0.07724 2.03244 0.00000 0.00427 0.07510 6.49E+01 1.08E+01 + 19 -0.03197 0.07942 2.03598 0.00000 0.00405 0.07801 5.61E+01 2.90E+01 + 20 -0.03345 0.08154 2.03935 0.00000 0.00386 0.08085 1.38E+02 1.24E+02 + 21 -0.03487 0.08359 2.04264 0.00000 0.00373 0.08364 1.02E+03 1.01E+03 + 22 -0.03624 0.08558 2.04594 0.00000 0.00365 0.08637 2.47E+04 2.47E+04 + 23 -0.03756 0.08751 2.04927 0.00000 0.00363 0.08905 2.95E+06 2.95E+06 + 24 -0.03884 0.08939 2.05264 0.00000 0.00367 0.09167 1.80E+10 1.80E+10 + 25 -0.04007 0.09122 2.05605 0.00000 0.00374 0.09424 0.00E+00 0.00E+00 + +----------------------------------------------------------------------- + Toroidal Plane: Phi = 180/Nfp +----------------------------------------------------------------------- + + 2 -0.00181 0.03465 0.80211 0.00000 0.01464 -0.01132 + 3 -0.00363 0.04912 0.79960 0.00000 0.01614 -0.01724 + 4 -0.00546 0.06036 0.79589 0.00000 0.01837 -0.02219 + 5 -0.00728 0.06997 0.79164 0.00000 0.02046 -0.02637 + 6 -0.00912 0.07854 0.78708 0.00000 0.02242 -0.02999 + 7 -0.01095 0.08640 0.78232 0.00000 0.02428 -0.03321 + 8 -0.01280 0.09372 0.77743 0.00000 0.02606 -0.03614 + 9 -0.01464 0.10062 0.77247 0.00000 0.02776 -0.03887 + 10 -0.01648 0.10719 0.76753 0.00000 0.02939 -0.04141 + 11 -0.01832 0.11348 0.76267 0.00000 0.03094 -0.04380 + 12 -0.02014 0.11952 0.75798 0.00000 0.03244 -0.04605 + 13 -0.02195 0.12534 0.75354 0.00000 0.03387 -0.04815 + 14 -0.02373 0.13095 0.74942 0.00000 0.03525 -0.05011 + 15 -0.02548 0.13638 0.74571 0.00000 0.03659 -0.05193 + 16 -0.02719 0.14163 0.74245 0.00000 0.03790 -0.05359 + 17 -0.02884 0.14670 0.73965 0.00000 0.03917 -0.05511 + 18 -0.03044 0.15162 0.73732 0.00000 0.04042 -0.05647 + 19 -0.03197 0.15638 0.73540 0.00000 0.04164 -0.05770 + 20 -0.03345 0.16100 0.73382 0.00000 0.04283 -0.05881 + 21 -0.03487 0.16550 0.73249 0.00000 0.04399 -0.05982 + 22 -0.03624 0.16989 0.73134 0.00000 0.04512 -0.06075 + 23 -0.03756 0.17418 0.73027 0.00000 0.04623 -0.06161 + 24 -0.03884 0.17839 0.72924 0.00000 0.04730 -0.06240 + 25 -0.04007 0.18252 0.72824 0.00000 0.04833 -0.06313 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 7.767433E+01 2.462750E+02 + bpol**2 /(2 mu0) = 2.438839E+03 7.732606E+03 + btor**2/(2 mu0) = 3.788246E+04 1.201105E+05 + b**2/(2 mu0) = 4.032130E+04 1.278431E+05 + EKIN (3/2p) = 1.165115E+02 3.694125E+02 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 7.8419E-01 -0.0000E+00 + 1 -2.9565E-02 2.6693E-02 + 2 8.5573E-04 -8.9286E-04 + 3 -1.6359E-05 1.7025E-05 + 4 -5.9587E-08 3.1228E-07 + + From volume averages over plasma, betas are + beta total = 0.001926 + beta poloidal = 0.031849 + beta toroidal = 0.002050 + + R * Btor-vac = -0.451408 [Wb/M] + Peak Beta = 0.003283 + Beta-star = 0.002386 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 0.854517 [M] + RG (Geometric) = 0.738269 [M] + RL (Vol/2*pi*Area-Lao) = 0.783437 [M] + Poloidal Field Energy + Normalization Ratio = 0.142553 (Lao/Hirshman) + + s3 = -0.715574 + lsubi = 0.843902 + musubi = 1.444398 + betai = 0.026877 + lambda = 0.448829 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -0.157459 -0.090728 + s1 = -1.417846 -1.263690 -1.323587 + s2 = 1.133176 0.979020 1.038917 + betai (Mui + s1) = 0.026552 0.180708 0.120812 + lambda (s1/2 + s2) = 0.424253 0.347175 0.377124 + 1st Shafr'v relation = -0.086900 -0.086900 -0.086900 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = 0.021544 0.182395 0.114227 + (Betai + Li + Mui)/(2*s2) - 1 + + + EXECUTION TERMINATED NORMALLY + + FILE : cth_like_fixed_bdy_nzeta_37 + NUMBER OF JACOBIAN RESETS = 0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_free_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_free_bdy new file mode 100644 index 000000000..4e6190466 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.cth_like_free_bdy @@ -0,0 +1,457 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + + VACUUM FIELD PARAMETERS: + ------------------------ + nr-grid nz-grid np-grid rmin rmax zmin zmax input-file + 101 101 36 0.450 1.050 -0.300 0.300 mgrid_cth_like.nc + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 15 16 36 5 4 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 5 0.000E+00 1.000E+00 -3.500E-02 4.323E+04 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 1 2500 15 100 9 1.00E-10 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + EXTERNAL CURRENTS + ----------------- + circuit_0 circuit_1 + 4.7000E+03 1.0000E+03 + + Pressure profile factor: 4.3229E+02 (multiplier for pressure) + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'two_power' + ----------------------------------- + 1.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + TOROIDAL CURRENT DENSITY (*V') COEFFICIENTS ac (EXPANSION IN NORMALIZED RADIUS): + PCURR parameterization type is 'two_power' + -------------------------------------- + 1.000E+00 5.000E+00 1.000E+01 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 7.8091E-01 0.0000E+00 0.0000E+00 0.0000E+00 7.8604E-01 0.0000E+00 0.0000E+00 0.0000E+00 + 1 0 -4.6152E-02 0.0000E+00 0.0000E+00 4.4922E-02 -3.0298E-02 0.0000E+00 0.0000E+00 2.7316E-02 + 2 0 2.5347E-03 0.0000E+00 0.0000E+00 -1.5796E-03 9.1526E-04 0.0000E+00 0.0000E+00 -9.3710E-04 + 3 0 -2.9457E-04 0.0000E+00 0.0000E+00 1.1010E-04 -1.9196E-05 0.0000E+00 0.0000E+00 1.7418E-05 + 4 0 4.8763E-05 0.0000E+00 0.0000E+00 -3.4152E-05 1.4593E-06 0.0000E+00 0.0000E+00 -5.9122E-07 + -4 1 1.1099E-05 0.0000E+00 0.0000E+00 8.8624E-06 + -3 1 -6.6976E-05 0.0000E+00 0.0000E+00 -7.6199E-06 + -2 1 3.4481E-04 0.0000E+00 0.0000E+00 -1.0239E-04 + -1 1 -5.6609E-03 0.0000E+00 0.0000E+00 -3.0818E-03 + 0 1 1.3144E-01 0.0000E+00 0.0000E+00 1.6460E-01 + 1 1 -3.9386E-02 0.0000E+00 0.0000E+00 3.0339E-02 + 2 1 4.8887E-03 0.0000E+00 0.0000E+00 -4.5159E-03 + 3 1 -4.3812E-04 0.0000E+00 0.0000E+00 3.2239E-04 + 4 1 4.8165E-05 0.0000E+00 0.0000E+00 -3.4874E-05 + -4 2 -1.5301E-06 0.0000E+00 0.0000E+00 -1.2844E-06 + -3 2 2.3541E-05 0.0000E+00 0.0000E+00 2.9307E-05 + -2 2 -8.8303E-05 0.0000E+00 0.0000E+00 -1.9308E-04 + -1 2 1.4606E-04 0.0000E+00 0.0000E+00 9.1797E-04 + 0 2 1.4717E-03 0.0000E+00 0.0000E+00 -2.7225E-03 + 1 2 -3.2061E-03 0.0000E+00 0.0000E+00 3.5566E-03 + 2 2 2.2894E-03 0.0000E+00 0.0000E+00 -2.0530E-03 + 3 2 -3.1917E-04 0.0000E+00 0.0000E+00 3.2876E-04 + 4 2 2.6014E-05 0.0000E+00 0.0000E+00 -3.5793E-05 + -4 3 -2.2227E-06 0.0000E+00 0.0000E+00 3.8311E-06 + -3 3 8.9318E-07 0.0000E+00 0.0000E+00 -3.2473E-06 + -2 3 -1.8693E-05 0.0000E+00 0.0000E+00 -3.7785E-06 + -1 3 -1.0322E-04 0.0000E+00 0.0000E+00 -7.4305E-07 + 0 3 -1.0591E-04 0.0000E+00 0.0000E+00 1.2021E-04 + 1 3 -3.7046E-05 0.0000E+00 0.0000E+00 9.7059E-05 + 2 3 3.8495E-04 0.0000E+00 0.0000E+00 -3.0556E-04 + 3 3 -8.7346E-05 0.0000E+00 0.0000E+00 7.1282E-05 + 4 3 1.7056E-05 0.0000E+00 0.0000E+00 -1.1419E-05 + -4 4 -4.1161E-06 0.0000E+00 0.0000E+00 2.7911E-06 + -3 4 -3.6701E-06 0.0000E+00 0.0000E+00 -1.0123E-06 + -2 4 3.2766E-06 0.0000E+00 0.0000E+00 1.3374E-05 + -1 4 -5.4990E-05 0.0000E+00 0.0000E+00 -6.5630E-05 + 0 4 6.1104E-04 0.0000E+00 0.0000E+00 4.0853E-04 + 1 4 1.5775E-04 0.0000E+00 0.0000E+00 -1.1357E-03 + 2 4 2.3894E-04 0.0000E+00 0.0000E+00 4.5350E-04 + 3 4 -7.4586E-05 0.0000E+00 0.0000E+00 -5.0700E-05 + 4 4 1.0768E-05 0.0000E+00 0.0000E+00 5.2240E-06 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 15 NO. FOURIER MODES = 41 FTOLV = 1.000E-10 NITER = 2500 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA PHIEDGE DEL-BSQ FEDGE + + 1 2.33E-01 1.72E-02 1.21E-03 9.07E-04 2.32E-01 1.66E-02 5.22E-02 2.45E-03 1.97E-04 2.78E-07 9.48E-07 2.45E-03 1.97E-04 1.30E-02 7.00E-01 7.566E-01 5.3447E-02 1.838E-03 3.500E-02 0.000 0.00E+00 + + VACUUM PRESSURE TURNED ON AT 54 ITERATIONS + + 100 1.02E-05 4.79E-06 5.44E-05 2.24E-04 5.55E-05 2.17E-04 8.89E-07 2.19E-08 1.32E-08 1.08E-07 2.21E-06 1.20E-07 2.10E-06 1.52E-08 7.00E-01 7.454E-01 5.0585E-02 1.893E-03 3.500E-02 0.002 2.08E-05 + 200 2.86E-08 4.84E-09 6.82E-05 2.71E-04 6.87E-05 2.71E-04 2.53E-09 3.76E-11 7.77E-12 1.44E-07 2.20E-06 1.44E-07 2.20E-06 5.11E-11 7.00E-01 7.445E-01 5.0580E-02 1.876E-03 3.500E-02 0.001 2.79E-07 + 300 3.26E-09 5.39E-10 7.69E-05 3.01E-04 7.70E-05 3.01E-04 6.84E-10 1.37E-12 6.48E-13 1.65E-07 2.03E-06 1.65E-07 2.04E-06 2.81E-12 7.00E-01 7.444E-01 5.0579E-02 1.874E-03 3.500E-02 0.001 3.67E-08 + 400 3.93E-10 1.16E-10 8.16E-05 3.18E-04 8.15E-05 3.18E-04 1.68E-10 2.04E-13 1.40E-13 1.83E-07 1.89E-06 1.83E-07 1.89E-06 4.18E-13 7.00E-01 7.444E-01 5.0579E-02 1.874E-03 3.500E-02 0.001 4.28E-09 + 489 9.99E-11 2.53E-11 8.52E-05 3.34E-04 8.52E-05 3.34E-04 3.99E-11 2.59E-14 2.28E-14 2.02E-07 1.80E-06 2.02E-07 1.80E-06 7.92E-14 7.00E-01 7.444E-01 5.0579E-02 1.874E-03 3.500E-02 0.001 9.82E-10 + + MHD Energy = 5.057896E-02 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 -1.38E-02 -0.0000E+00 1.2659E+00 2.067E+06 1.590E+06 8.530E+00 -2.407E+02 1.000 4.323E+02 0.000E+00 -4.614E-01 -7.337E+05 3.399E-01 + 7.14E-02 -8.54E-03 -2.5000E-03 1.2673E+00 2.039E+06 1.582E+06 8.569E+00 2.431E+01 1.001 4.323E+02 -1.079E-03 -4.600E-01 -7.299E+05 3.383E-01 + 1.43E-01 -3.27E-03 -5.0000E-03 1.2707E+00 2.011E+06 1.573E+06 8.608E+00 2.893E+02 1.004 4.319E+02 -2.157E-03 -4.587E-01 -7.260E+05 3.368E-01 + 2.14E-01 -5.24E-04 -7.5000E-03 1.2763E+00 1.982E+06 1.558E+06 8.658E+00 1.368E+03 1.006 4.298E+02 -3.232E-03 -4.573E-01 -7.187E+05 3.348E-01 + 2.86E-01 1.20E-04 -1.0000E-02 1.2811E+00 1.926E+06 1.525E+06 8.714E+00 4.161E+03 1.009 4.229E+02 -4.297E-03 -4.559E-01 -7.033E+05 3.327E-01 + 3.57E-01 2.20E-04 -1.2500E-02 1.2816E+00 1.803E+06 1.455E+06 8.771E+00 9.674E+03 1.012 4.056E+02 -5.334E-03 -4.546E-01 -6.711E+05 3.306E-01 + 4.29E-01 3.82E-05 -1.5000E-02 1.2739E+00 1.571E+06 1.324E+06 8.826E+00 1.837E+04 1.016 3.705E+02 -6.307E-03 -4.535E-01 -6.102E+05 3.285E-01 + 5.00E-01 -3.15E-04 -1.7500E-02 1.2531E+00 1.208E+06 1.108E+06 8.871E+00 2.892E+04 1.021 3.114E+02 -7.163E-03 -4.525E-01 -5.102E+05 3.268E-01 + 5.71E-01 -8.83E-04 -2.0000E-02 1.2157E+00 7.543E+05 8.104E+05 8.900E+00 3.702E+04 1.026 2.290E+02 -7.841E-03 -4.518E-01 -3.720E+05 3.257E-01 + 6.43E-01 -1.53E-03 -2.2500E-02 1.1616E+00 3.274E+05 4.779E+05 8.907E+00 3.652E+04 1.032 1.371E+02 -8.297E-03 -4.514E-01 -2.185E+05 3.252E-01 + 7.14E-01 -3.50E-03 -2.5000E-02 1.0962E+00 6.392E+04 2.005E+05 8.894E+00 2.506E+04 1.038 6.012E+01 -8.538E-03 -4.513E-01 -9.104E+04 3.254E-01 + 7.86E-01 -1.76E-02 -2.7500E-02 1.0287E+00 -1.042E+04 4.835E+04 8.869E+00 9.919E+03 1.045 1.639E+01 -8.626E-03 -4.512E-01 -2.173E+04 3.260E-01 + 8.57E-01 -1.12E-01 -3.0000E-02 9.6673E-01 -3.524E+03 4.448E+03 8.839E+00 1.559E+03 1.053 2.048E+00 -8.644E-03 -4.512E-01 -1.975E+03 3.267E-01 + 9.29E-01 -9.35E-01 -3.2500E-02 9.1332E-01 1.251E+03 5.550E+01 8.809E+00 3.966E+01 1.062 4.959E-02 -8.646E-03 -4.512E-01 -3.744E+01 3.275E-01 + 1.00E+00 -1.76E+00 -3.5000E-02 8.6421E-01 6.060E+03 -4.367E+03 8.779E+00 -1.480E+03 1.072 -4.957E-02 -8.646E-03 -4.512E-01 1.900E+03 3.283E-01 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.292872 + BMAX(u=0) = 0.688198 + BMIN(u=pi) = 0.707981 + BMAX(u=pi) = 0.717817 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 5.434974 + Mean Elongation = 2.061603 + Plasma Volume = 0.307273 [M**3] + Cross Sectional Area = 0.063360 [M**2] + Normal Surface Area = 4.738391 [M**2] + Poloidal Circumference= 0.945807 [M] + Major Radius = 0.771845 [M] (from Volume and Cross Section) + Minor Radius = 0.142014 [M] (from Cross Section) + Minimum (inboard) R = 0.633073 [M] + Maximum (outboard) R = 1.010580 [M] + Maximum height Z = 0.216920 [M] + Waist (v = 0) in R = 0.180851 [M] + Full Height(v = 0) = 0.375914 [M] + Waist (v = pi) in R = 0.374047 [M] + Full Height(v = pi) = 0.256462 [M] + Toroidal Flux = -0.035000 [Wb] + Toroidal Current = 0.043229 [MA] + RBtor(s=1) = -0.451243 [T-m] + RBtor(s=0) = -0.461425 [T-m] + Volume Average B = 0.574308 [T] + Ion Larmor Radius = 0.005572 [M] X Ti(keV)**0.5 + / = 3487.077948 (Vol. Averaged) + / = 20.380376 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 -0.00317 0.02441 1.99163 0.00000 0.00039 0.02555 4.36E+10 1.27E+09 + 3 -0.00634 0.03452 1.99688 0.00000 0.00246 0.03596 1.46E+08 1.23E+05 + 4 -0.00952 0.04225 2.00567 0.00000 0.00387 0.04406 4.23E+06 1.09E+03 + 5 -0.01272 0.04873 2.01636 0.00000 0.00518 0.05081 3.25E+05 9.97E+01 + 6 -0.01593 0.05440 2.02791 0.00000 0.00641 0.05670 4.32E+04 2.10E+01 + 7 -0.01913 0.05951 2.03940 0.00000 0.00753 0.06205 8.14E+03 6.94E+00 + 8 -0.02229 0.06418 2.04998 0.00000 0.00853 0.06701 1.93E+03 3.41E+00 + 9 -0.02539 0.06854 2.05886 0.00000 0.00942 0.07166 5.39E+02 2.41E+00 + 10 -0.02837 0.07263 2.06554 0.00000 0.01022 0.07607 1.67E+02 2.20E+00 + 11 -0.03120 0.07652 2.07000 0.00000 0.01100 0.08024 5.53E+01 2.46E+00 + 12 -0.03385 0.08023 2.07279 0.00000 0.01187 0.08420 2.40E+01 7.14E+00 + 13 -0.03634 0.08377 2.07474 0.00000 0.01289 0.08795 2.88E+02 2.83E+02 + 14 -0.03869 0.08717 2.07655 0.00000 0.01406 0.09152 5.17E+05 5.17E+05 + 15 -0.04091 0.09043 2.07858 0.00000 0.01534 0.09493 0.00E+00 0.00E+00 + +----------------------------------------------------------------------- + Toroidal Plane: Phi = 180/Nfp +----------------------------------------------------------------------- + + 2 -0.00317 0.04667 0.74661 0.00000 0.00703 -0.00897 + 3 -0.00634 0.06632 0.74301 0.00000 0.00971 -0.01492 + 4 -0.00952 0.08180 0.73659 0.00000 0.01218 -0.02074 + 5 -0.01272 0.09522 0.72886 0.00000 0.01412 -0.02611 + 6 -0.01593 0.10738 0.72053 0.00000 0.01575 -0.03103 + 7 -0.01913 0.11866 0.71217 0.00000 0.01717 -0.03555 + 8 -0.02229 0.12923 0.70434 0.00000 0.01843 -0.03961 + 9 -0.02539 0.13918 0.69759 0.00000 0.01954 -0.04309 + 10 -0.02837 0.14849 0.69240 0.00000 0.02050 -0.04586 + 11 -0.03120 0.15719 0.68893 0.00000 0.02132 -0.04787 + 12 -0.03385 0.16530 0.68699 0.00000 0.02204 -0.04917 + 13 -0.03634 0.17292 0.68611 0.00000 0.02269 -0.04993 + 14 -0.03869 0.18014 0.68577 0.00000 0.02330 -0.05032 + 15 -0.04091 0.18702 0.68564 0.00000 0.02390 -0.05045 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 7.555934E+01 2.459030E+02 + bpol**2 /(2 mu0) = 2.617073E+03 8.517093E+03 + btor**2/(2 mu0) = 3.770794E+04 1.227181E+05 + b**2/(2 mu0) = 4.032501E+04 1.312352E+05 + EKIN (3/2p) = 1.133390E+02 3.688545E+02 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 7.7373E-01 -0.0000E+00 + 1 -3.0121E-02 2.7885E-02 + 2 8.1269E-04 -8.5162E-04 + 3 -2.0684E-05 1.6993E-05 + 4 1.4439E-06 -6.7986E-07 + + From volume averages over plasma, betas are + beta total = 0.001874 + beta poloidal = 0.028872 + beta toroidal = 0.002004 + + R * Btor-vac = -0.451243 [Wb/M] + Peak Beta = 0.003200 + Beta-star = 0.002322 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 0.837579 [M] + RG (Geometric) = 0.727233 [M] + RL (Vol/2*pi*Area-Lao) = 0.771845 [M] + Poloidal Field Energy + Normalization Ratio = 0.128467 (Lao/Hirshman) + + s3 = -0.712268 + lsubi = 0.833597 + musubi = 1.433295 + betai = 0.024067 + lambda = 0.440866 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -0.151734 -0.085166 + s1 = -1.407854 -1.257103 -1.318050 + s2 = 1.144272 0.993521 1.054468 + betai (Mui + s1) = 0.025441 0.176192 0.115246 + lambda (s1/2 + s2) = 0.440345 0.364970 0.395443 + 1st Shafr'v relation = 0.000630 0.000630 0.000630 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = 0.001056 0.152950 0.086311 + (Betai + Li + Mui)/(2*s2) - 1 + + + NF*PHI Rb Zb BSQMHDI BSQVACI BSQMHDF BSQVACF + + 0.00E+00 8.1766E-01 0.0000E+00 2.3864E-01 2.4743E-01 2.3700E-01 2.3679E-01 + 0.00E+00 8.0915E-01 7.1260E-02 2.3282E-01 2.4034E-01 2.3055E-01 2.3082E-01 + 0.00E+00 7.8753E-01 1.3258E-01 2.1883E-01 2.2042E-01 2.1484E-01 2.1475E-01 + 0.00E+00 7.5866E-01 1.7383E-01 2.0450E-01 2.0043E-01 1.9910E-01 1.9940E-01 + 0.00E+00 7.2446E-01 1.8796E-01 1.9774E-01 1.9040E-01 1.9263E-01 1.9239E-01 + 0.00E+00 6.8806E-01 1.7371E-01 2.0378E-01 1.9691E-01 2.0095E-01 2.0113E-01 + 0.00E+00 6.5814E-01 1.3385E-01 2.1943E-01 2.1568E-01 2.2250E-01 2.2244E-01 + 0.00E+00 6.4149E-01 7.3169E-02 2.3557E-01 2.3921E-01 2.4727E-01 2.4716E-01 + 0.00E+00 6.3681E-01 2.3529E-17 2.4240E-01 2.5154E-01 2.5874E-01 2.5889E-01 + 7.00E+01 8.6487E-01 -7.2701E-02 1.3829E-01 1.3625E-01 1.3753E-01 1.3764E-01 + 7.00E+01 8.4475E-01 -3.4838E-03 1.7231E-01 1.7462E-01 1.7331E-01 1.7341E-01 + 7.00E+01 8.0923E-01 5.9645E-02 2.0825E-01 2.2090E-01 2.1469E-01 2.1480E-01 + 7.00E+01 7.6543E-01 1.0793E-01 2.3850E-01 2.6240E-01 2.5174E-01 2.5177E-01 + 7.00E+01 7.2030E-01 1.3287E-01 2.5858E-01 2.8119E-01 2.7221E-01 2.7223E-01 + 7.00E+01 6.7862E-01 1.3016E-01 2.6461E-01 2.7633E-01 2.7600E-01 2.7601E-01 + 7.00E+01 6.4702E-01 1.0185E-01 2.6107E-01 2.6755E-01 2.7436E-01 2.7415E-01 + 7.00E+01 6.3307E-01 5.2835E-02 2.5554E-01 2.5891E-01 2.6970E-01 2.6972E-01 + 7.00E+01 6.3865E-01 -1.1467E-02 2.4450E-01 2.4276E-01 2.5330E-01 2.5318E-01 + 1.40E+02 9.7794E-01 -6.1342E-02 5.2677E-02 5.0352E-02 5.3088E-02 5.3042E-02 + 1.40E+02 9.5008E-01 -8.3919E-03 6.4927E-02 6.2734E-02 6.5912E-02 6.5765E-02 + 1.40E+02 9.0122E-01 4.2099E-02 8.7257E-02 8.6722E-02 8.9814E-02 9.0384E-02 + 1.40E+02 8.4033E-01 8.4397E-02 1.2453E-01 1.2475E-01 1.2946E-01 1.2903E-01 + 1.40E+02 7.7568E-01 1.1032E-01 1.7314E-01 1.7933E-01 1.8194E-01 1.8221E-01 + 1.40E+02 7.1517E-01 1.1133E-01 2.1705E-01 2.3152E-01 2.3150E-01 2.3177E-01 + 1.40E+02 6.6738E-01 8.7189E-02 2.4112E-01 2.5331E-01 2.5983E-01 2.5923E-01 + 1.40E+02 6.4003E-01 4.5974E-02 2.4665E-01 2.5090E-01 2.6426E-01 2.6456E-01 + 1.40E+02 6.3737E-01 -5.1596E-03 2.3962E-01 2.3968E-01 2.5512E-01 2.5483E-01 + 2.10E+02 9.9140E-01 4.8798E-02 4.7559E-02 4.5611E-02 4.8161E-02 4.8168E-02 + 2.10E+02 9.8776E-01 9.4380E-02 4.6112E-02 4.4760E-02 4.7026E-02 4.7013E-02 + 2.10E+02 9.5414E-01 1.2848E-01 5.2637E-02 5.0943E-02 5.3857E-02 5.3622E-02 + 2.10E+02 8.9784E-01 1.4927E-01 6.7446E-02 6.4844E-02 6.8293E-02 6.8560E-02 + 2.10E+02 8.2960E-01 1.5624E-01 9.3175E-02 8.9874E-02 9.5267E-02 9.5322E-02 + 2.10E+02 7.6039E-01 1.4424E-01 1.3152E-01 1.3016E-01 1.3770E-01 1.3748E-01 + 2.10E+02 7.0021E-01 1.0942E-01 1.7975E-01 1.8183E-01 1.8945E-01 1.8993E-01 + 2.10E+02 6.5726E-01 5.8389E-02 2.2059E-01 2.2135E-01 2.3378E-01 2.3329E-01 + 2.10E+02 6.3703E-01 3.7973E-03 2.3953E-01 2.3973E-01 2.5553E-01 2.5550E-01 + 2.80E+02 8.7880E-01 7.8390E-02 1.2026E-01 1.1742E-01 1.1961E-01 1.1967E-01 + 2.80E+02 8.8287E-01 1.4219E-01 9.8761E-02 9.3858E-02 9.6734E-02 9.6703E-02 + 2.80E+02 8.6971E-01 1.9041E-01 8.8047E-02 8.2488E-02 8.5132E-02 8.5271E-02 + 2.80E+02 8.3934E-01 2.1496E-01 8.7606E-02 8.1983E-02 8.5068E-02 8.4805E-02 + 2.80E+02 7.9413E-01 2.1440E-01 9.9805E-02 9.3627E-02 9.7347E-02 9.7508E-02 + 2.80E+02 7.4295E-01 1.9031E-01 1.2721E-01 1.1917E-01 1.2467E-01 1.2465E-01 + 2.80E+02 6.9672E-01 1.4406E-01 1.6776E-01 1.5978E-01 1.6704E-01 1.6704E-01 + 2.80E+02 6.6129E-01 8.0633E-02 2.1091E-01 2.0709E-01 2.1546E-01 2.1540E-01 + 2.80E+02 6.3879E-01 1.1428E-02 2.4021E-01 2.4168E-01 2.5279E-01 2.5285E-01 + 3.50E+02 8.1864E-01 1.2066E-02 2.3583E-01 2.4396E-01 2.3402E-01 2.3388E-01 + 3.50E+02 8.1168E-01 8.3072E-02 2.2296E-01 2.2631E-01 2.1861E-01 2.1894E-01 + 3.50E+02 7.9186E-01 1.4352E-01 2.0451E-01 2.0037E-01 1.9746E-01 1.9713E-01 + 3.50E+02 7.6432E-01 1.8315E-01 1.8810E-01 1.8037E-01 1.8054E-01 1.8089E-01 + 3.50E+02 7.3031E-01 1.9534E-01 1.8159E-01 1.7329E-01 1.7606E-01 1.7580E-01 + 3.50E+02 6.9325E-01 1.7932E-01 1.9008E-01 1.8334E-01 1.8766E-01 1.8776E-01 + 3.50E+02 6.6226E-01 1.3796E-01 2.1025E-01 2.0635E-01 2.1308E-01 2.1306E-01 + 3.50E+02 6.4392E-01 7.6108E-02 2.3197E-01 2.3448E-01 2.4229E-01 2.4217E-01 + 3.50E+02 6.3688E-01 2.5306E-03 2.4347E-01 2.5121E-01 2.5854E-01 2.5861E-01 + + NF*PHI Rb Zb BR BPHI BZ BRv BPHIv BZv + + 0.00E+00 8.1766E-01 0.0000E+00 0.00E+00 -6.82E-01 9.06E-02 -0.00E+00 -6.83E-01 8.50E-02 + 0.00E+00 8.0915E-01 7.1260E-02 7.80E-02 -6.66E-01 1.07E-01 7.63E-02 -6.66E-01 1.13E-01 + 0.00E+00 7.8753E-01 1.3258E-01 1.30E-01 -6.26E-01 1.44E-01 1.32E-01 -6.26E-01 1.41E-01 + 0.00E+00 7.5866E-01 1.7383E-01 1.51E-01 -5.88E-01 1.74E-01 1.52E-01 -5.88E-01 1.73E-01 + 0.00E+00 7.2446E-01 1.8796E-01 1.50E-01 -5.76E-01 1.75E-01 1.48E-01 -5.76E-01 1.75E-01 + 0.00E+00 6.8806E-01 1.7371E-01 1.40E-01 -5.96E-01 1.63E-01 1.41E-01 -5.96E-01 1.64E-01 + 0.00E+00 6.5814E-01 1.3385E-01 1.21E-01 -6.38E-01 1.51E-01 1.22E-01 -6.38E-01 1.51E-01 + 0.00E+00 6.4149E-01 7.3169E-02 7.69E-02 -6.85E-01 1.39E-01 7.67E-02 -6.85E-01 1.37E-01 + 0.00E+00 6.3681E-01 2.3529E-17 2.64E-17 -7.07E-01 1.33E-01 2.66E-17 -7.07E-01 1.36E-01 + 7.00E+01 8.6487E-01 -7.2701E-02 -1.91E-01 -4.88E-01 -2.77E-02 -1.91E-01 -4.88E-01 -2.36E-02 + 7.00E+01 8.4475E-01 -3.4838E-03 -1.49E-01 -5.69E-01 -1.38E-02 -1.49E-01 -5.70E-01 -1.55E-02 + 7.00E+01 8.0923E-01 5.9645E-02 -9.94E-02 -6.47E-01 3.20E-02 -1.02E-01 -6.47E-01 3.55E-02 + 7.00E+01 7.6543E-01 1.0793E-01 -5.82E-02 -6.99E-01 1.08E-01 -5.54E-02 -7.00E-01 1.05E-01 + 7.00E+01 7.2030E-01 1.3287E-01 -2.88E-02 -7.18E-01 1.69E-01 -2.83E-02 -7.18E-01 1.69E-01 + 7.00E+01 6.7862E-01 1.3016E-01 -7.83E-03 -7.19E-01 1.88E-01 -9.31E-03 -7.19E-01 1.88E-01 + 7.00E+01 6.4702E-01 1.0185E-01 7.62E-03 -7.19E-01 1.79E-01 9.24E-03 -7.18E-01 1.82E-01 + 7.00E+01 6.3307E-01 5.2835E-02 8.05E-03 -7.18E-01 1.53E-01 7.93E-03 -7.19E-01 1.51E-01 + 7.00E+01 6.3865E-01 -1.1467E-02 -2.71E-02 -7.03E-01 1.09E-01 -2.71E-02 -7.03E-01 1.09E-01 + 1.40E+02 9.7794E-01 -6.1342E-02 -9.77E-02 -2.70E-01 -1.55E-01 -9.72E-02 -2.69E-01 -1.55E-01 + 1.40E+02 9.5008E-01 -8.3919E-03 -8.71E-02 -3.15E-01 -1.59E-01 -8.73E-02 -3.14E-01 -1.58E-01 + 1.40E+02 9.0122E-01 4.2099E-02 -7.36E-02 -3.88E-01 -1.53E-01 -7.66E-02 -3.90E-01 -1.51E-01 + 1.40E+02 8.4033E-01 8.4397E-02 -6.68E-02 -4.89E-01 -1.25E-01 -6.60E-02 -4.88E-01 -1.25E-01 + 1.40E+02 7.7568E-01 1.1032E-01 -6.85E-02 -5.96E-01 -6.50E-02 -6.74E-02 -5.96E-01 -6.53E-02 + 1.40E+02 7.1517E-01 1.1133E-01 -6.70E-02 -6.77E-01 8.72E-03 -6.75E-02 -6.77E-01 8.56E-03 + 1.40E+02 6.6738E-01 8.7189E-02 -5.47E-02 -7.15E-01 6.94E-02 -5.37E-02 -7.15E-01 7.02E-02 + 1.40E+02 6.4003E-01 4.5974E-02 -3.08E-02 -7.20E-01 9.70E-02 -3.07E-02 -7.20E-01 9.73E-02 + 1.40E+02 6.3737E-01 -5.1596E-03 -1.16E-02 -7.09E-01 8.24E-02 -1.14E-02 -7.09E-01 8.17E-02 + 2.10E+02 9.9140E-01 4.8798E-02 7.41E-02 -2.55E-01 -1.61E-01 7.36E-02 -2.54E-01 -1.62E-01 + 2.10E+02 9.8776E-01 9.4380E-02 8.15E-02 -2.49E-01 -1.60E-01 8.29E-02 -2.46E-01 -1.63E-01 + 2.10E+02 9.5414E-01 1.2848E-01 8.81E-02 -2.72E-01 -1.62E-01 8.96E-02 -2.70E-01 -1.62E-01 + 2.10E+02 8.9784E-01 1.4927E-01 9.02E-02 -3.21E-01 -1.60E-01 8.70E-02 -3.22E-01 -1.60E-01 + 2.10E+02 8.2960E-01 1.5624E-01 8.26E-02 -4.03E-01 -1.45E-01 8.35E-02 -4.03E-01 -1.45E-01 + 2.10E+02 7.6039E-01 1.4424E-01 6.27E-02 -5.10E-01 -1.05E-01 6.32E-02 -5.10E-01 -1.05E-01 + 2.10E+02 7.0021E-01 1.0942E-01 3.31E-02 -6.13E-01 -4.06E-02 3.26E-02 -6.14E-01 -4.13E-02 + 2.10E+02 6.5726E-01 5.8389E-02 8.29E-03 -6.83E-01 3.20E-02 9.22E-03 -6.82E-01 3.35E-02 + 2.10E+02 6.3703E-01 3.7973E-03 8.23E-03 -7.10E-01 8.09E-02 8.09E-03 -7.10E-01 7.99E-02 + 2.80E+02 8.7880E-01 7.8390E-02 1.91E-01 -4.47E-01 -5.30E-02 1.91E-01 -4.47E-01 -5.03E-02 + 2.80E+02 8.8287E-01 1.4219E-01 2.05E-01 -3.86E-01 -4.91E-02 2.05E-01 -3.86E-01 -5.03E-02 + 2.80E+02 8.6971E-01 1.9041E-01 2.05E-01 -3.55E-01 -4.22E-02 2.06E-01 -3.55E-01 -4.47E-02 + 2.80E+02 8.3934E-01 2.1496E-01 1.99E-01 -3.59E-01 -3.82E-02 2.01E-01 -3.58E-01 -3.88E-02 + 2.80E+02 7.9413E-01 2.1440E-01 1.90E-01 -3.97E-01 -3.32E-02 1.88E-01 -3.98E-01 -3.38E-02 + 2.80E+02 7.4295E-01 1.9031E-01 1.75E-01 -4.67E-01 -2.03E-02 1.77E-01 -4.67E-01 -1.91E-02 + 2.80E+02 6.9672E-01 1.4406E-01 1.43E-01 -5.60E-01 5.99E-03 1.42E-01 -5.60E-01 4.88E-03 + 2.80E+02 6.6129E-01 8.0633E-02 8.55E-02 -6.49E-01 5.00E-02 8.61E-02 -6.49E-01 5.14E-02 + 2.80E+02 6.3879E-01 1.1428E-02 2.69E-02 -7.03E-01 1.04E-01 2.69E-02 -7.03E-01 1.04E-01 + 3.50E+02 8.1864E-01 1.2066E-02 4.25E-02 -6.77E-01 8.75E-02 4.24E-02 -6.78E-01 8.29E-02 + 3.50E+02 8.1168E-01 8.3072E-02 1.15E-01 -6.43E-01 1.01E-01 1.14E-01 -6.43E-01 1.07E-01 + 3.50E+02 7.9186E-01 1.4352E-01 1.59E-01 -5.93E-01 1.33E-01 1.60E-01 -5.93E-01 1.29E-01 + 3.50E+02 7.6432E-01 1.8315E-01 1.72E-01 -5.54E-01 1.55E-01 1.73E-01 -5.55E-01 1.54E-01 + 3.50E+02 7.3031E-01 1.9534E-01 1.67E-01 -5.48E-01 1.54E-01 1.66E-01 -5.48E-01 1.54E-01 + 3.50E+02 6.9325E-01 1.7932E-01 1.55E-01 -5.75E-01 1.44E-01 1.56E-01 -5.75E-01 1.45E-01 + 3.50E+02 6.6226E-01 1.3796E-01 1.33E-01 -6.25E-01 1.35E-01 1.34E-01 -6.24E-01 1.37E-01 + 3.50E+02 6.4392E-01 7.6108E-02 8.47E-02 -6.79E-01 1.30E-01 8.44E-02 -6.79E-01 1.28E-01 + 3.50E+02 6.3688E-01 2.5306E-03 6.03E-03 -7.07E-01 1.33E-01 6.14E-03 -7.06E-01 1.36E-01 + + + nb mb rbc zbs vacpot_s |B|_c(s=.5) |B|_c(s=1.) + + 0 0 7.6904E-01 -0.0000E+00 0.0000E+00 5.8341E-01 5.7968E-01 + 1 0 -4.6880E-02 4.6553E-02 -5.4288E-06 8.8201E-02 8.1177E-02 + 2 0 2.4162E-03 -1.5684E-03 -1.1904E-07 2.5468E-03 1.1747E-03 + 3 0 -2.7883E-04 9.8140E-05 5.0943E-07 1.8287E-04 6.3649E-04 + 4 0 4.6024E-05 -3.1499E-05 -3.0279E-07 -3.6659E-05 -1.0681E-04 + -4 1 2.3284E-05 2.3744E-05 2.1844E-07 -1.0052E-05 -1.5903E-05 + -3 1 -6.6139E-05 9.3431E-08 2.4878E-07 -5.9146E-07 -1.4514E-06 + -2 1 3.8067E-04 -3.1355E-05 -3.2958E-06 2.7187E-08 7.0208E-08 + -1 1 -4.9255E-03 -2.4139E-03 1.8486E-05 -3.8339E-11 1.8751E-07 + 0 1 1.3337E-01 1.6177E-01 3.7278E-04 -2.1736E-09 4.1609E-08 + 1 1 -4.2047E-02 3.2832E-02 2.0981E-04 -8.6022E-10 4.3939E-09 + 2 1 4.6069E-03 -4.2504E-03 -1.3713E-05 -1.7871E-10 -4.4610E-10 + 3 1 -4.1768E-04 2.9168E-04 1.7952E-06 -1.6263E-11 -3.8213E-10 + 4 1 3.4092E-05 -4.7445E-05 -3.1448E-07 -1.0561E-12 -1.7655E-11 + -4 2 -1.6659E-06 -1.0856E-06 -2.9468E-07 1.6957E-13 -4.6797E-12 + -3 2 2.1366E-05 2.7173E-05 1.0467E-07 1.1342E-13 -1.8403E-12 + -2 2 -7.4351E-05 -1.7224E-04 -1.9965E-06 1.1681E-14 1.0076E-12 + -1 2 7.0563E-05 7.6370E-04 2.1317E-05 1.2334E-15 1.7473E-13 + 0 2 1.2389E-03 -1.8819E-03 2.7457E-04 -2.3636E-17 -4.0737E-14 + 1 2 -1.3311E-03 1.9882E-03 5.7901E-04 -3.4781E-16 -2.9081E-14 + 2 2 1.7397E-03 -1.6307E-03 -1.6204E-05 -2.2898E-16 -6.3344E-14 + 3 2 -3.0268E-04 3.0938E-04 -2.1548E-06 -2.6038E-15 1.3873E-12 + 4 2 2.6022E-05 -3.4002E-05 6.9681E-07 6.0779E-14 1.5138E-12 + -4 3 -2.7723E-06 3.5285E-06 -3.0370E-07 1.9668E-13 -3.7115E-12 + -3 3 9.7021E-07 -1.2333E-06 7.9612E-08 -1.0940E-12 3.3362E-11 + -2 3 -2.2645E-05 -1.2326E-05 -9.4810E-07 -1.0423E-11 -2.6587E-10 + -1 3 -1.0121E-04 3.8162E-05 9.6267E-07 -1.6042E-10 -1.9695E-09 + 0 3 -2.3484E-04 -1.0753E-04 2.1594E-05 -9.8353E-10 -1.1643E-09 + 1 3 -6.3728E-04 7.1252E-04 1.7903E-04 -2.2570E-09 -3.8683E-09 + 2 3 5.5641E-04 -5.0043E-04 1.3089E-04 1.7028E-09 9.3557E-08 + 3 3 -1.0550E-04 9.7113E-05 -1.8445E-05 9.1724E-08 7.1984E-07 + 4 3 1.2763E-05 -1.0502E-05 2.4103E-06 7.9381E-07 7.1204E-07 + -4 4 -4.0730E-06 3.7424E-06 -1.1195E-06 2.2413E-07 -8.7772E-06 + -3 4 -1.7747E-06 -2.3450E-06 -7.1605E-07 -8.5107E-06 -3.0661E-05 + -2 4 5.0730E-06 1.2948E-05 -2.2982E-07 7.1046E-05 2.7084E-04 + -1 4 -3.1976E-05 -5.3910E-05 6.0823E-06 -8.4064E-04 -2.2883E-03 + 0 4 5.8938E-04 3.4009E-04 5.8830E-05 -1.0058E-02 -1.7728E-02 + 1 4 6.5386E-04 -9.7055E-04 1.9848E-04 -7.3670E-02 -1.1718E-01 + 2 4 3.7561E-04 1.8714E-04 1.8984E-04 7.4589E-02 1.1935E-01 + 3 4 -8.1260E-05 -3.5578E-05 -1.8861E-05 3.9814E-03 6.0853E-03 + 4 4 1.6584E-06 1.0866E-05 4.3352E-07 5.9453E-05 3.0369E-04 + + + EXECUTION TERMINATED NORMALLY + + FILE : cth_like_free_bdy + NUMBER OF JACOBIAN RESETS = 1 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev new file mode 100644 index 000000000..f2dc207af --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev @@ -0,0 +1,313 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 55 18 1 6 0 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 1 0.000E+00 1.000E+00 1.000E+00 0.000E+00 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 0 2000 5 250 1 1.00E-12 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'power_series' + ----------------------------------- + 1.250E-01 -1.250E-01 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + IOTA PROFILE COEFFICIENTS ai (EXPANSION IN NORMALIZED RADIUS): + PIOTA parameterization type is 'power_series' + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 3.9990E+00 0.0000E+00 0.0000E+00 0.0000E+00 4.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 0 1 1.0260E+00 0.0000E+00 0.0000E+00 1.5800E+00 + 0 2 -6.8000E-02 0.0000E+00 0.0000E+00 1.0000E-02 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 5 NO. FOURIER MODES = 6 FTOLV = 1.000E-12 NITER = 1000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 8.18E-02 2.28E-03 1.17E-33 2.25E-33 8.18E-02 2.28E-03 2.88E-02 2.96E-03 5.49E-05 7.00E-37 9.61E-36 2.96E-03 5.49E-05 1.03E-02 9.00E-01 4.000E+00 2.6390E+00 3.786E-06 1.010 + 186 8.44E-13 7.94E-13 2.24E-05 4.74E-05 2.24E-05 4.74E-05 5.57E-13 1.55E-15 6.13E-15 2.31E-08 2.28E-07 2.31E-08 2.28E-07 7.21E-15 9.00E-01 3.994E+00 2.5485E+00 3.875E-06 1.010 + + MHD Energy = 2.548466E+00 + + NS = 11 NO. FOURIER MODES = 6 FTOLV = 1.000E-12 NITER = 2000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 1.20E-04 3.70E-05 2.19E-08 3.89E-08 1.19E-04 3.62E-05 1.28E-06 1.26E-08 1.09E-08 1.26E-11 1.02E-10 1.22E-08 9.19E-09 1.00E-07 9.00E-01 3.994E+00 2.5484E+00 3.874E-06 1.011 + 133 9.07E-13 4.66E-13 3.23E-09 4.76E-09 3.24E-09 4.76E-09 2.83E-14 2.41E-17 1.04E-16 4.31E-13 3.36E-12 4.31E-13 3.36E-12 2.63E-16 9.00E-01 3.991E+00 2.5484E+00 3.873E-06 1.010 + + MHD Energy = 2.548372E+00 + + NS = 55 NO. FOURIER MODES = 6 FTOLV = 1.000E-12 NITER = 2000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 1.60E-04 3.05E-05 4.44E-09 7.83E-09 1.60E-04 3.04E-05 2.09E-07 2.99E-10 2.49E-10 7.68E-13 6.01E-12 2.83E-10 1.87E-10 9.06E-09 9.00E-01 3.991E+00 2.5484E+00 3.872E-06 1.011 + 203 9.36E-13 7.80E-14 2.59E-11 1.03E-10 2.76E-11 1.03E-10 2.03E-15 9.20E-18 3.47E-19 9.51E-16 1.31E-14 9.73E-16 1.31E-14 1.55E-16 9.00E-01 3.989E+00 2.5484E+00 3.872E-06 1.010 + + MHD Energy = 2.548352E+00 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 -8.57E-04 -0.0000E+00 1.0000E+00 -2.231E+04 -2.227E+04 -1.233E+02 -1.250E-01 1.000 1.250E-01 0.000E+00 8.112E-01 -1.806E+04 4.134E-02 + 1.85E-02 -4.52E-04 1.8519E-02 1.0000E+00 -2.227E+04 -2.225E+04 -1.234E+02 -1.250E-01 1.000 1.227E-01 1.619E-03 8.095E-01 -1.805E+04 4.130E-02 + 3.70E-02 -4.78E-05 3.7037E-02 1.0000E+00 -2.224E+04 -2.224E+04 -1.235E+02 -1.250E-01 1.001 1.204E-01 3.238E-03 8.079E-01 -1.804E+04 4.126E-02 + 5.56E-02 -2.52E-05 5.5556E-02 1.0000E+00 -2.222E+04 -2.222E+04 -1.236E+02 -1.250E-01 1.001 1.181E-01 4.857E-03 8.063E-01 -1.803E+04 4.122E-02 + 7.41E-02 -3.61E-06 7.4074E-02 1.0000E+00 -2.220E+04 -2.220E+04 -1.238E+02 -1.250E-01 1.001 1.157E-01 6.477E-03 8.047E-01 -1.801E+04 4.118E-02 + 9.26E-02 5.18E-06 9.2593E-02 1.0000E+00 -2.219E+04 -2.219E+04 -1.239E+02 -1.250E-01 1.002 1.134E-01 8.097E-03 8.031E-01 -1.800E+04 4.113E-02 + 1.11E-01 9.83E-06 1.1111E-01 1.0000E+00 -2.217E+04 -2.217E+04 -1.240E+02 -1.250E-01 1.002 1.111E-01 9.718E-03 8.014E-01 -1.798E+04 4.109E-02 + 1.30E-01 1.16E-05 1.2963E-01 1.0000E+00 -2.215E+04 -2.215E+04 -1.242E+02 -1.250E-01 1.003 1.088E-01 1.134E-02 7.998E-01 -1.797E+04 4.105E-02 + 1.48E-01 8.97E-06 1.4815E-01 1.0000E+00 -2.213E+04 -2.213E+04 -1.243E+02 -1.250E-01 1.003 1.065E-01 1.296E-02 7.982E-01 -1.796E+04 4.100E-02 + 1.67E-01 7.40E-06 1.6667E-01 1.0000E+00 -2.212E+04 -2.212E+04 -1.244E+02 -1.250E-01 1.003 1.042E-01 1.458E-02 7.966E-01 -1.794E+04 4.096E-02 + 1.85E-01 4.86E-06 1.8519E-01 1.0000E+00 -2.210E+04 -2.210E+04 -1.246E+02 -1.250E-01 1.004 1.019E-01 1.620E-02 7.950E-01 -1.793E+04 4.092E-02 + 2.04E-01 5.34E-06 2.0370E-01 1.0000E+00 -2.208E+04 -2.208E+04 -1.247E+02 -1.250E-01 1.004 9.954E-02 1.783E-02 7.933E-01 -1.791E+04 4.088E-02 + 2.22E-01 6.18E-06 2.2222E-01 1.0000E+00 -2.207E+04 -2.207E+04 -1.248E+02 -1.250E-01 1.004 9.722E-02 1.945E-02 7.917E-01 -1.790E+04 4.083E-02 + 2.41E-01 2.87E-06 2.4074E-01 1.0000E+00 -2.205E+04 -2.205E+04 -1.250E+02 -1.250E-01 1.005 9.491E-02 2.108E-02 7.901E-01 -1.789E+04 4.079E-02 + 2.59E-01 2.78E-06 2.5926E-01 1.0000E+00 -2.203E+04 -2.203E+04 -1.251E+02 -1.250E-01 1.005 9.259E-02 2.270E-02 7.885E-01 -1.787E+04 4.075E-02 + 2.78E-01 5.03E-06 2.7778E-01 1.0000E+00 -2.202E+04 -2.202E+04 -1.252E+02 -1.250E-01 1.006 9.028E-02 2.432E-02 7.868E-01 -1.786E+04 4.070E-02 + 2.96E-01 3.52E-06 2.9630E-01 1.0000E+00 -2.200E+04 -2.200E+04 -1.253E+02 -1.250E-01 1.006 8.796E-02 2.595E-02 7.852E-01 -1.785E+04 4.066E-02 + 3.15E-01 3.84E-06 3.1481E-01 1.0000E+00 -2.198E+04 -2.198E+04 -1.255E+02 -1.250E-01 1.006 8.565E-02 2.758E-02 7.836E-01 -1.783E+04 4.062E-02 + 3.33E-01 2.35E-06 3.3333E-01 1.0000E+00 -2.197E+04 -2.197E+04 -1.256E+02 -1.250E-01 1.007 8.333E-02 2.920E-02 7.820E-01 -1.782E+04 4.057E-02 + 3.52E-01 2.98E-06 3.5185E-01 1.0000E+00 -2.195E+04 -2.195E+04 -1.258E+02 -1.250E-01 1.007 8.102E-02 3.083E-02 7.803E-01 -1.780E+04 4.053E-02 + 3.70E-01 1.63E-06 3.7037E-01 1.0000E+00 -2.193E+04 -2.193E+04 -1.259E+02 -1.250E-01 1.007 7.870E-02 3.246E-02 7.787E-01 -1.779E+04 4.049E-02 + 3.89E-01 4.01E-06 3.8889E-01 1.0000E+00 -2.192E+04 -2.192E+04 -1.260E+02 -1.250E-01 1.008 7.639E-02 3.408E-02 7.771E-01 -1.778E+04 4.044E-02 + 4.07E-01 3.38E-06 4.0741E-01 1.0000E+00 -2.190E+04 -2.190E+04 -1.262E+02 -1.250E-01 1.008 7.407E-02 3.571E-02 7.755E-01 -1.777E+04 4.040E-02 + 4.26E-01 1.87E-06 4.2593E-01 1.0000E+00 -2.188E+04 -2.188E+04 -1.263E+02 -1.250E-01 1.009 7.176E-02 3.734E-02 7.738E-01 -1.775E+04 4.036E-02 + 4.44E-01 2.15E-06 4.4444E-01 1.0000E+00 -2.187E+04 -2.187E+04 -1.264E+02 -1.250E-01 1.009 6.944E-02 3.897E-02 7.722E-01 -1.774E+04 4.031E-02 + 4.63E-01 2.74E-06 4.6296E-01 1.0000E+00 -2.185E+04 -2.185E+04 -1.266E+02 -1.250E-01 1.009 6.713E-02 4.060E-02 7.706E-01 -1.773E+04 4.027E-02 + 4.81E-01 3.00E-06 4.8148E-01 1.0000E+00 -2.183E+04 -2.184E+04 -1.267E+02 -1.250E-01 1.010 6.481E-02 4.223E-02 7.689E-01 -1.771E+04 4.023E-02 + 5.00E-01 9.47E-07 5.0000E-01 1.0000E+00 -2.182E+04 -2.182E+04 -1.268E+02 -1.250E-01 1.010 6.250E-02 4.386E-02 7.673E-01 -1.770E+04 4.018E-02 + 5.19E-01 2.99E-06 5.1852E-01 1.0000E+00 -2.180E+04 -2.180E+04 -1.270E+02 -1.250E-01 1.011 6.019E-02 4.549E-02 7.657E-01 -1.769E+04 4.014E-02 + 5.37E-01 1.78E-06 5.3704E-01 1.0000E+00 -2.179E+04 -2.179E+04 -1.271E+02 -1.250E-01 1.011 5.787E-02 4.713E-02 7.640E-01 -1.767E+04 4.010E-02 + 5.56E-01 2.66E-06 5.5556E-01 1.0000E+00 -2.177E+04 -2.177E+04 -1.272E+02 -1.250E-01 1.011 5.556E-02 4.876E-02 7.624E-01 -1.766E+04 4.006E-02 + 5.74E-01 2.50E-06 5.7407E-01 1.0000E+00 -2.176E+04 -2.176E+04 -1.274E+02 -1.250E-01 1.012 5.324E-02 5.039E-02 7.608E-01 -1.765E+04 4.001E-02 + 5.93E-01 1.38E-06 5.9259E-01 1.0000E+00 -2.174E+04 -2.174E+04 -1.275E+02 -1.250E-01 1.012 5.093E-02 5.202E-02 7.591E-01 -1.764E+04 3.997E-02 + 6.11E-01 1.29E-06 6.1111E-01 1.0000E+00 -2.172E+04 -2.172E+04 -1.277E+02 -1.250E-01 1.012 4.861E-02 5.366E-02 7.575E-01 -1.762E+04 3.993E-02 + 6.30E-01 2.58E-06 6.2963E-01 1.0000E+00 -2.171E+04 -2.171E+04 -1.278E+02 -1.250E-01 1.013 4.630E-02 5.529E-02 7.559E-01 -1.761E+04 3.988E-02 + 6.48E-01 2.49E-06 6.4815E-01 1.0000E+00 -2.169E+04 -2.169E+04 -1.279E+02 -1.250E-01 1.013 4.398E-02 5.693E-02 7.542E-01 -1.760E+04 3.984E-02 + 6.67E-01 1.91E-06 6.6667E-01 1.0000E+00 -2.168E+04 -2.168E+04 -1.281E+02 -1.250E-01 1.014 4.167E-02 5.857E-02 7.526E-01 -1.758E+04 3.980E-02 + 6.85E-01 1.92E-06 6.8519E-01 1.0000E+00 -2.166E+04 -2.166E+04 -1.282E+02 -1.250E-01 1.014 3.935E-02 6.020E-02 7.510E-01 -1.757E+04 3.975E-02 + 7.04E-01 7.69E-07 7.0370E-01 1.0000E+00 -2.165E+04 -2.165E+04 -1.284E+02 -1.250E-01 1.014 3.704E-02 6.184E-02 7.493E-01 -1.756E+04 3.971E-02 + 7.22E-01 2.29E-06 7.2222E-01 1.0000E+00 -2.163E+04 -2.163E+04 -1.285E+02 -1.250E-01 1.015 3.472E-02 6.348E-02 7.477E-01 -1.755E+04 3.967E-02 + 7.41E-01 2.33E-06 7.4074E-01 1.0000E+00 -2.162E+04 -2.162E+04 -1.286E+02 -1.250E-01 1.015 3.241E-02 6.512E-02 7.461E-01 -1.754E+04 3.962E-02 + 7.59E-01 2.06E-06 7.5926E-01 1.0000E+00 -2.160E+04 -2.160E+04 -1.288E+02 -1.250E-01 1.016 3.009E-02 6.676E-02 7.444E-01 -1.752E+04 3.958E-02 + 7.78E-01 1.63E-06 7.7778E-01 1.0000E+00 -2.159E+04 -2.159E+04 -1.289E+02 -1.250E-01 1.016 2.778E-02 6.840E-02 7.428E-01 -1.751E+04 3.953E-02 + 7.96E-01 6.09E-07 7.9630E-01 1.0000E+00 -2.157E+04 -2.157E+04 -1.291E+02 -1.250E-01 1.016 2.546E-02 7.004E-02 7.411E-01 -1.750E+04 3.949E-02 + 8.15E-01 2.30E-06 8.1481E-01 1.0000E+00 -2.156E+04 -2.156E+04 -1.292E+02 -1.250E-01 1.017 2.315E-02 7.168E-02 7.395E-01 -1.749E+04 3.945E-02 + 8.33E-01 1.40E-06 8.3333E-01 1.0000E+00 -2.154E+04 -2.154E+04 -1.293E+02 -1.250E-01 1.017 2.083E-02 7.332E-02 7.378E-01 -1.747E+04 3.940E-02 + 8.52E-01 2.01E-06 8.5185E-01 1.0000E+00 -2.153E+04 -2.153E+04 -1.295E+02 -1.250E-01 1.018 1.852E-02 7.496E-02 7.362E-01 -1.746E+04 3.936E-02 + 8.70E-01 1.80E-06 8.7037E-01 1.0000E+00 -2.151E+04 -2.151E+04 -1.296E+02 -1.250E-01 1.018 1.620E-02 7.661E-02 7.346E-01 -1.745E+04 3.932E-02 + 8.89E-01 1.52E-06 8.8889E-01 1.0000E+00 -2.150E+04 -2.150E+04 -1.298E+02 -1.250E-01 1.018 1.389E-02 7.825E-02 7.329E-01 -1.744E+04 3.927E-02 + 9.07E-01 6.72E-07 9.0741E-01 1.0000E+00 -2.148E+04 -2.148E+04 -1.299E+02 -1.250E-01 1.019 1.157E-02 7.990E-02 7.313E-01 -1.743E+04 3.923E-02 + 9.26E-01 1.59E-06 9.2593E-01 1.0000E+00 -2.147E+04 -2.147E+04 -1.301E+02 -1.250E-01 1.019 9.259E-03 8.154E-02 7.296E-01 -1.742E+04 3.919E-02 + 9.44E-01 1.45E-06 9.4444E-01 1.0000E+00 -2.145E+04 -2.145E+04 -1.302E+02 -1.250E-01 1.020 6.944E-03 8.319E-02 7.280E-01 -1.740E+04 3.914E-02 + 9.63E-01 2.34E-06 9.6296E-01 1.0000E+00 -2.144E+04 -2.144E+04 -1.304E+02 -1.250E-01 1.020 4.630E-03 8.484E-02 7.263E-01 -1.739E+04 3.910E-02 + 9.81E-01 2.49E-06 9.8148E-01 1.0000E+00 -2.143E+04 -2.143E+04 -1.305E+02 -1.250E-01 1.020 2.315E-03 8.648E-02 7.247E-01 -1.738E+04 3.906E-02 + 1.00E+00 2.64E-06 1.0000E+00 1.0000E+00 -2.141E+04 -2.141E+04 -1.306E+02 -1.250E-01 1.021 6.582E-18 8.813E-02 7.230E-01 -1.737E+04 3.901E-02 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.161211 + BMAX(u=0) = 0.161211 + BMIN(u=pi) = 0.265029 + BMAX(u=pi) = 0.265029 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 3.117998 + Mean Elongation = 1.599182 + Plasma Volume = 126.871928 [M**3] + Cross Sectional Area = 5.088500 [M**2] + Normal Surface Area = 207.139981 [M**2] + Poloidal Circumference= 8.293530 [M] + Major Radius = 3.968221 [M] (from Volume and Cross Section) + Minor Radius = 1.272682 [M] (from Cross Section) + Minimum (inboard) R = 2.905000 [M] + Maximum (outboard) R = 4.957000 [M] + Maximum height Z = 1.559416 [M] + Waist (v = 0) in R = 2.052000 [M] + Full Height(v = 0) = 3.118833 [M] + Toroidal Flux = 1.000000 [Wb] + Toroidal Current = -0.440661 [MA] + RBtor(s=1) = 0.723038 [T-m] + RBtor(s=0) = 0.811169 [T-m] + Volume Average B = 0.200430 [T] + Ion Larmor Radius = 0.015966 [M] X Ti(keV)**0.5 + / = ************** (Vol. Averaged) + / = 260.495125 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 0.01852 0.13717 1.51863 0.00000 -0.09488 0.00393 4.02E+11 1.71E+05 + 3 0.03704 0.19405 1.51864 0.00000 -0.09868 0.00553 2.00E+11 7.65E+04 + 4 0.05556 0.23774 1.51876 0.00000 -0.10143 0.00672 1.33E+11 1.31E+04 + 5 0.07407 0.27460 1.51885 0.00000 -0.10374 0.00771 9.94E+10 5.61E+02 + 6 0.09259 0.30711 1.51893 0.00000 -0.10577 0.00857 7.93E+10 2.01E+03 + 7 0.11111 0.33653 1.51899 0.00000 -0.10760 0.00935 6.59E+10 2.19E+03 + 8 0.12963 0.36361 1.51905 0.00000 -0.10929 0.01006 5.63E+10 1.20E+03 + 9 0.14815 0.38883 1.51910 0.00000 -0.11086 0.01073 4.91E+10 5.39E+02 + 10 0.16667 0.41255 1.51914 0.00000 -0.11234 0.01136 4.35E+10 2.33E+02 + 11 0.18519 0.43501 1.51918 0.00000 -0.11374 0.01196 3.90E+10 7.90E+01 + 12 0.20370 0.45639 1.51922 0.00000 -0.11507 0.01253 3.54E+10 4.02E+01 + 13 0.22222 0.47684 1.51925 0.00000 -0.11635 0.01308 3.23E+10 2.25E+01 + 14 0.24074 0.49647 1.51929 0.00000 -0.11757 0.01361 2.97E+10 1.42E+01 + 15 0.25926 0.51538 1.51932 0.00000 -0.11875 0.01411 2.75E+10 1.51E+01 + 16 0.27778 0.53364 1.51934 0.00000 -0.11989 0.01461 2.56E+10 7.68E+00 + 17 0.29630 0.55132 1.51937 0.00000 -0.12100 0.01509 2.39E+10 6.84E+00 + 18 0.31481 0.56847 1.51940 0.00000 -0.12207 0.01555 2.25E+10 5.65E+00 + 19 0.33333 0.58515 1.51942 0.00000 -0.12312 0.01601 2.11E+10 3.93E+00 + 20 0.35185 0.60138 1.51945 0.00000 -0.12413 0.01645 2.00E+10 4.56E+00 + 21 0.37037 0.61720 1.51947 0.00000 -0.12513 0.01688 1.89E+10 3.08E+00 + 22 0.38889 0.63265 1.51949 0.00000 -0.12610 0.01731 1.80E+10 2.48E+00 + 23 0.40741 0.64776 1.51951 0.00000 -0.12705 0.01772 1.71E+10 2.33E+00 + 24 0.42593 0.66253 1.51953 0.00000 -0.12798 0.01813 1.63E+10 2.00E+00 + 25 0.44444 0.67701 1.51955 0.00000 -0.12889 0.01853 1.56E+10 2.05E+00 + 26 0.46296 0.69120 1.51957 0.00000 -0.12978 0.01892 1.49E+10 1.96E+00 + 27 0.48148 0.70512 1.51959 0.00000 -0.13066 0.01931 1.43E+10 1.74E+00 + 28 0.50000 0.71879 1.51960 0.00000 -0.13152 0.01969 1.37E+10 1.76E+00 + 29 0.51852 0.73223 1.51962 0.00000 -0.13237 0.02006 1.32E+10 1.50E+00 + 30 0.53704 0.74544 1.51963 0.00000 -0.13320 0.02043 1.27E+10 1.83E+00 + 31 0.55556 0.75844 1.51965 0.00000 -0.13402 0.02079 1.22E+10 2.04E+00 + 32 0.57407 0.77123 1.51966 0.00000 -0.13483 0.02115 1.18E+10 1.90E+00 + 33 0.59259 0.78384 1.51968 0.00000 -0.13563 0.02150 1.14E+10 2.13E+00 + 34 0.61111 0.79626 1.51969 0.00000 -0.13642 0.02185 1.10E+10 2.28E+00 + 35 0.62963 0.80851 1.51971 0.00000 -0.13720 0.02220 1.07E+10 2.66E+00 + 36 0.64815 0.82059 1.51972 0.00000 -0.13796 0.02254 1.03E+10 3.42E+00 + 37 0.66667 0.83252 1.51973 0.00000 -0.13872 0.02288 1.00E+10 3.40E+00 + 38 0.68519 0.84429 1.51974 0.00000 -0.13947 0.02321 9.72E+09 3.97E+00 + 39 0.70370 0.85591 1.51975 0.00000 -0.14021 0.02354 9.44E+09 4.85E+00 + 40 0.72222 0.86740 1.51977 0.00000 -0.14094 0.02387 9.17E+09 5.02E+00 + 41 0.74074 0.87875 1.51978 0.00000 -0.14166 0.02419 8.92E+09 6.61E+00 + 42 0.75926 0.88997 1.51979 0.00000 -0.14238 0.02451 8.68E+09 7.46E+00 + 43 0.77778 0.90107 1.51980 0.00000 -0.14309 0.02483 8.45E+09 7.86E+00 + 44 0.79630 0.91205 1.51981 0.00000 -0.14379 0.02515 8.23E+09 1.01E+01 + 45 0.81481 0.92291 1.51982 0.00000 -0.14448 0.02546 8.02E+09 1.03E+01 + 46 0.83333 0.93366 1.51983 0.00000 -0.14517 0.02577 7.82E+09 1.25E+01 + 47 0.85185 0.94431 1.51984 0.00000 -0.14585 0.02608 7.63E+09 1.56E+01 + 48 0.87037 0.95485 1.51984 0.00000 -0.14653 0.02638 7.45E+09 1.60E+01 + 49 0.88889 0.96529 1.51985 0.00000 -0.14720 0.02669 7.27E+09 1.86E+01 + 50 0.90741 0.97563 1.51986 0.00000 -0.14786 0.02699 7.11E+09 2.30E+01 + 51 0.92593 0.98588 1.51987 0.00000 -0.14852 0.02729 6.95E+09 2.32E+01 + 52 0.94444 0.99604 1.51988 0.00000 -0.14917 0.02758 6.79E+09 2.90E+01 + 53 0.96296 1.00611 1.51988 0.00000 -0.14982 0.02788 6.64E+09 3.22E+01 + 54 0.98148 1.01610 1.51989 0.00000 -0.15046 0.02817 6.50E+09 3.53E+01 + 55 1.00000 1.02600 1.51990 0.00000 -0.15110 0.02846 0.00E+00 0.00E+00 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 7.852694E+00 6.189465E-02 + bpol**2 /(2 mu0) = 1.098237E+05 8.656265E+02 + btor**2/(2 mu0) = 1.918098E+06 1.511838E+04 + b**2/(2 mu0) = 2.027922E+06 1.598401E+04 + EKIN (3/2p) = 1.177904E+01 9.284198E-02 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 3.9894E+00 -0.0000E+00 + + From volume averages over plasma, betas are + beta total = 0.000004 + beta poloidal = 0.000072 + beta toroidal = 0.000004 + + R * Btor-vac = 0.723038 [Wb/M] + Peak Beta = 0.000008 + Beta-star = 0.000004 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 3.988265 [M] + RG (Geometric) = 3.931000 [M] + RL (Vol/2*pi*Area-Lao) = 3.968221 [M] + Poloidal Field Energy + Normalization Ratio = 0.000000 (Lao/Hirshman) + + s3 = 0.379158 + lsubi = 0.495712 + musubi = -0.960348 + betai = 0.000035 + lambda = 0.247892 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -0.014567 -0.005051 + s1 = 0.960362 0.957023 0.959194 + s2 = -0.232555 -0.229216 -0.231386 + betai (Mui + s1) = 0.000014 -0.003325 -0.001154 + lambda (s1/2 + s2) = 0.247627 0.249296 0.248211 + 1st Shafr'v relation = 0.000379 0.000379 0.000379 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = -0.001094 0.013457 0.003951 + (Betai + Li + Mui)/(2*s2) - 1 + + + EXECUTION TERMINATED NORMALLY + + FILE : solovev + NUMBER OF JACOBIAN RESETS = 0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_analytical b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_analytical new file mode 100644 index 000000000..adc0093e6 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_analytical @@ -0,0 +1,261 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 31 32 1 13 0 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 1 0.000E+00 1.000E+00 3.142E+00 2.824E+06 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 1 2000 31 100 1 1.00E-16 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + Pressure profile factor: 9.9472E+04 (multiplier for pressure) + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'power_series' + ----------------------------------- + 1.000E+00 -1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + TOROIDAL CURRENT DENSITY (*V') COEFFICIENTS ac (EXPANSION IN NORMALIZED RADIUS): + PCURR parameterization type is 'power_series' + -------------------------------------- + 9.799E-01 3.500E-02 6.562E-03 1.367E-03 2.990E-04 6.728E-05 + 1.542E-05 3.579E-06 8.389E-07 1.981E-07 4.704E-08 1.123E-08 + 2.690E-09 6.466E-10 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 3.9334E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 0 1 -1.0259E+00 0.0000E+00 0.0000E+00 1.5811E+00 + 0 2 -6.8091E-02 0.0000E+00 0.0000E+00 0.0000E+00 + 0 3 -9.0800E-03 0.0000E+00 0.0000E+00 0.0000E+00 + 0 4 -1.5163E-03 0.0000E+00 0.0000E+00 0.0000E+00 + 0 5 -2.8387E-04 0.0000E+00 0.0000E+00 0.0000E+00 + 0 6 -5.6971E-05 0.0000E+00 0.0000E+00 0.0000E+00 + 0 7 -1.1982E-05 0.0000E+00 0.0000E+00 0.0000E+00 + 0 8 -2.6065E-06 0.0000E+00 0.0000E+00 0.0000E+00 + 0 9 -5.8164E-07 0.0000E+00 0.0000E+00 0.0000E+00 + 0 10 -1.3240E-07 0.0000E+00 0.0000E+00 0.0000E+00 + 0 11 -3.0626E-08 0.0000E+00 0.0000E+00 0.0000E+00 + 0 12 -7.1779E-09 0.0000E+00 0.0000E+00 0.0000E+00 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 31 NO. FOURIER MODES = 13 FTOLV = 1.000E-16 NITER = 2000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 2.08E-02 8.63E-03 7.75E-05 1.19E-04 2.11E-02 9.15E-03 1.70E-02 2.73E-04 8.92E-05 3.94E-08 3.74E-07 2.73E-04 9.17E-05 4.27E-03 1.00E+00 3.864E+00 2.1271E+01 2.678E-01 1.012 + 100 8.89E-07 1.47E-07 4.82E-04 4.01E-04 4.89E-04 4.00E-04 2.94E-07 1.19E-10 2.30E-10 1.14E-07 2.28E-07 1.15E-07 2.21E-07 6.04E-10 1.00E+00 4.000E+00 2.1066E+01 2.703E-01 1.012 + 200 6.59E-12 1.81E-13 4.83E-04 4.00E-04 4.83E-04 4.00E-04 7.29E-14 4.97E-17 8.53E-17 1.15E-07 2.26E-07 1.15E-07 2.26E-07 3.58E-16 1.00E+00 4.000E+00 2.1067E+01 2.703E-01 1.012 + 300 6.16E-14 7.05E-16 4.83E-04 4.00E-04 4.83E-04 4.00E-04 6.10E-18 1.74E-21 2.89E-22 1.15E-07 2.26E-07 1.15E-07 2.26E-07 3.28E-20 1.00E+00 4.000E+00 2.1067E+01 2.703E-01 1.012 + 399 9.98E-17 1.15E-18 4.83E-04 4.00E-04 4.83E-04 4.00E-04 2.26E-21 8.89E-25 1.05E-25 1.15E-07 2.26E-07 1.15E-07 2.26E-07 8.47E-24 1.00E+00 4.000E+00 2.1067E+01 2.703E-01 1.012 + + MHD Energy = 2.106693E+01 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 1.52E-04 -0.0000E+00 -1.9990E+00 -7.940E+04 1.393E+05 -3.974E+01 -3.166E+04 1.000 9.947E+04 0.000E+00 2.530E+00 3.523E+05 4.000E-01 + 3.33E-02 9.30E-05 1.0472E-01 -1.9996E+00 -7.980E+04 1.394E+05 -3.974E+01 -3.166E+04 1.001 9.616E+04 -1.846E-02 2.519E+00 3.527E+05 4.042E-01 + 6.67E-02 3.42E-05 2.0944E-01 -1.9999E+00 -8.021E+04 1.396E+05 -3.974E+01 -3.166E+04 1.001 9.284E+04 -3.694E-02 2.509E+00 3.532E+05 4.083E-01 + 1.00E-01 1.74E-05 3.1416E-01 -1.9999E+00 -8.057E+04 1.398E+05 -3.974E+01 -3.166E+04 1.002 8.952E+04 -5.544E-02 2.498E+00 3.536E+05 4.125E-01 + 1.33E-01 1.18E-05 4.1888E-01 -1.9999E+00 -8.092E+04 1.399E+05 -3.974E+01 -3.166E+04 1.003 8.621E+04 -7.397E-02 2.487E+00 3.541E+05 4.167E-01 + 1.67E-01 1.13E-05 5.2360E-01 -2.0000E+00 -8.127E+04 1.401E+05 -3.974E+01 -3.166E+04 1.004 8.289E+04 -9.252E-02 2.477E+00 3.545E+05 4.208E-01 + 2.00E-01 1.07E-05 6.2832E-01 -2.0000E+00 -8.163E+04 1.403E+05 -3.974E+01 -3.166E+04 1.004 7.958E+04 -1.111E-01 2.466E+00 3.550E+05 4.250E-01 + 2.33E-01 9.79E-06 7.3304E-01 -2.0000E+00 -8.199E+04 1.405E+05 -3.974E+01 -3.166E+04 1.005 7.626E+04 -1.297E-01 2.455E+00 3.555E+05 4.292E-01 + 2.67E-01 8.96E-06 8.3776E-01 -2.0000E+00 -8.236E+04 1.407E+05 -3.974E+01 -3.166E+04 1.006 7.295E+04 -1.483E-01 2.444E+00 3.560E+05 4.333E-01 + 3.00E-01 8.27E-06 9.4248E-01 -2.0000E+00 -8.273E+04 1.408E+05 -3.974E+01 -3.166E+04 1.007 6.963E+04 -1.669E-01 2.433E+00 3.565E+05 4.375E-01 + 3.33E-01 7.71E-06 1.0472E+00 -2.0000E+00 -8.311E+04 1.410E+05 -3.974E+01 -3.166E+04 1.007 6.631E+04 -1.856E-01 2.422E+00 3.570E+05 4.417E-01 + 3.67E-01 7.23E-06 1.1519E+00 -2.0000E+00 -8.349E+04 1.412E+05 -3.974E+01 -3.166E+04 1.008 6.300E+04 -2.043E-01 2.411E+00 3.575E+05 4.458E-01 + 4.00E-01 6.84E-06 1.2566E+00 -2.0000E+00 -8.387E+04 1.414E+05 -3.974E+01 -3.166E+04 1.009 5.968E+04 -2.230E-01 2.400E+00 3.581E+05 4.500E-01 + 4.33E-01 6.51E-06 1.3614E+00 -2.0000E+00 -8.427E+04 1.416E+05 -3.974E+01 -3.166E+04 1.010 5.637E+04 -2.418E-01 2.389E+00 3.587E+05 4.542E-01 + 4.67E-01 6.23E-06 1.4661E+00 -2.0000E+00 -8.466E+04 1.418E+05 -3.974E+01 -3.166E+04 1.010 5.305E+04 -2.605E-01 2.378E+00 3.592E+05 4.583E-01 + 5.00E-01 5.98E-06 1.5708E+00 -2.0000E+00 -8.506E+04 1.420E+05 -3.974E+01 -3.166E+04 1.011 4.974E+04 -2.793E-01 2.366E+00 3.598E+05 4.625E-01 + 5.33E-01 5.78E-06 1.6755E+00 -2.0000E+00 -8.547E+04 1.422E+05 -3.974E+01 -3.166E+04 1.012 4.642E+04 -2.982E-01 2.355E+00 3.604E+05 4.667E-01 + 5.67E-01 5.60E-06 1.7802E+00 -2.0000E+00 -8.589E+04 1.424E+05 -3.974E+01 -3.166E+04 1.013 4.310E+04 -3.170E-01 2.344E+00 3.610E+05 4.708E-01 + 6.00E-01 5.44E-06 1.8850E+00 -2.0000E+00 -8.631E+04 1.426E+05 -3.974E+01 -3.166E+04 1.014 3.979E+04 -3.359E-01 2.332E+00 3.617E+05 4.750E-01 + 6.33E-01 5.31E-06 1.9897E+00 -2.0000E+00 -8.673E+04 1.428E+05 -3.974E+01 -3.166E+04 1.015 3.647E+04 -3.548E-01 2.321E+00 3.623E+05 4.792E-01 + 6.67E-01 5.19E-06 2.0944E+00 -2.0000E+00 -8.717E+04 1.431E+05 -3.974E+01 -3.166E+04 1.015 3.316E+04 -3.737E-01 2.309E+00 3.630E+05 4.833E-01 + 7.00E-01 5.09E-06 2.1991E+00 -2.0000E+00 -8.761E+04 1.433E+05 -3.974E+01 -3.166E+04 1.016 2.984E+04 -3.927E-01 2.298E+00 3.636E+05 4.875E-01 + 7.33E-01 5.00E-06 2.3038E+00 -2.0000E+00 -8.805E+04 1.435E+05 -3.974E+01 -3.166E+04 1.017 2.653E+04 -4.117E-01 2.286E+00 3.643E+05 4.917E-01 + 7.67E-01 4.93E-06 2.4086E+00 -2.0000E+00 -8.850E+04 1.437E+05 -3.974E+01 -3.166E+04 1.018 2.321E+04 -4.307E-01 2.274E+00 3.650E+05 4.958E-01 + 8.00E-01 4.86E-06 2.5133E+00 -2.0000E+00 -8.896E+04 1.440E+05 -3.974E+01 -3.166E+04 1.019 1.989E+04 -4.498E-01 2.263E+00 3.658E+05 5.000E-01 + 8.33E-01 4.82E-06 2.6180E+00 -2.0000E+00 -8.943E+04 1.442E+05 -3.974E+01 -3.166E+04 1.020 1.658E+04 -4.689E-01 2.251E+00 3.665E+05 5.042E-01 + 8.67E-01 4.76E-06 2.7227E+00 -2.0000E+00 -8.991E+04 1.444E+05 -3.974E+01 -3.166E+04 1.021 1.326E+04 -4.880E-01 2.239E+00 3.673E+05 5.083E-01 + 9.00E-01 4.75E-06 2.8274E+00 -2.0000E+00 -9.039E+04 1.447E+05 -3.974E+01 -3.166E+04 1.022 9.947E+03 -5.071E-01 2.227E+00 3.680E+05 5.125E-01 + 9.33E-01 4.69E-06 2.9322E+00 -2.0000E+00 -9.088E+04 1.449E+05 -3.974E+01 -3.166E+04 1.023 6.631E+03 -5.263E-01 2.215E+00 3.688E+05 5.167E-01 + 9.67E-01 4.71E-06 3.0369E+00 -2.0000E+00 -9.138E+04 1.452E+05 -3.974E+01 -3.166E+04 1.024 3.316E+03 -5.455E-01 2.203E+00 3.696E+05 5.208E-01 + 1.00E+00 4.74E-06 3.1416E+00 -2.0000E+00 -9.187E+04 1.454E+05 -3.974E+01 -3.166E+04 1.025 5.522E-12 -5.647E-01 2.191E+00 3.705E+05 5.250E-01 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.668960 + BMAX(u=0) = 0.668960 + BMIN(u=pi) = 0.918791 + BMAX(u=pi) = 0.918791 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 3.061383 + Mean Elongation = 1.585905 + Plasma Volume = 124.841718 [M**3] + Cross Sectional Area = 5.095945 [M**2] + Normal Surface Area = 203.400174 [M**2] + Poloidal Circumference= 8.289714 [M] + Major Radius = 3.899017 [M] (from Volume and Cross Section) + Minor Radius = 1.273613 [M] (from Cross Section) + Minimum (inboard) R = 2.828427 [M] + Maximum (outboard) R = 4.898979 [M] + Maximum height Z = 1.581139 [M] + Waist (v = 0) in R = 2.070552 [M] + Full Height(v = 0) = 3.162278 [M] + Toroidal Flux = 3.141593 [Wb] + Toroidal Current = 2.823691 [MA] + RBtor(s=1) = 2.190928 [T-m] + RBtor(s=0) = 2.529794 [T-m] + Volume Average B = 0.680072 [T] + Ion Larmor Radius = 0.004705 [M] X Ti(keV)**0.5 + / = 9.098278 (Vol. Averaged) + / = 0.174574 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 -0.20936 0.18279 1.57900 0.00000 -0.01187 0.01128 1.34E+02 2.45E-01 + 3 -0.41879 0.25876 1.57753 0.00000 -0.01660 0.01600 6.69E+01 2.61E-01 + 4 -0.62822 0.31725 1.57599 0.00000 -0.02032 0.01967 4.45E+01 2.58E-01 + 5 -0.83765 0.36671 1.57436 0.00000 -0.02348 0.02278 3.33E+01 2.51E-01 + 6 -1.04709 0.41043 1.57271 0.00000 -0.02627 0.02555 2.66E+01 2.44E-01 + 7 -1.25652 0.45009 1.57103 0.00000 -0.02880 0.02806 2.21E+01 2.38E-01 + 8 -1.46596 0.48667 1.56933 0.00000 -0.03114 0.03038 1.90E+01 2.31E-01 + 9 -1.67539 0.52084 1.56763 0.00000 -0.03332 0.03255 1.66E+01 2.25E-01 + 10 -1.88483 0.55305 1.56591 0.00000 -0.03537 0.03459 1.47E+01 2.19E-01 + 11 -2.09427 0.58361 1.56418 0.00000 -0.03732 0.03654 1.32E+01 2.14E-01 + 12 -2.30370 0.61277 1.56244 0.00000 -0.03917 0.03840 1.20E+01 2.08E-01 + 13 -2.51314 0.64074 1.56069 0.00000 -0.04095 0.04018 1.10E+01 2.03E-01 + 14 -2.72258 0.66766 1.55893 0.00000 -0.04267 0.04190 1.02E+01 1.98E-01 + 15 -2.93201 0.69365 1.55716 0.00000 -0.04432 0.04357 9.46E+00 1.93E-01 + 16 -3.14145 0.71882 1.55538 0.00000 -0.04591 0.04518 8.83E+00 1.89E-01 + 17 -3.35089 0.74325 1.55359 0.00000 -0.04746 0.04675 8.28E+00 1.85E-01 + 18 -3.56032 0.76701 1.55178 0.00000 -0.04897 0.04828 7.80E+00 1.80E-01 + 19 -3.76976 0.79017 1.54997 0.00000 -0.05043 0.04978 7.38E+00 1.76E-01 + 20 -3.97920 0.81278 1.54814 0.00000 -0.05186 0.05123 7.00E+00 1.73E-01 + 21 -4.18863 0.83489 1.54630 0.00000 -0.05326 0.05266 6.65E+00 1.69E-01 + 22 -4.39807 0.85653 1.54445 0.00000 -0.05462 0.05407 6.34E+00 1.65E-01 + 23 -4.60751 0.87775 1.54259 0.00000 -0.05596 0.05544 6.06E+00 1.62E-01 + 24 -4.81694 0.89856 1.54072 0.00000 -0.05727 0.05680 5.81E+00 1.58E-01 + 25 -5.02638 0.91901 1.53884 0.00000 -0.05855 0.05813 5.58E+00 1.55E-01 + 26 -5.23582 0.93912 1.53694 0.00000 -0.05981 0.05944 5.36E+00 1.52E-01 + 27 -5.44526 0.95891 1.53503 0.00000 -0.06106 0.06073 5.17E+00 1.49E-01 + 28 -5.65469 0.97840 1.53311 0.00000 -0.06228 0.06201 4.99E+00 1.46E-01 + 29 -5.86413 0.99762 1.53117 0.00000 -0.06348 0.06327 4.82E+00 1.43E-01 + 30 -6.07357 1.01657 1.52922 0.00000 -0.06466 0.06451 4.66E+00 1.40E-01 + 31 -6.28300 1.03528 1.52726 0.00000 -0.06583 0.06575 0.00E+00 0.00E+00 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 6.209123E+06 4.973596E+04 + bpol**2 /(2 mu0) = 4.403622E+06 3.527364E+04 + btor**2/(2 mu0) = 1.857003E+07 1.487486E+05 + b**2/(2 mu0) = 2.297365E+07 1.840223E+05 + EKIN (3/2p) = 9.313684E+06 7.460394E+04 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 3.9998E+00 -0.0000E+00 + + From volume averages over plasma, betas are + beta total = 0.270271 + beta poloidal = 1.410004 + beta toroidal = 0.334363 + + R * Btor-vac = 2.190928 [Wb/M] + Peak Beta = 0.624767 + Beta-star = 0.312039 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 3.895216 [M] + RG (Geometric) = 3.863703 [M] + RL (Vol/2*pi*Area-Lao) = 3.899017 [M] + Poloidal Field Energy + Normalization Ratio = 0.990653 (Lao/Hirshman) + + s3 = 0.381033 + lsubi = 0.479311 + musubi = -0.282748 + betai = 0.675831 + lambda = 0.915486 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -0.008156 0.000975 + s1 = 0.958571 0.962098 0.958145 + s2 = 0.435951 0.432425 0.436377 + betai (Mui + s1) = 0.675823 0.679349 0.675397 + lambda (s1/2 + s2) = 0.915237 0.913473 0.915449 + 1st Shafr'v relation = 0.000182 0.000182 0.000182 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = 0.000563 0.008724 -0.000412 + (Betai + Li + Mui)/(2*s2) - 1 + + + EXECUTION TERMINATED NORMALLY + + FILE : solovev_analytical + NUMBER OF JACOBIAN RESETS = 1 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_free_bdy b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_free_bdy new file mode 100644 index 000000000..725f9d199 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_free_bdy @@ -0,0 +1,342 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + + VACUUM FIELD PARAMETERS: + ------------------------ + nr-grid nz-grid np-grid rmin rmax zmin zmax input-file + 201 201 1 2.000 6.000 -2.000 2.000 mgrid_solovev.nc + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 32 30 1 12 0 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 1 0.000E+00 1.000E+00 1.000E+00 0.000E+00 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 0 20000 16 100 6 1.00E-14 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + EXTERNAL CURRENTS + ----------------- + circuit_0 circuit_1 circuit_2 circuit_3 circuit_4 + 3.8845E+06 -2.9356E+05 -1.7349E+04 6.0021E+04 6.0025E+04 + circuit_5 circuit_6 circuit_7 circuit_8 circuit_9 + -1.7350E+04 -2.9355E+05 -3.5606E+05 -6.5884E+04 -1.1544E+04 + circuit_10 circuit_11 circuit_12 + -1.1535E+04 -6.5883E+04 -3.5606E+05 + + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'power_series' + ----------------------------------- + 1.250E-01 -1.250E-01 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + IOTA PROFILE COEFFICIENTS ai (EXPANSION IN NORMALIZED RADIUS): + PIOTA parameterization type is 'power_series' + ----------------------------------- + 4.900E-01 -3.000E-01 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 3.9990E+00 0.0000E+00 0.0000E+00 0.0000E+00 3.9990E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 0 1 1.0260E+00 0.0000E+00 0.0000E+00 1.5800E+00 + 0 2 6.8000E-02 0.0000E+00 0.0000E+00 -1.0000E-02 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 16 NO. FOURIER MODES = 12 FTOLV = 1.000E-10 NITER = 10000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA PHIEDGE DEL-BSQ FEDGE + + 1 1.19E-02 9.45E-06 1.77E-34 3.48E-34 1.19E-02 9.45E-06 4.58E-03 4.53E-04 1.41E-07 1.86E-39 2.38E-38 4.53E-04 1.41E-07 1.25E-03 9.00E-01 3.999E+00 2.4714E+00 4.085E-06 1.000E+00 0.000 0.00E+00 + + VACUUM PRESSURE TURNED ON AT 4 ITERATIONS + + 100 4.54E-07 4.77E-07 3.05E-03 2.92E-02 3.04E-03 2.92E-02 1.65E-07 5.44E-09 8.78E-09 6.03E-06 4.40E-04 5.94E-06 4.42E-04 4.76E-09 9.00E-01 4.010E+00 2.4593E+00 4.078E-06 1.000E+00 0.001 2.68E-06 + 200 1.48E-08 1.91E-09 3.02E-03 2.86E-02 3.02E-03 2.86E-02 3.50E-09 2.77E-10 5.92E-12 5.38E-06 4.72E-04 5.39E-06 4.72E-04 2.02E-11 9.00E-01 4.069E+00 2.4597E+00 4.133E-06 1.000E+00 0.000 1.37E-07 + 300 1.55E-09 1.91E-10 3.03E-03 2.87E-02 3.03E-03 2.87E-02 2.92E-10 6.46E-12 1.06E-13 5.29E-06 4.76E-04 5.29E-06 4.76E-04 8.38E-13 9.00E-01 4.091E+00 2.4597E+00 4.174E-06 1.000E+00 0.000 2.87E-09 + 400 1.75E-10 1.88E-11 3.03E-03 2.88E-02 3.03E-03 2.88E-02 1.89E-11 1.43E-13 6.64E-15 5.27E-06 4.77E-04 5.27E-06 4.77E-04 3.05E-14 9.00E-01 4.094E+00 2.4598E+00 4.180E-06 1.000E+00 0.000 2.97E-10 + 419 9.79E-11 1.07E-11 3.03E-03 2.88E-02 3.03E-03 2.88E-02 1.12E-11 9.03E-14 7.06E-15 5.27E-06 4.77E-04 5.27E-06 4.77E-04 1.73E-14 9.00E-01 4.094E+00 2.4598E+00 4.181E-06 1.000E+00 0.000 1.91E-10 + + MHD Energy = 2.459753E+00 + + NS = 32 NO. FOURIER MODES = 12 FTOLV = 1.000E-14 NITER = 20000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA PHIEDGE DEL-BSQ FEDGE + + 1 3.14E+00 1.18E+00 2.12E-08 3.49E-08 3.14E+00 1.18E+00 1.65E-06 1.17E-03 2.92E-03 4.09E-12 4.96E-11 1.17E-03 2.92E-03 6.09E-08 9.00E-01 4.094E+00 2.4598E+00 4.181E-06 1.000E+00 0.000 4.31E+00 + 100 2.89E-08 1.29E-08 1.02E-05 5.55E-05 1.01E-05 5.54E-05 6.37E-09 4.76E-12 1.68E-10 3.28E-09 1.30E-07 3.15E-09 1.23E-07 1.60E-11 9.00E-01 4.102E+00 2.4595E+00 4.199E-06 1.000E+00 0.000 1.44E-07 + 200 4.10E-10 5.79E-11 1.11E-05 5.76E-05 1.11E-05 5.76E-05 4.59E-11 7.65E-12 8.05E-13 2.91E-09 1.30E-07 2.88E-09 1.30E-07 2.49E-13 9.00E-01 4.100E+00 2.4596E+00 4.191E-06 1.000E+00 0.000 1.73E-08 + 300 1.38E-10 5.43E-12 1.11E-05 5.71E-05 1.11E-05 5.71E-05 1.44E-11 3.19E-13 1.22E-14 2.64E-09 1.31E-07 2.63E-09 1.31E-07 2.02E-14 9.00E-01 4.096E+00 2.4596E+00 4.183E-06 1.000E+00 0.000 2.13E-09 + 400 4.54E-11 9.08E-13 1.13E-05 5.69E-05 1.13E-05 5.69E-05 2.39E-12 2.36E-15 9.89E-16 2.55E-09 1.32E-07 2.55E-09 1.32E-07 4.79E-15 9.00E-01 4.095E+00 2.4596E+00 4.181E-06 1.000E+00 0.000 3.66E-10 + 500 9.27E-12 3.39E-13 1.14E-05 5.68E-05 1.14E-05 5.68E-05 3.45E-13 3.29E-15 5.90E-17 2.51E-09 1.32E-07 2.51E-09 1.32E-07 7.19E-16 9.00E-01 4.095E+00 2.4596E+00 4.181E-06 1.000E+00 0.000 2.93E-11 + 600 1.34E-13 2.82E-14 1.14E-05 5.68E-05 1.14E-05 5.68E-05 1.78E-14 5.81E-16 8.59E-18 2.49E-09 1.33E-07 2.49E-09 1.33E-07 2.66E-17 9.00E-01 4.095E+00 2.4596E+00 4.182E-06 1.000E+00 0.000 2.39E-12 + 700 4.04E-14 2.09E-15 1.14E-05 5.68E-05 1.14E-05 5.68E-05 5.57E-15 2.37E-18 1.59E-18 2.47E-09 1.33E-07 2.47E-09 1.33E-07 9.58E-18 9.00E-01 4.095E+00 2.4596E+00 4.182E-06 1.000E+00 0.000 6.02E-13 + 773 9.91E-15 4.17E-16 1.14E-05 5.67E-05 1.14E-05 5.67E-05 6.98E-16 8.98E-18 1.91E-19 2.45E-09 1.33E-07 2.45E-09 1.33E-07 1.14E-18 9.00E-01 4.095E+00 2.4596E+00 4.182E-06 1.000E+00 0.000 5.02E-14 + + MHD Energy = 2.459613E+00 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 1.82E-03 -0.0000E+00 4.9000E-01 -4.577E+03 -9.388E+03 -1.344E+02 -1.250E-01 1.000 1.250E-01 0.000E+00 7.844E-01 -7.364E+03 3.668E-02 + 3.23E-02 1.31E-03 3.2258E-02 4.8032E-01 -4.353E+03 -9.089E+03 -1.341E+02 -1.250E-01 1.000 1.210E-01 1.268E-03 7.838E-01 -7.129E+03 3.675E-02 + 6.45E-02 8.00E-04 6.4516E-02 4.7065E-01 -4.129E+03 -8.789E+03 -1.338E+02 -1.250E-01 1.001 1.169E-01 2.497E-03 7.832E-01 -6.893E+03 3.682E-02 + 9.68E-02 6.29E-04 9.6774E-02 4.6097E-01 -3.907E+03 -8.488E+03 -1.336E+02 -1.250E-01 1.001 1.129E-01 3.683E-03 7.826E-01 -6.658E+03 3.690E-02 + 1.29E-01 4.58E-04 1.2903E-01 4.5129E-01 -3.690E+03 -8.186E+03 -1.333E+02 -1.250E-01 1.002 1.089E-01 4.826E-03 7.821E-01 -6.421E+03 3.697E-02 + 1.61E-01 3.37E-04 1.6129E-01 4.4161E-01 -3.478E+03 -7.883E+03 -1.330E+02 -1.250E-01 1.002 1.048E-01 5.924E-03 7.816E-01 -6.182E+03 3.706E-02 + 1.94E-01 2.51E-04 1.9355E-01 4.3194E-01 -3.270E+03 -7.577E+03 -1.327E+02 -1.250E-01 1.003 1.008E-01 6.978E-03 7.812E-01 -5.942E+03 3.714E-02 + 2.26E-01 1.92E-04 2.2581E-01 4.2226E-01 -3.068E+03 -7.269E+03 -1.323E+02 -1.250E-01 1.003 9.677E-02 7.988E-03 7.807E-01 -5.700E+03 3.723E-02 + 2.58E-01 1.52E-04 2.5806E-01 4.1258E-01 -2.870E+03 -6.959E+03 -1.320E+02 -1.250E-01 1.004 9.274E-02 8.954E-03 7.803E-01 -5.456E+03 3.731E-02 + 2.90E-01 1.26E-04 2.9032E-01 4.0290E-01 -2.677E+03 -6.647E+03 -1.317E+02 -1.250E-01 1.004 8.871E-02 9.875E-03 7.800E-01 -5.211E+03 3.740E-02 + 3.23E-01 1.08E-04 3.2258E-01 3.9323E-01 -2.489E+03 -6.333E+03 -1.313E+02 -1.250E-01 1.005 8.468E-02 1.075E-02 7.796E-01 -4.964E+03 3.750E-02 + 3.55E-01 9.52E-05 3.5484E-01 3.8355E-01 -2.306E+03 -6.016E+03 -1.310E+02 -1.250E-01 1.005 8.065E-02 1.158E-02 7.793E-01 -4.715E+03 3.760E-02 + 3.87E-01 8.42E-05 3.8710E-01 3.7387E-01 -2.129E+03 -5.697E+03 -1.306E+02 -1.250E-01 1.006 7.661E-02 1.237E-02 7.790E-01 -4.465E+03 3.769E-02 + 4.19E-01 7.36E-05 4.1935E-01 3.6419E-01 -1.957E+03 -5.376E+03 -1.302E+02 -1.250E-01 1.006 7.258E-02 1.311E-02 7.787E-01 -4.212E+03 3.780E-02 + 4.52E-01 6.25E-05 4.5161E-01 3.5452E-01 -1.790E+03 -5.053E+03 -1.299E+02 -1.250E-01 1.007 6.855E-02 1.381E-02 7.785E-01 -3.958E+03 3.790E-02 + 4.84E-01 5.02E-05 4.8387E-01 3.4484E-01 -1.629E+03 -4.728E+03 -1.295E+02 -1.250E-01 1.008 6.452E-02 1.446E-02 7.782E-01 -3.703E+03 3.801E-02 + 5.16E-01 3.63E-05 5.1613E-01 3.3516E-01 -1.474E+03 -4.401E+03 -1.291E+02 -1.250E-01 1.009 6.048E-02 1.506E-02 7.780E-01 -3.446E+03 3.812E-02 + 5.48E-01 2.05E-05 5.4839E-01 3.2548E-01 -1.324E+03 -4.072E+03 -1.287E+02 -1.250E-01 1.009 5.645E-02 1.563E-02 7.779E-01 -3.188E+03 3.824E-02 + 5.81E-01 2.50E-06 5.8065E-01 3.1581E-01 -1.181E+03 -3.741E+03 -1.282E+02 -1.250E-01 1.010 5.242E-02 1.614E-02 7.777E-01 -2.929E+03 3.835E-02 + 6.13E-01 -1.80E-05 6.1290E-01 3.0613E-01 -1.043E+03 -3.409E+03 -1.278E+02 -1.250E-01 1.011 4.839E-02 1.661E-02 7.775E-01 -2.668E+03 3.848E-02 + 6.45E-01 -4.12E-05 6.4516E-01 2.9645E-01 -9.114E+02 -3.077E+03 -1.274E+02 -1.250E-01 1.012 4.435E-02 1.704E-02 7.774E-01 -2.407E+03 3.860E-02 + 6.77E-01 -6.68E-05 6.7742E-01 2.8677E-01 -7.861E+02 -2.744E+03 -1.269E+02 -1.250E-01 1.013 4.032E-02 1.742E-02 7.773E-01 -2.146E+03 3.874E-02 + 7.10E-01 -9.41E-05 7.0968E-01 2.7710E-01 -6.673E+02 -2.411E+03 -1.264E+02 -1.250E-01 1.014 3.629E-02 1.775E-02 7.772E-01 -1.885E+03 3.887E-02 + 7.42E-01 -1.20E-04 7.4194E-01 2.6742E-01 -5.552E+02 -2.078E+03 -1.259E+02 -1.250E-01 1.015 3.226E-02 1.804E-02 7.771E-01 -1.625E+03 3.901E-02 + 7.74E-01 -1.39E-04 7.7419E-01 2.5774E-01 -4.499E+02 -1.748E+03 -1.254E+02 -1.250E-01 1.017 2.823E-02 1.829E-02 7.771E-01 -1.367E+03 3.916E-02 + 8.06E-01 -1.35E-04 8.0645E-01 2.4806E-01 -3.517E+02 -1.421E+03 -1.249E+02 -1.250E-01 1.018 2.419E-02 1.849E-02 7.770E-01 -1.110E+03 3.931E-02 + 8.39E-01 -6.84E-05 8.3871E-01 2.3839E-01 -2.608E+02 -1.097E+03 -1.244E+02 -1.250E-01 1.019 2.016E-02 1.865E-02 7.770E-01 -8.572E+02 3.947E-02 + 8.71E-01 1.77E-04 8.7097E-01 2.2871E-01 -1.773E+02 -7.790E+02 -1.238E+02 -1.250E-01 1.021 1.613E-02 1.877E-02 7.769E-01 -6.086E+02 3.964E-02 + 9.03E-01 1.09E-03 9.0323E-01 2.1903E-01 -1.016E+02 -4.684E+02 -1.233E+02 -1.250E-01 1.023 1.210E-02 1.885E-02 7.769E-01 -3.658E+02 3.981E-02 + 9.35E-01 4.63E-03 9.3548E-01 2.0935E-01 -3.407E+01 -1.681E+02 -1.227E+02 -1.250E-01 1.025 8.065E-03 1.889E-02 7.769E-01 -1.312E+02 3.999E-02 + 9.68E-01 2.71E-02 9.6774E-01 1.9968E-01 2.934E+01 1.352E+02 -1.221E+02 -1.250E-01 1.027 4.032E-03 1.889E-02 7.769E-01 1.056E+02 4.018E-02 + 1.00E+00 4.96E-02 1.0000E+00 1.9000E-01 9.339E+01 4.416E+02 -1.215E+02 -1.250E-01 1.030 -2.830E-17 1.888E-02 7.769E-01 3.424E+02 4.038E-02 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.153588 + BMAX(u=0) = 0.153588 + BMIN(u=pi) = 0.255978 + BMAX(u=pi) = 0.255978 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 3.166379 + Mean Elongation = 1.566562 + Plasma Volume = 128.837682 [M**3] + Cross Sectional Area = 5.088425 [M**2] + Normal Surface Area = 209.655807 [M**2] + Poloidal Circumference= 8.294244 [M] + Major Radius = 4.029764 [M] (from Volume and Cross Section) + Minor Radius = 1.272673 [M] (from Cross Section) + Minimum (inboard) R = 3.040690 [M] + Maximum (outboard) R = 5.092664 [M] + Maximum height Z = 1.579343 [M] + Waist (v = 0) in R = 2.051974 [M] + Full Height(v = 0) = 3.158686 [M] + Toroidal Flux = 1.000000 [Wb] + Toroidal Current = -0.094386 [MA] + RBtor(s=1) = 0.776921 [T-m] + RBtor(s=0) = 0.784378 [T-m] + Volume Average B = 0.195401 [T] + Ion Larmor Radius = 0.016377 [M] X Ti(keV)**0.5 + / = ************** (Vol. Averaged) + / = 7744.058575 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 0.01565 0.19621 1.38456 0.00000 0.05705 0.00206 3.94E+10 5.87E+05 + 3 0.03099 0.27720 1.38699 0.00000 0.05863 0.00283 1.82E+10 2.67E+05 + 4 0.04601 0.33907 1.38988 0.00000 0.06007 0.00347 1.12E+10 9.18E+04 + 5 0.06073 0.39101 1.39290 0.00000 0.06139 0.00404 7.73E+09 3.67E+04 + 6 0.07513 0.43656 1.39602 0.00000 0.06261 0.00457 5.67E+09 1.91E+04 + 7 0.08922 0.47754 1.39923 0.00000 0.06377 0.00506 4.32E+09 1.29E+04 + 8 0.10300 0.51504 1.40252 0.00000 0.06488 0.00554 3.37E+09 9.62E+03 + 9 0.11646 0.54977 1.40590 0.00000 0.06596 0.00599 2.67E+09 7.27E+03 + 10 0.12961 0.58221 1.40937 0.00000 0.06700 0.00642 2.14E+09 5.48E+03 + 11 0.14246 0.61272 1.41294 0.00000 0.06803 0.00684 1.72E+09 4.20E+03 + 12 0.15498 0.64156 1.41663 0.00000 0.06905 0.00725 1.40E+09 3.31E+03 + 13 0.16720 0.66895 1.42043 0.00000 0.07006 0.00764 1.13E+09 2.72E+03 + 14 0.17911 0.69505 1.42437 0.00000 0.07108 0.00803 9.19E+08 2.31E+03 + 15 0.19070 0.71999 1.42846 0.00000 0.07210 0.00840 7.44E+08 2.02E+03 + 16 0.20198 0.74387 1.43271 0.00000 0.07313 0.00877 5.99E+08 1.80E+03 + 17 0.21294 0.76679 1.43713 0.00000 0.07417 0.00912 4.80E+08 1.63E+03 + 18 0.22360 0.78882 1.44173 0.00000 0.07524 0.00948 3.81E+08 1.47E+03 + 19 0.23394 0.81003 1.44655 0.00000 0.07633 0.00982 2.99E+08 1.32E+03 + 20 0.24398 0.83045 1.45158 0.00000 0.07745 0.01016 2.31E+08 1.17E+03 + 21 0.25369 0.85015 1.45686 0.00000 0.07860 0.01050 1.76E+08 1.02E+03 + 22 0.26310 0.86916 1.46241 0.00000 0.07980 0.01083 1.31E+08 8.59E+02 + 23 0.27220 0.88750 1.46824 0.00000 0.08104 0.01116 9.49E+07 7.01E+02 + 24 0.28098 0.90521 1.47438 0.00000 0.08233 0.01149 6.62E+07 5.65E+02 + 25 0.28945 0.92231 1.48087 0.00000 0.08368 0.01181 4.40E+07 4.93E+02 + 26 0.29761 0.93881 1.48773 0.00000 0.08510 0.01213 2.73E+07 5.68E+02 + 27 0.30545 0.95474 1.49501 0.00000 0.08660 0.01245 1.53E+07 9.38E+02 + 28 0.31299 0.97009 1.50275 0.00000 0.08818 0.01276 7.28E+06 1.86E+03 + 29 0.32021 0.98489 1.51100 0.00000 0.08987 0.01308 2.48E+06 3.80E+03 + 30 0.32712 0.99914 1.51980 0.00000 0.09167 0.01339 3.06E+05 6.42E+03 + 31 0.33371 1.01284 1.52923 0.00000 0.09360 0.01369 2.18E+05 3.57E+04 + 32 0.34000 1.02599 1.53934 0.00000 0.09567 0.01399 0.00E+00 0.00E+00 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 8.184909E+00 6.352885E-02 + bpol**2 /(2 mu0) = 9.855975E+03 7.649916E+01 + btor**2/(2 mu0) = 1.947450E+06 1.511553E+04 + b**2/(2 mu0) = 1.957306E+06 1.519203E+04 + EKIN (3/2p) = 1.227736E+01 9.529327E-02 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 4.0954E+00 -0.0000E+00 + + From volume averages over plasma, betas are + beta total = 0.000004 + beta poloidal = 0.000830 + beta toroidal = 0.000004 + + R * Btor-vac = 0.776921 [Wb/M] + Peak Beta = 0.000009 + Beta-star = 0.000005 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 10.354617 [M] + RG (Geometric) = 4.066677 [M] + RL (Vol/2*pi*Area-Lao) = 4.029764 [M] + Poloidal Field Energy + Normalization Ratio = 0.000000 (Lao/Hirshman) + + s3 = 0.293030 + lsubi = 0.898744 + musubi = -0.936043 + betai = 0.000746 + lambda = 0.450118 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -1.546211 -1.569534 + s1 = 0.939700 0.925602 0.925519 + s2 = -0.023216 -0.009118 -0.009035 + betai (Mui + s1) = 0.003657 -0.010441 -0.010524 + lambda (s1/2 + s2) = 0.446634 0.453683 0.453724 + 1st Shafr'v relation = 0.002214 0.002214 0.002214 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = -0.212784 1.004417 1.022778 + (Betai + Li + Mui)/(2*s2) - 1 + + + NF*PHI Rb Zb BSQMHDI BSQVACI BSQMHDF BSQVACF + + 0.00E+00 5.0927E+00 0.0000E+00 1.0244E-02 1.1762E-02 1.1765E-02 1.1766E-02 + 0.00E+00 5.0649E+00 3.2096E-01 1.0389E-02 1.1890E-02 1.1891E-02 1.1891E-02 + 0.00E+00 4.9842E+00 6.2707E-01 1.0832E-02 1.2275E-02 1.2265E-02 1.2266E-02 + 0.00E+00 4.8575E+00 9.0527E-01 1.1587E-02 1.2930E-02 1.2893E-02 1.2893E-02 + 0.00E+00 4.6944E+00 1.1449E+00 1.2682E-02 1.3870E-02 1.3779E-02 1.3779E-02 + 0.00E+00 4.5052E+00 1.3380E+00 1.4147E-02 1.5112E-02 1.4935E-02 1.4936E-02 + 0.00E+00 4.2994E+00 1.4787E+00 1.6016E-02 1.6667E-02 1.6376E-02 1.6377E-02 + 0.00E+00 4.0854E+00 1.5612E+00 1.8311E-02 1.8526E-02 1.8119E-02 1.8121E-02 + 0.00E+00 3.8704E+00 1.5793E+00 2.1029E-02 2.0654E-02 2.0180E-02 2.0180E-02 + 0.00E+00 3.6634E+00 1.5263E+00 2.4118E-02 2.2974E-02 2.2522E-02 2.2523E-02 + 0.00E+00 3.4760E+00 1.3994E+00 2.7458E-02 2.5372E-02 2.5027E-02 2.5026E-02 + 0.00E+00 3.3185E+00 1.2044E+00 3.0848E-02 2.7697E-02 2.7486E-02 2.7484E-02 + 0.00E+00 3.1960E+00 9.5297E-01 3.4011E-02 2.9778E-02 2.9676E-02 2.9674E-02 + 0.00E+00 3.1094E+00 6.5898E-01 3.6622E-02 3.1439E-02 3.1409E-02 3.1406E-02 + 0.00E+00 3.0578E+00 3.3664E-01 3.8356E-02 3.2514E-02 3.2526E-02 3.2523E-02 + 0.00E+00 3.0407E+00 9.1826E-16 3.8965E-02 3.2888E-02 3.2914E-02 3.2910E-02 + + NF*PHI Rb Zb BR BPHI BZ BRv BPHIv BZv + + 0.00E+00 5.0927E+00 0.0000E+00 0.00E+00 1.53E-01 1.61E-02 0.00E+00 1.53E-01 1.61E-02 + 0.00E+00 5.0649E+00 3.2096E-01 -2.73E-03 1.53E-01 1.57E-02 -2.73E-03 1.53E-01 1.57E-02 + 0.00E+00 4.9842E+00 6.2707E-01 -5.16E-03 1.56E-01 1.44E-02 -5.15E-03 1.56E-01 1.44E-02 + 0.00E+00 4.8575E+00 9.0527E-01 -7.04E-03 1.60E-01 1.25E-02 -7.03E-03 1.60E-01 1.25E-02 + 0.00E+00 4.6944E+00 1.1449E+00 -8.25E-03 1.65E-01 1.01E-02 -8.25E-03 1.65E-01 1.01E-02 + 0.00E+00 4.5052E+00 1.3380E+00 -8.80E-03 1.72E-01 7.42E-03 -8.81E-03 1.72E-01 7.43E-03 + 0.00E+00 4.2994E+00 1.4787E+00 -8.81E-03 1.81E-01 4.70E-03 -8.86E-03 1.81E-01 4.72E-03 + 0.00E+00 4.0854E+00 1.5612E+00 -8.52E-03 1.90E-01 2.03E-03 -8.57E-03 1.90E-01 2.04E-03 + 0.00E+00 3.8704E+00 1.5793E+00 -8.09E-03 2.01E-01 -6.23E-04 -8.15E-03 2.01E-01 -6.27E-04 + 0.00E+00 3.6634E+00 1.5263E+00 -7.66E-03 2.12E-01 -3.47E-03 -7.69E-03 2.12E-01 -3.48E-03 + 0.00E+00 3.4760E+00 1.3994E+00 -7.23E-03 2.24E-01 -6.77E-03 -7.22E-03 2.24E-01 -6.75E-03 + 0.00E+00 3.3185E+00 1.2044E+00 -6.63E-03 2.34E-01 -1.06E-02 -6.63E-03 2.34E-01 -1.06E-02 + 0.00E+00 3.1960E+00 9.5297E-01 -5.68E-03 2.43E-01 -1.50E-02 -5.67E-03 2.43E-01 -1.49E-02 + 0.00E+00 3.1094E+00 6.5898E-01 -4.24E-03 2.50E-01 -1.91E-02 -4.23E-03 2.50E-01 -1.91E-02 + 0.00E+00 3.0578E+00 3.3664E-01 -2.28E-03 2.54E-01 -2.21E-02 -2.28E-03 2.54E-01 -2.21E-02 + 0.00E+00 3.0407E+00 9.1826E-16 -6.36E-18 2.56E-01 -2.32E-02 -1.37E-18 2.56E-01 -2.32E-02 + + + nb mb rbc zbs vacpot_s |B|_c(s=.5) |B|_c(s=1.) + + 0 0 4.0166E+00 0.0000E+00 0.0000E+00 1.9523E-01 2.0030E-01 + 0 1 1.0267E+00 1.5800E+00 -5.4746E-04 -3.5271E-02 -5.0984E-02 + 0 2 4.5238E-02 -2.9266E-02 -1.1563E-03 2.7301E-03 4.6830E-03 + 0 3 -1.0208E-03 6.1884E-04 9.8907E-06 -1.5523E-04 -2.3245E-04 + 0 4 5.4088E-03 6.2347E-03 -3.2606E-04 -8.5453E-05 -2.3398E-04 + 0 5 8.9930E-05 -2.8652E-04 6.2647E-05 1.9296E-05 4.0045E-05 + 0 6 -6.5693E-04 -6.7367E-04 -6.4849E-05 4.8639E-06 3.0448E-05 + 0 7 2.2074E-04 2.2777E-04 1.7893E-05 -3.5975E-06 -1.9335E-05 + 0 8 6.6030E-05 7.8242E-05 -1.1570E-05 8.1264E-08 7.1419E-07 + 0 9 -2.9816E-05 -6.6008E-05 3.5503E-06 4.1230E-07 1.7695E-06 + 0 10 3.6021E-06 -7.7296E-06 -1.9798E-06 -7.4291E-08 -9.1075E-07 + 0 11 -2.2222E-06 3.6581E-05 8.1892E-07 -1.2091E-08 2.5668E-07 + + + EXECUTION TERMINATED NORMALLY + + FILE : solovev_free_bdy + NUMBER OF JACOBIAN RESETS = 0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_no_axis b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_no_axis new file mode 100644 index 000000000..55c4d43b5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/threed1.solovev_no_axis @@ -0,0 +1,216 @@ + THIS IS VMEC2000, A 3D EQUILIBRIUM CODE, VERSION 8.52 + Lambda: Full Radial Mesh. L-Force: hybrid full/half. + + + COMPUTATION PARAMETERS: (u = theta, v = zeta) + --------------------------------------------- + ns nu nv mu mv + 11 18 1 6 0 + + CONFIGURATION PARAMETERS: + --------------------------------------- + nfp gamma spres_ped phiedge(wb) curtor(A) + 1 0.000E+00 1.000E+00 1.000E+00 0.000E+00 + + RUN CONTROL PARAMETERS: + ----------------------- + ncurr niter nsin nstep nvacskip ftol tcon0 lasym lconm1 + 0 2000 5 250 1 1.00E-12 1.00E+00 F T + mfilter_fbdy nfilter_fbdy + -1 -1 + + MASS PROFILE COEFFICIENTS am - newton/m**2 (EXPANSION IN NORMALIZED RADIUS): + PMASS parameterization type is 'power_series' + ----------------------------------- + 1.250E-01 -1.250E-01 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + IOTA PROFILE COEFFICIENTS ai (EXPANSION IN NORMALIZED RADIUS): + PIOTA parameterization type is 'power_series' + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 + + NORMALIZED TOROIDAL FLUX COEFFICIENTS aphi (EXPANSION IN S): + ----------------------------------- + 1.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 0.000E+00 + 0.000E+00 0.000E+00 + + R-Z FOURIER BOUNDARY COEFFICIENTS AND MAGNETIC AXIS INITIAL GUESS + R = RBC*COS(m*u - n*v) + RBS*SIN(m*u - n*v), Z = ZBC*COS(m*u - n*v) + ZBS*SIN(m*u-n*v) + -------------------------------------------------------------------------------------- + nb mb rbc rbs zbc zbs raxis(c) raxis(s) zaxis(c) zaxis(s) + 0 0 3.9990E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 + 0 1 1.0260E+00 0.0000E+00 0.0000E+00 1.5800E+00 + 0 2 -6.8000E-02 0.0000E+00 0.0000E+00 1.0000E-02 + FSQR, FSQZ = Normalized Physical Force Residuals + fsqr, fsqz = Preconditioned Force Residuals + ----------------------- + BEGIN FORCE ITERATIONS + ----------------------- + + + NS = 5 NO. FOURIER MODES = 6 FTOLV = 1.000E-12 NITER = 1000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 3.05E-02 3.26E-03 1.25E-33 2.40E-33 3.05E-02 3.26E-03 1.28E-02 1.27E-03 7.24E-05 8.39E-37 9.63E-36 1.27E-03 7.24E-05 4.41E-03 9.00E-01 3.931E+00 2.5895E+00 3.838E-06 1.011 + 177 7.26E-13 4.66E-13 8.06E-06 1.33E-05 8.06E-06 1.33E-05 3.21E-13 9.07E-16 9.24E-15 9.70E-09 5.90E-08 9.69E-09 5.90E-08 2.84E-15 9.00E-01 3.994E+00 2.5485E+00 3.875E-06 1.010 + + MHD Energy = 2.548466E+00 + + NS = 11 NO. FOURIER MODES = 6 FTOLV = 1.000E-12 NITER = 2000 + + ITER FSQR FSQZ CONR CONZ MHDR MHDZ FSQL fsqr fsqz conr conz mhdr mhdz fsql DELT RAX(v=0) WMHD BETA + + 1 1.20E-04 3.70E-05 2.19E-08 3.90E-08 1.19E-04 3.62E-05 1.28E-06 1.26E-08 1.09E-08 1.26E-11 1.02E-10 1.22E-08 9.19E-09 1.00E-07 9.00E-01 3.994E+00 2.5484E+00 3.874E-06 1.011 + 133 9.08E-13 4.67E-13 3.23E-09 4.76E-09 3.24E-09 4.76E-09 2.83E-14 2.41E-17 1.05E-16 4.31E-13 3.36E-12 4.31E-13 3.36E-12 2.63E-16 9.00E-01 3.991E+00 2.5484E+00 3.873E-06 1.010 + + MHD Energy = 2.548372E+00 + + NOTE: S=normalized toroidal flux (0 - 1) + U=poloidal angle (0 - 2*pi) + V=geometric toroidal angle (0 - 2*pi) + = d(Ipol)/dPHI - IOTA*d(Itor)/dPHI - dp/dPHI * d(VOL)/dPHI + = d(VOL)/dPHI*[ - IOTA* - SIGN(JAC)*dp/dPHI] + (NORMED TO SUM OF INDIVIDUAL TERMS) + + S d(VOL)/ d(PRES)/ PRESF + FORCE> FLUX d(PHI) d(PHI) +---------------------------------------------------------------------------------------------------------------------------------------------------- + + 0.00E+00 -6.92E-04 -0.0000E+00 1.0000E+00 -2.229E+04 -2.226E+04 -1.233E+02 -1.250E-01 1.000 1.250E-01 0.000E+00 8.112E-01 -1.805E+04 4.133E-02 + 1.00E-01 -3.90E-04 1.0000E-01 1.0000E+00 -2.219E+04 -2.217E+04 -1.240E+02 -1.250E-01 1.002 1.125E-01 8.752E-03 8.024E-01 -1.799E+04 4.111E-02 + 2.00E-01 -8.93E-05 2.0000E-01 1.0000E+00 -2.209E+04 -2.209E+04 -1.247E+02 -1.250E-01 1.004 1.000E-01 1.751E-02 7.937E-01 -1.792E+04 4.089E-02 + 3.00E-01 9.61E-05 3.0000E-01 1.0000E+00 -2.200E+04 -2.200E+04 -1.254E+02 -1.250E-01 1.006 8.750E-02 2.628E-02 7.849E-01 -1.785E+04 4.065E-02 + 4.00E-01 1.05E-04 4.0000E-01 1.0000E+00 -2.190E+04 -2.191E+04 -1.261E+02 -1.250E-01 1.008 7.500E-02 3.507E-02 7.761E-01 -1.777E+04 4.042E-02 + 5.00E-01 6.92E-05 5.0000E-01 1.0000E+00 -2.182E+04 -2.182E+04 -1.268E+02 -1.250E-01 1.010 6.250E-02 4.387E-02 7.673E-01 -1.770E+04 4.019E-02 + 6.00E-01 6.34E-05 6.0000E-01 1.0000E+00 -2.173E+04 -2.174E+04 -1.276E+02 -1.250E-01 1.012 5.000E-02 5.269E-02 7.585E-01 -1.763E+04 3.995E-02 + 7.00E-01 5.47E-05 7.0000E-01 1.0000E+00 -2.165E+04 -2.165E+04 -1.283E+02 -1.250E-01 1.014 3.750E-02 6.153E-02 7.497E-01 -1.756E+04 3.972E-02 + 8.00E-01 4.72E-05 8.0000E-01 1.0000E+00 -2.157E+04 -2.157E+04 -1.291E+02 -1.250E-01 1.016 2.500E-02 7.038E-02 7.408E-01 -1.750E+04 3.948E-02 + 9.00E-01 5.36E-05 9.0000E-01 1.0000E+00 -2.149E+04 -2.149E+04 -1.299E+02 -1.250E-01 1.019 1.250E-02 7.925E-02 7.319E-01 -1.743E+04 3.925E-02 + 1.00E+00 5.99E-05 1.0000E+00 1.0000E+00 -2.141E+04 -2.141E+04 -1.306E+02 -1.250E-01 1.021 -2.896E-17 8.814E-02 7.230E-01 -1.737E+04 3.901E-02 + + Magnetic field modulation (averaged over toroidal angle) + ----------------------------------------------------------------------- + BMIN(u=0) = 0.161917 + BMAX(u=0) = 0.161917 + BMIN(u=pi) = 0.263481 + BMAX(u=pi) = 0.263481 + + + Geometric and Magnetic Quantities + ----------------------------------------------------------------------- + Aspect Ratio = 3.117998 + Mean Elongation = 1.599182 + Plasma Volume = 126.871928 [M**3] + Cross Sectional Area = 5.088500 [M**2] + Normal Surface Area = 207.139981 [M**2] + Poloidal Circumference= 8.293530 [M] + Major Radius = 3.968221 [M] (from Volume and Cross Section) + Minor Radius = 1.272682 [M] (from Cross Section) + Minimum (inboard) R = 2.905000 [M] + Maximum (outboard) R = 4.957000 [M] + Maximum height Z = 1.559416 [M] + Waist (v = 0) in R = 2.052000 [M] + Full Height(v = 0) = 3.118833 [M] + Toroidal Flux = 1.000000 [Wb] + Toroidal Current = -0.440681 [MA] + RBtor(s=1) = 0.723045 [T-m] + RBtor(s=0) = 0.811179 [T-m] + Volume Average B = 0.200431 [T] + Ion Larmor Radius = 0.015966 [M] X Ti(keV)**0.5 + / = ************** (Vol. Averaged) + / = 17713.064012 (Vol. Averaged) + + +----------------------------------------------------------------------- + MORE GEOMETRIC AND PHYSICS QUANTITIES +----------------------------------------------------------------------- + Toroidal Plane: Phi = 0 + j psi-psiaxis a [M] ellipticity indentation d-shape rel. shift / / + + ----- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ + 2 0.10000 0.31933 1.51828 0.00000 -0.10596 0.00969 7.32E+10 6.76E+05 + 3 0.20000 0.45233 1.51858 0.00000 -0.11453 0.01350 3.60E+10 2.90E+04 + 4 0.30000 0.55491 1.51897 0.00000 -0.12105 0.01628 2.36E+10 2.49E+04 + 5 0.40000 0.64185 1.51923 0.00000 -0.12656 0.01859 1.74E+10 9.66E+03 + 6 0.50000 0.71887 1.51942 0.00000 -0.13145 0.02066 1.37E+10 2.32E+03 + 7 0.60000 0.78889 1.51957 0.00000 -0.13590 0.02255 1.12E+10 1.00E+03 + 8 0.70000 0.85364 1.51968 0.00000 -0.14003 0.02434 9.50E+09 6.37E+02 + 9 0.80000 0.91425 1.51977 0.00000 -0.14391 0.02603 8.19E+09 4.10E+02 + 10 0.90000 0.97152 1.51984 0.00000 -0.14759 0.02764 7.17E+09 3.68E+02 + 11 1.00000 1.02600 1.51990 0.00000 -0.15110 0.02920 0.00E+00 0.00E+00 + + + Magnetic Fields and Pressure + ----------------------------------------------------------------------- + Volume Integrals (Joules) and Volume Averages (Pascals) + Integral Average + pressure = 7.853769E+00 6.190313E-02 + bpol**2 /(2 mu0) = 1.098494E+05 8.658292E+02 + btor**2/(2 mu0) = 1.918089E+06 1.511831E+04 + b**2/(2 mu0) = 2.027938E+06 1.598413E+04 + EKIN (3/2p) = 1.178065E+01 9.285469E-02 + + + MAGNETIC AXIS COEFFICIENTS + n rmag zmag rmag zmag + (cos nv) (sin nv) (sin nv) (cos nv) + + 0 3.9909E+00 -0.0000E+00 + + From volume averages over plasma, betas are + beta total = 0.000004 + beta poloidal = 0.000071 + beta toroidal = 0.000004 + + R * Btor-vac = 0.723045 [Wb/M] + Peak Beta = 0.000008 + Beta-star = 0.000004 + + Shafranov Surface Integrals + Ref: S. P. Hirshman, Phys. Fluids B, 5, (1993) 3119 + Note: s1 = S1/2, s2 = S2/2, where s1,s2 are the Shafranov definitions, + and s3 = S3/2, where S3 is Lao's definition. + The quantity lsubi gives the ratio of volume poloidal + field energy to the field energy estimated from the + surface integral in Eq.8. + ---------------------- + + RT (Pressure-weighted) = 3.986623 [M] + RG (Geometric) = 3.931000 [M] + RL (Vol/2*pi*Area-Lao) = 3.968221 [M] + Poloidal Field Energy + Normalization Ratio = 0.000000 (Lao/Hirshman) + + s3 = 0.378609 + lsubi = 0.495378 + musubi = -0.959339 + betai = 0.000035 + lambda = 0.247725 + + + R = RT R = RG R = RL + -------- -------- -------- + delta = 1 - RT/R = 0.000000 -0.014150 -0.004637 + s1 = 0.958709 0.955357 0.957600 + s2 = -0.240197 -0.236846 -0.239089 + betai (Mui + s1) = -0.000630 -0.003982 -0.001739 + lambda (s1/2 + s2) = 0.239157 0.240833 0.239711 + 1st Shafr'v relation = 0.012387 0.012387 0.012387 + (3*Betai + Li - Mui)/[2*(s1+s2)] - 1 + Radial force balance = -0.034282 -0.020618 -0.029804 + (Betai + Li + Mui)/(2*s2) - 1 + + + EXECUTION TERMINATED NORMALLY + + FILE : solovev_no_axis + NUMBER OF JACOBIAN RESETS = 0 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cma.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cma.nc new file mode 100644 index 000000000..2f83cb73b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cma.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a88904ae690104b9bc939b622941826b061db2e7a1498a75b1f4f3d36052426 +size 674564 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_fixed_bdy.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_fixed_bdy.nc new file mode 100644 index 000000000..c38bd8273 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_fixed_bdy.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:127e88bbb56af48248560b4a13855a7c79144b82805a315f2e1f9d205822d63b +size 658084 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_fixed_bdy_nzeta_37.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_fixed_bdy_nzeta_37.nc new file mode 100644 index 000000000..0af45c264 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_fixed_bdy_nzeta_37.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ec0cc5192aa2ec0f8d8716bfc7eab09216368f311e1a4db22488a745dd9e318 +size 658084 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_free_bdy.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_free_bdy.nc new file mode 100644 index 000000000..f2ca3d93c --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_cth_like_free_bdy.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf2beaeaf4f69ac8088ac3ccb8be24f16185a46c9d2eed9f7d87788603288e37 +size 420452 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev.nc new file mode 100644 index 000000000..ef37ea74a --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:882bce2e7421d84463a6a4e9ce7c5a92769ad6a2ae576015237f020b1a8c429c +size 115220 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_analytical.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_analytical.nc new file mode 100644 index 000000000..6eb0b3e8e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_analytical.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bca561470a55cf74884f2ff94c7f2513b34f96d045aa10b8c37d39f37b4c899c +size 110164 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_free_bdy.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_free_bdy.nc new file mode 100644 index 000000000..a983b8a9f --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_free_bdy.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f1947e7937c5e43ce0c891e5c8bf79bde925d2ddf3ffc58d262deb24d94f6df +size 90984 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_no_axis.nc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_no_axis.nc new file mode 100644 index 000000000..83a938336 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/test_data/wout_solovev_no_axis.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2c2628a67cac981e33201e6fa1124badcecdc64782c5a8368c47fd49f543ff4 +size 67348 diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/boundaries/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/boundaries/BUILD.bazel new file mode 100644 index 000000000..2ced29d21 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/boundaries/BUILD.bazel @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "boundaries_test", + srcs = ["boundaries_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_analytical", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/vmec/boundaries", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/boundaries/boundaries_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/boundaries/boundaries_test.cc new file mode 100644 index 000000000..0bd1e7ef3 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/boundaries/boundaries_test.cc @@ -0,0 +1,218 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/vmec/boundaries/boundaries.h" + +#include +#include + +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" +#include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/boundaries/guess_magnetic_axis.h" + +namespace vmecpp { + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +// used to specify case-specific tolerances +struct DataSource { + std::string identifier; + double tolerance = 0.0; +}; + +class BondariesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(BondariesTest, CheckBoundaries) { + const double tolerance = data_source_.tolerance; + + std::string filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/readin_boundary/" + "readin_boundary_00000_000001_01.%s.json", + data_source_.identifier, data_source_.identifier); + std::ifstream ifs(filename); + ASSERT_TRUE(ifs.is_open()); + json readin_boundary = json::parse(ifs); + + filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Sizes sizes(*vmec_indata); + FourierBasisFastPoloidal fourier_basis(&sizes); + + // VMEC convention: + // The flux coordiantes (s, u, v) form a left-handed coordinate system. + // This implies that the Jacobian of the coordinate system is negative. + static constexpr int kSignOfJacobian = -1; + + Boundaries boundaries(&sizes, &fourier_basis, kSignOfJacobian); + boundaries.setupFromIndata(*vmec_indata); + + for (int m = 0; m < sizes.mpol; ++m) { + for (int n = 0; n <= sizes.ntor; ++n) { + int idx_mn = m * (sizes.ntor + 1) + n; + + EXPECT_TRUE(IsCloseRelAbs(readin_boundary["rbcc"][n][m], + boundaries.rbcc[idx_mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(readin_boundary["zbsc"][n][m], + boundaries.zbsc[idx_mn], tolerance)); + } // m + } // n +} // CheckBoundaries + +INSTANTIATE_TEST_SUITE_P( + TestBoundaries, BondariesTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_analytical", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-30}, + DataSource{.identifier = "cma", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-30})); + +class RecomputeMagneticAxisToFixJacobianSignTest + : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(RecomputeMagneticAxisToFixJacobianSignTest, + CheckRecomputeMagneticAxisToFixJacobianSign) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // guess_axis is only called in the first multi-grid step + const int number_of_flux_surfaces = vmec_indata->ns_array[0]; + + Sizes sizes(*vmec_indata); + FourierBasisFastPoloidal fourier_basis(&sizes); + + // VMEC convention: + // The flux coordiantes (s, u, v) form a left-handed coordinate system. + // This implies that the Jacobian of the coordinate system is negative. + static constexpr int kSignOfJacobian = -1; + + Boundaries boundaries(&sizes, &fourier_basis, kSignOfJacobian); + boundaries.setupFromIndata(*vmec_indata); + + // Assume that RecomputeMagneticAxisToFixJacobianSign will be triggered for + // this test case, so directly proceed to testing it here. + const RecomputeAxisWorkspace w = + vmecpp::RecomputeMagneticAxisToFixJacobianSign( + number_of_flux_surfaces, kSignOfJacobian, sizes, fourier_basis, + boundaries.rbcc, boundaries.rbss, boundaries.rbsc, boundaries.rbcs, + boundaries.zbsc, boundaries.zbcs, boundaries.zbcc, boundaries.zbss, + boundaries.raxis_c, boundaries.raxis_s, boundaries.zaxis_s, + boundaries.zaxis_c); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/guess_axis/" + "guess_axis_%05d_000001_01.%s.json", + data_source_.identifier, number_of_flux_surfaces, + data_source_.identifier); + std::ifstream ifs_guess_axis(filename); + ASSERT_TRUE(ifs_guess_axis.is_open()); + json guess_axis = json::parse(ifs_guess_axis); + + // Now check that correct axis was guessed. + // First check intermediate data. + for (int k = 0; k < sizes.nZeta / 2 + 1; ++k) { + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["raxis_in"][k], w.r_axis[k], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["zaxis_in"][k], w.z_axis[k], tolerance)); + for (int l = 0; l < sizes.nThetaEven; ++l) { + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["r1b"][k][l], w.r_lcfs[k][l], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["z1b"][k][l], w.z_lcfs[k][l], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(guess_axis["rub"][k][l], + w.d_r_d_theta_lcfs[k][l], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(guess_axis["zub"][k][l], + w.d_z_d_theta_lcfs[k][l], tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["r12"][k][l], w.r_half[k][l], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["z12"][k][l], w.z_half[k][l], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(guess_axis["ru12"][k][l], + w.d_r_d_theta_half[k][l], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(guess_axis["zu12"][k][l], + w.d_z_d_theta_half[k][l], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(guess_axis["rs"][k][l], w.d_r_d_s_half[k][l], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(guess_axis["zs"][k][l], w.d_z_d_s_half[k][l], + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["tau0"][k][l], w.tau0[k][l], tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["tau"][k][l], w.tau[k][l], tolerance)); + } // l + } // k + + // Now check the realspace geometry of the new axis. + for (int k = 0; k < sizes.nZeta; ++k) { + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["rcom"][k], w.new_r_axis[k], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["zcom"][k], w.new_z_axis[k], tolerance)); + } // k + + // Now check the Fourier coefficients of the new axis. + for (int n = 0; n <= sizes.ntor; ++n) { + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["raxis_cc"][n], w.new_raxis_c[n], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(guess_axis["zaxis_cs"][n], w.new_zaxis_s[n], tolerance)); + if (sizes.lasym) { + EXPECT_TRUE(IsCloseRelAbs(guess_axis["raxis_cs"][n], w.new_raxis_s[n], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(guess_axis["zaxis_cc"][n], w.new_zaxis_c[n], + tolerance)); + } + } // n +} // CheckRecomputeMagneticAxisToFixJacobianSign + +INSTANTIATE_TEST_SUITE_P( + TestBoundaries, RecomputeMagneticAxisToFixJacobianSignTest, + Values(DataSource{.identifier = "solovev_analytical", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-15}, + DataSource{.identifier = "cma", .tolerance = 1.0e-15})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/fourier_geometry/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/fourier_geometry/BUILD.bazel new file mode 100644 index 000000000..ad0314395 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/fourier_geometry/BUILD.bazel @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "fourier_geometry_test", + srcs = ["fourier_geometry_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/vmec/fourier_geometry", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/flow_control:flow_control", + "//vmecpp/vmec/vmec:vmec", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/fourier_geometry/fourier_geometry_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/fourier_geometry/fourier_geometry_test.cc new file mode 100644 index 000000000..5bf8ffec8 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/fourier_geometry/fourier_geometry_test.cc @@ -0,0 +1,317 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/vmec/fourier_geometry/fourier_geometry.h" + +#include +#include +#include + +#include "absl/algorithm/container.h" +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/flow_control/flow_control.h" +#include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" +#include "vmecpp/common/sizes/sizes.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/boundaries/boundaries.h" +#include "vmecpp/vmec/output_quantities/output_quantities.h" +#include "vmecpp/vmec/radial_partitioning/radial_partitioning.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +// used to specify case-specific tolerances +struct DataSource { + std::string identifier; + double tolerance = 0.0; +}; + +class InterpolateFromInitialGuessTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InterpolateFromInitialGuessTest, CheckInterpolateFromInitialGuess) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + const Sizes& s = vmec.s_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::SETUP_INITIAL_STATE, 1).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/profil3d/" + "profil3d_%05d_000001_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_num_eqsolve_retries(), + data_source_.identifier); + std::ifstream ifs_profil3d(filename); + ASSERT_TRUE(ifs_profil3d.is_open()); + json profil3d = json::parse(ifs_profil3d); + + // perform testing outside of multi-threaded region to avoid overlapping error + // messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + int nsMinF1 = radial_partitioning.nsMinF1; + int nsMaxF1 = radial_partitioning.nsMaxF1; + + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + int idx_fc = ((jF - nsMinF1) * s.mpol + m) * (s.ntor + 1) + n; + + int basis_index = 0; + + EXPECT_TRUE(IsCloseRelAbs( + profil3d["rmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->rmncc[idx_fc], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + profil3d["zmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->zmnsc[idx_fc], tolerance)); + basis_index++; + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs( + profil3d["rmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->rmnss[idx_fc], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + profil3d["zmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->zmncs[idx_fc], tolerance)); + basis_index++; + } + if (s.lasym) { + EXPECT_TRUE(IsCloseRelAbs( + profil3d["rmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->rmnsc[idx_fc], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + profil3d["zmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->zmncc[idx_fc], tolerance)); + basis_index++; + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs( + profil3d["rmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->rmncs[idx_fc], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + profil3d["zmn"][basis_index][jF][n][m], + vmec.decomposed_x_[thread_id]->zmnss[idx_fc], tolerance)); + basis_index++; + } + } + + ASSERT_EQ(basis_index, s.num_basis); + } // m + } // n + } // jF + } // thread_id +} // CheckInterpolateFromInitialGuess + +INSTANTIATE_TEST_SUITE_P( + TestInterpolateFromInitialGuess, InterpolateFromInitialGuessTest, + Values(DataSource{.identifier = "solovev", .tolerance = DBL_EPSILON}, + DataSource{.identifier = "solovev_no_axis", + .tolerance = DBL_EPSILON}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = DBL_EPSILON}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = DBL_EPSILON}, + DataSource{.identifier = "cma", .tolerance = DBL_EPSILON}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = DBL_EPSILON})); + +TEST(HotRestart, InitializeFromExistingState) { + // Test that FourierGeometry can be initialized from rmnc, zmns, lmns_full and + // a Boundary that sets the LCFS As a reference we use the internal flux + // surface geometry (including lambda) from a wout file produced by VMEC++. + // The geometry of the LCFS is taken from the corresponding indata input file. + + // SETUP + const std::string filename = "vmecpp/test_data/cth_like_fixed_bdy.json"; + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const int num_threads = 1; + const int thread_id = 0; + + Sizes s(*indata); + FourierBasisFastPoloidal fb(&s); + + const bool lfreeb = false; + const double delt = 1.0; + const int num_grids = 1; + FlowControl fc(lfreeb, delt, num_grids + 1, num_threads); + fc.ns = indata->ns_array[indata->ns_array.size() - 1]; + fc.deltaS = 1.0 / (fc.ns - 1.0); + + RadialPartitioning rp; + rp.adjustRadialPartitioning(num_threads, thread_id, fc.ns, indata->lfreeb, + /*printout=*/false); + + Boundaries b(&s, &fb, -1); + b.setupFromIndata(*indata); + + HandoverStorage h(&s); + + const int signOfJacobian = -1; + const double pDamp = 0.05; + RadialProfiles p(&rp, &h, &(*indata), &fc, signOfJacobian, pDamp); + + // update profile parameterizations based on p****_type strings + p.setupInputProfiles(); + + VmecConstants constants; + constants.reset(); + + p.evalRadialProfiles(fc.haveToFlipTheta, constants); + + // Now that all contributions to lamscale have been accumulated in + // VmecConstants::rmsPhiP, can update lamscale. + constants.lamscale = sqrt(constants.rmsPhiP * fc.deltaS); + + FourierGeometry g(&s, &rp, fc.ns); + + const std::string wout_filename = + "vmecpp_large_cpp_tests/test_data/cth_like_fixed_bdy.out.h5"; + const auto maybe_out = OutputQuantities::Load(wout_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& wout = maybe_out->wout; + const double tol = 1e-15; + + // THIS IS THE CALL UNDER TEST + g.InitFromState(fb, wout.rmnc, wout.zmns, wout.lmns_full, p, constants, &b); + + // COMPARISON WITH REFERENCES + for (int jF = 0; jF < fc.ns; ++jF) { + const Eigen::VectorXd rmnc_col = wout.rmnc.col(jF); + const std::vector ref_rmnc(rmnc_col.data(), + rmnc_col.data() + rmnc_col.size()); + std::vector ref_rmncc(s.mpol * (s.ntor + 1)); + std::vector ref_rmnss(s.mpol * (s.ntor + 1)); + fb.cos_to_cc_ss(ref_rmnc, ref_rmncc, ref_rmnss, s.ntor, s.mpol); + + const Eigen::VectorXd zmns_col = wout.zmns.col(jF); + const std::vector ref_zmns(zmns_col.data(), + zmns_col.data() + zmns_col.size()); + std::vector ref_zmnsc(s.mpol * (s.ntor + 1)); + std::vector ref_zmncs(s.mpol * (s.ntor + 1)); + fb.sin_to_sc_cs(ref_zmns, ref_zmnsc, ref_zmncs, s.ntor, s.mpol); + + // The m=1 constraint needs to be activated among reference data + // before doing the comparison. + const int m1 = 1; + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = m1 * (s.ntor + 1) + n; + if (s.lthreed) { + const double old_rss = ref_rmnss[idx_mn]; + ref_rmnss[idx_mn] = (old_rss + ref_zmncs[idx_mn]) * 0.5; + ref_zmncs[idx_mn] = (old_rss - ref_zmncs[idx_mn]) * 0.5; + } + // TODO(jons): activate this when lasym=true branch is implemented + // if (s.lasym) { + // const double old_rsc = ref_rmnsc[idx_mn]; + // ref_rmnsc[idx_mn] = (old_rsc + ref_zmncc[idx_mn]) * 0.5; + // ref_zmncc[idx_mn] = (old_rsc - ref_zmncc[idx_mn]) * 0.5; + // } + } + + const Eigen::VectorXd lmns_col = wout.lmns_full.col(jF); + const std::vector ref_lmns(lmns_col.data(), + lmns_col.data() + lmns_col.size()); + std::vector ref_lmnsc(s.mpol * (s.ntor + 1)); + std::vector ref_lmncs(s.mpol * (s.ntor + 1)); + fb.sin_to_sc_cs(ref_lmns, ref_lmnsc, ref_lmncs, s.ntor, s.mpol); + + // lambda is normally zero at the axis, but the wout file contents + // contain extrapolated data at the axis in lambda, + // which we need to remove for this comparison. + if (jF == 0) { + absl::c_fill(ref_lmnsc, 0.0); + absl::c_fill(ref_lmncs, 0.0); + } + + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = m * (s.ntor + 1) + n; + const int idx_fc = (jF * s.mpol + m) * (s.ntor + 1) + n; + + if (jF < fc.ns - 1) { + // last surface is tested separately + EXPECT_TRUE(IsCloseRelAbs(ref_rmncc[idx_mn], g.rmncc[idx_fc], tol)) + << "rmncc @ j = " << jF << " m = " << m << " n = " << n; + EXPECT_TRUE(IsCloseRelAbs(ref_rmnss[idx_mn], g.rmnss[idx_fc], tol)) + << "rmnss @ j = " << jF << " m = " << m << " n = " << n; + + EXPECT_TRUE(IsCloseRelAbs(ref_zmnsc[idx_mn], g.zmnsc[idx_fc], tol)) + << "zmnsc @ j = " << jF << " m = " << m << " n = " << n; + EXPECT_TRUE(IsCloseRelAbs(ref_zmncs[idx_mn], g.zmncs[idx_fc], tol)) + << "zmncs @ j = " << jF << " m = " << m << " n = " << n; + } + + EXPECT_TRUE(IsCloseRelAbs(ref_lmnsc[idx_mn], g.lmnsc[idx_fc], tol)) + << "lmnsc @ j = " << jF << " m = " << m << " n = " << n; + EXPECT_TRUE(IsCloseRelAbs(ref_lmncs[idx_mn], g.lmncs[idx_fc], tol)) + << "lmncs @ j = " << jF << " m = " << m << " n = " << n; + } + } + } + + // now the last surface + const int jF = fc.ns - 1; + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = m * (s.ntor + 1) + n; + const int idx_fc = (jF * s.mpol + m) * (s.ntor + 1) + n; + + // basis_norm is normally applied within + // FourierGeometry::interpFromBoundaryAndAxis(), but + // FourierGeometry::InitFromState() also does it, so we need to mimic this + // for the Boundaries members. + const double basis_norm = 1.0 / (fb.mscale[m] * fb.nscale[n]); + + EXPECT_TRUE( + IsCloseRelAbs(b.rbcc[idx_mn] * basis_norm, g.rmncc[idx_fc], tol)) + << "rbcc @ m = " << m << " n = " << n; + EXPECT_TRUE( + IsCloseRelAbs(b.rbss[idx_mn] * basis_norm, g.rmnss[idx_fc], tol)) + << "rbss @ m = " << m << " n = " << n; + + EXPECT_TRUE( + IsCloseRelAbs(b.zbsc[idx_mn] * basis_norm, g.zmnsc[idx_fc], tol)) + << "zbsc @ m = " << m << " n = " << n; + EXPECT_TRUE( + IsCloseRelAbs(b.zbcs[idx_mn] * basis_norm, g.zmncs[idx_fc], tol)) + << "zbcs @ m = " << m << " n = " << n; + } + } +} + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/BUILD.bazel new file mode 100644 index 000000000..d0dbeed1d --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/BUILD.bazel @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "ideal_mhd_model_test", + srcs = ["ideal_mhd_model_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_analytical", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/vmec/ideal_mhd_model", + "//vmecpp/vmec/vmec_constants", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], + size = "large", +) + +cc_test( + name = "ideal_mhd_model_hot_restart_test", + srcs = ["ideal_mhd_model_hot_restart_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + ], + deps = [ + "//vmecpp/vmec/ideal_mhd_model", + "//vmecpp/vmec/vmec_constants", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/vmec/vmec:vmec", + ], +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/ideal_mhd_model_hot_restart_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/ideal_mhd_model_hot_restart_test.cc new file mode 100644 index 000000000..54612050b --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/ideal_mhd_model_hot_restart_test.cc @@ -0,0 +1,418 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include // std::ifstream +#include +#include + +#include "absl/status/statusor.h" +#include "absl/strings/str_cat.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/output_quantities/output_quantities.h" +#include "vmecpp/vmec/vmec/vmec.h" +#include "vmecpp/vmec/vmec_constants/vmec_algorithm_constants.h" + +using nlohmann::json; +using ::testing::DoubleNear; +using ::testing::ElementsAreArray; +using ::testing::Pointwise; +using ::testing::TestWithParam; +using ::testing::Values; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; +using vmecpp::Vmec; +using vmecpp::vmec_algorithm_constants::kEvenParity; +using vmecpp::vmec_algorithm_constants::kOddParity; + +namespace vmecpp { + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class FourierGeometryToStartWithFromWOutTest + : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourierGeometryToStartWithFromWOutTest, + CheckFourierGeometryToStartWithFromWOut) { + const double tolerance = data_source_.tolerance; + + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::FOURIER_GEOMETRY_TO_START_WITH; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*maximum_iterations=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + + // COMPARISON WITH REFERENCES + // test fourier geometry matches what was in the wout file + const int ns = vmec.fc_.ns; + const Sizes& s = vmec.s_; + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const vmecpp::FourierGeometry& g = *vmec.decomposed_x_[thread_id]; + const RadialPartitioning& rp = *vmec.r_[thread_id]; + + const int nsMinF1 = rp.nsMinF1; + const int nsMaxF1 = rp.nsMaxF1; + + // use another FourierGeometry to represent the WOutFileContents + vmecpp::FourierGeometry ref_fg(&s, &rp, ns); + ref_fg.InitFromState(vmec.t_, output_quantities.wout.rmnc, + output_quantities.wout.zmns, + output_quantities.wout.lmns_full, *vmec.p_[thread_id], + vmec.constants_, &(vmec.b_)); + + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + const int jFForThisThread = jF - g.nsMin(); + const int idx_fc = (jFForThisThread * s.mpol + m) * (s.ntor + 1) + n; + + EXPECT_TRUE( + IsCloseRelAbs(ref_fg.rmncc[idx_fc], g.rmncc[idx_fc], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(ref_fg.zmnsc[idx_fc], g.zmnsc[idx_fc], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(ref_fg.lmnsc[idx_fc], g.lmnsc[idx_fc], tolerance)); + + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs(ref_fg.rmnss[idx_fc], g.rmnss[idx_fc], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(ref_fg.zmncs[idx_fc], g.zmncs[idx_fc], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(ref_fg.lmncs[idx_fc], g.lmncs[idx_fc], + tolerance)); + } + } + } + } + } +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, FourierGeometryToStartWithFromWOutTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-15})); + +class FourierGeometryToStartWithFromDebugOutTest + : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourierGeometryToStartWithFromDebugOutTest, + CheckFourierGeometryToStartWithFromDebugOut) { + const double tolerance = data_source_.tolerance; + + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::FOURIER_GEOMETRY_TO_START_WITH; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*iterations_before_checkpointing=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + + const int niter = output_quantities.wout.niter - 1; + const std::string ref_filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/totzsp_input/" + "totzsp_input_%05d_%06d_01.%s.json", + data_source_.identifier, indata->ns_array[0], niter, + data_source_.identifier); + + std::ifstream ifs_totzsp_input(ref_filename); + ASSERT_TRUE(ifs_totzsp_input.is_open()) + << "failed to open reference file: " << ref_filename; + json totzsp_input = json::parse(ifs_totzsp_input); + + const Sizes& s = vmec.s_; + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + const FourierGeometry& physical_x = *(vmec.physical_x_[thread_id]); + + const int nsMinF = radial_partitioning.nsMinF; + + for (int rzl = 0; rzl < 3; ++rzl) { + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + // time stepping is only done on those Fourier coefficients + // for which the forces were computed in this thread! + for (int jF = nsMinF; jF < radial_partitioning.nsMaxFIncludingLcfs; + ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE(IsCloseRelAbs( + totzsp_input["gc"][rzl][idx_basis][jF][n][m], + physical_x.GetXcElement(rzl, idx_basis, jF, n, m), tolerance)) + << rzl << " " << idx_basis << " " << jF << " " << n << " " + << m; + } // m + } // n + } // jF + } // idx_basis + } // rzl + } // thread_id +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, FourierGeometryToStartWithFromDebugOutTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-11}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-13})); + +class InverseFourierTransformGeometryTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InverseFourierTransformGeometryTest, + CheckInverseFourierTransformGeometry) { + const double tolerance = data_source_.tolerance; + + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::INV_DFT_GEOMETRY; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*iterations_before_checkpointing=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + + // COMPARISON WITH REFERENCES + const int niter = output_quantities.wout.niter - 1; + const std::string ref_filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/funct3d_geometry/" + "funct3d_geometry_%05d_%06d_01.%s.json", + data_source_.identifier, indata->ns_array[0], niter, + data_source_.identifier); + + std::ifstream ifs_funct3d_geometry(ref_filename); + ASSERT_TRUE(ifs_funct3d_geometry.is_open()) + << "failed to open reference file: " << ref_filename; + json funct3d_geometry = json::parse(ifs_funct3d_geometry); + + const Sizes& s = vmec.s_; + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + const RadialProfiles& radial_profiles = *vmec.p_[thread_id]; + + const int nsMinF1 = radial_partitioning.nsMinF1; + const int nsMaxF1 = radial_partitioning.nsMaxF1; + + const int nsMinF = radial_partitioning.nsMinF; + + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + int idx_kl = ((jF - nsMinF1) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["r1"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->r1_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["r1"][jF][kOddParity][k][l], + vmec.m_[thread_id]->r1_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["ru"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->ru_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["ru"][jF][kOddParity][k][l], + vmec.m_[thread_id]->ru_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["z1"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->z1_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["z1"][jF][kOddParity][k][l], + vmec.m_[thread_id]->z1_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zu"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->zu_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zu"][jF][kOddParity][k][l], + vmec.m_[thread_id]->zu_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lu"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->lu_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lu"][jF][kOddParity][k][l], + vmec.m_[thread_id]->lu_o[idx_kl], tolerance)); + if (s.lthreed) { + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["rv"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->rv_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["rv"][jF][kOddParity][k][l], + vmec.m_[thread_id]->rv_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zv"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->zv_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zv"][jF][kOddParity][k][l], + vmec.m_[thread_id]->zv_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lv"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->lv_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lv"][jF][kOddParity][k][l], + vmec.m_[thread_id]->lv_o[idx_kl], tolerance)); + } // lthreed + + if (nsMinF <= jF && jF < nsMaxFIncludingLcfs) { + // spectral condensation is local per flux surface --> no need for + // numFull1 This index is invalid outside of [r->nsMinF, jMaxCon[ + // ! + const int idx_con = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + + const double sqrtSF = + radial_profiles.sqrtSF[jF - radial_partitioning.nsMinF1]; + + // VMEC++ computes rCon, zCon directly combined from even-m and + // odd-m contributions. This is different from educational_VMEC + // (and the other Fortran implementations), where the combination + // is computed after totzsp(s,a). Hence, need to combine the + // even-m and odd-m contributions in order to compute the required + // reference quantities. + const double expected_rcon_even = + funct3d_geometry["rcon"][jF][kEvenParity][k][l]; + const double expected_rcon_odd = + funct3d_geometry["rcon"][jF][kOddParity][k][l]; + const double expected_rcon = + expected_rcon_even + sqrtSF * expected_rcon_odd; + + const double expected_zcon_even = + funct3d_geometry["zcon"][jF][kEvenParity][k][l]; + const double expected_zcon_odd = + funct3d_geometry["zcon"][jF][kOddParity][k][l]; + const double expected_zcon = + expected_zcon_even + sqrtSF * expected_zcon_odd; + + EXPECT_TRUE(IsCloseRelAbs( + expected_rcon, vmec.m_[thread_id]->rCon[idx_con], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + expected_zcon, vmec.m_[thread_id]->zCon[idx_con], tolerance)); + } // within ...Con range: forces full-grid (numFull) + } // l + } // k + } // jF + } // thread_id +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, InverseFourierTransformGeometryTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-10}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-12})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/ideal_mhd_model_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/ideal_mhd_model_test.cc new file mode 100644 index 000000000..66e27d92e --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/ideal_mhd_model/ideal_mhd_model_test.cc @@ -0,0 +1,2455 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT + +#include "vmecpp/vmec/ideal_mhd_model/ideal_mhd_model.h" + +#include +#include +#include +#include + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include "absl/status/statusor.h" +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" +#include "vmecpp/vmec/vmec_constants/vmec_algorithm_constants.h" + +using vmecpp::vmec_algorithm_constants::kEvenParity; +using vmecpp::vmec_algorithm_constants::kOddParity; + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +namespace vmecpp { + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class SpectralConstraintTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(SpectralConstraintTest, CheckSpectralConstraint) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::SPECTRAL_CONSTRAINT, 1).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/spectral_constraint/" + "spectral_constraint_00000_000001_%02d.%s.json", + data_source_.identifier, vmec.get_num_eqsolve_retries(), + data_source_.identifier); + std::ifstream ifs_spectral_constraint(filename); + ASSERT_TRUE(ifs_spectral_constraint.is_open()) + << "failed to open reference file: " << filename; + json spectral_constraint = json::parse(ifs_spectral_constraint); + + // perform testing outside of multi-threaded region to avoid overlapping error + // messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE(IsCloseRelAbs(spectral_constraint["xmpq"][m][0], + vmec.m_[thread_id]->xmpq[m], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(spectral_constraint["faccon"][m], + vmec.m_[thread_id]->faccon[m], tolerance)); + } // m + } // thread_id +} // CheckSpectralConstraint + +INSTANTIATE_TEST_SUITE_P( + TestIdealMhdModel, SpectralConstraintTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_analytical", .tolerance = 1.0e-30}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-30}, + DataSource{.identifier = "cma", .tolerance = 1.0e-30}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-30})); + +class FourierGeometryToStartWithTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(FourierGeometryToStartWithTest, CheckFourierGeometryToStartWith) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::FOURIER_GEOMETRY_TO_START_WITH, + number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/totzsp_input/" + "totzsp_input_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_totzsp_input(filename); + ASSERT_TRUE(ifs_totzsp_input.is_open()) + << "failed to open reference file: " << filename; + json totzsp_input = json::parse(ifs_totzsp_input); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + const FourierGeometry& physical_x = *(vmec.physical_x_[thread_id]); + + const int nsMinF = radial_partitioning.nsMinF; + + for (int rzl = 0; rzl < 3; ++rzl) { + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + // time stepping is only done on those Fourier coefficients + // for which the forces were computed in this thread! + for (int jF = nsMinF; jF < radial_partitioning.nsMaxFIncludingLcfs; + ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE(IsCloseRelAbs( + totzsp_input["gc"][rzl][idx_basis][jF][n][m], + physical_x.GetXcElement(rzl, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + } // rzl + } // thread_id + } +} // CheckFourierGeometryToStartWith + +INSTANTIATE_TEST_SUITE_P( + TestIdealMhdModel, FourierGeometryToStartWithTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-13, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +class InverseFourierTransformGeometryTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InverseFourierTransformGeometryTest, + CheckInverseFourierTransformGeometry) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::INV_DFT_GEOMETRY, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/funct3d_geometry/" + "funct3d_geometry_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_funct3d_geometry(filename); + ASSERT_TRUE(ifs_funct3d_geometry.is_open()) + << "failed to open reference file: " << filename; + json funct3d_geometry = json::parse(ifs_funct3d_geometry); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + const RadialProfiles& radial_profiles = *vmec.p_[thread_id]; + + const int nsMinF1 = radial_partitioning.nsMinF1; + const int nsMaxF1 = radial_partitioning.nsMaxF1; + + const int nsMinF = radial_partitioning.nsMinF; + + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + int idx_kl = ((jF - nsMinF1) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["r1"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->r1_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["r1"][jF][kOddParity][k][l], + vmec.m_[thread_id]->r1_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["ru"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->ru_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["ru"][jF][kOddParity][k][l], + vmec.m_[thread_id]->ru_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["z1"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->z1_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["z1"][jF][kOddParity][k][l], + vmec.m_[thread_id]->z1_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zu"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->zu_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zu"][jF][kOddParity][k][l], + vmec.m_[thread_id]->zu_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lu"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->lu_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lu"][jF][kOddParity][k][l], + vmec.m_[thread_id]->lu_o[idx_kl], tolerance)); + if (s.lthreed) { + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["rv"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->rv_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["rv"][jF][kOddParity][k][l], + vmec.m_[thread_id]->rv_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zv"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->zv_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["zv"][jF][kOddParity][k][l], + vmec.m_[thread_id]->zv_o[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lv"][jF][kEvenParity][k][l], + vmec.m_[thread_id]->lv_e[idx_kl], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(funct3d_geometry["lv"][jF][kOddParity][k][l], + vmec.m_[thread_id]->lv_o[idx_kl], tolerance)); + } // lthreed + + if (nsMinF <= jF && jF < nsMaxFIncludingLcfs) { + // spectral condensation is local per flux surface --> no need for + // numFull1 This index is invalid outside of [r->nsMinF, jMaxCon[ + // ! + const int idx_con = + ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + + const double sqrtSF = + radial_profiles.sqrtSF[jF - radial_partitioning.nsMinF1]; + + // VMEC++ computes rCon, zCon directly combined from even-m and + // odd-m contributions. This is different from educational_VMEC + // (and the other Fortran implementations), where the combination + // is computed after totzsp(s,a). Hence, need to combine the + // even-m and odd-m contributions in order to compute the required + // reference quantities. + const double expected_rcon_even = + funct3d_geometry["rcon"][jF][kEvenParity][k][l]; + const double expected_rcon_odd = + funct3d_geometry["rcon"][jF][kOddParity][k][l]; + const double expected_rcon = + expected_rcon_even + sqrtSF * expected_rcon_odd; + + const double expected_zcon_even = + funct3d_geometry["zcon"][jF][kEvenParity][k][l]; + const double expected_zcon_odd = + funct3d_geometry["zcon"][jF][kOddParity][k][l]; + const double expected_zcon = + expected_zcon_even + sqrtSF * expected_zcon_odd; + + EXPECT_TRUE(IsCloseRelAbs( + expected_rcon, vmec.m_[thread_id]->rCon[idx_con], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + expected_zcon, vmec.m_[thread_id]->zCon[idx_con], tolerance)); + } // within ...Con range: forces full-grid (numFull) + } // l + } // k + } // jF + } // thread_id + } +} // CheckInverseFourierTransformGeometry + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, InverseFourierTransformGeometryTest, + Values(DataSource{.identifier = "solovev", .tolerance = 2.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 2.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 6.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 6.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-12, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class JacobianTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(JacobianTest, CheckJacobian) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::JACOBIAN, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/jacobian/" + "jacobian_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_jacobian(filename); + ASSERT_TRUE(ifs_jacobian.is_open()) + << "failed to open reference file: " << filename; + json jacobian = json::parse(ifs_jacobian); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + int idx_kl = ((jH - nsMinH) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(jacobian["r12"][jH + 1][k][l], + vmec.m_[thread_id]->r12[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jacobian["ru12"][jH + 1][k][l], + vmec.m_[thread_id]->ru12[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jacobian["zu12"][jH + 1][k][l], + vmec.m_[thread_id]->zu12[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jacobian["rs"][jH + 1][k][l], + vmec.m_[thread_id]->rs[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jacobian["zs"][jH + 1][k][l], + vmec.m_[thread_id]->zs[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jacobian["tau"][jH + 1][k][l], + vmec.m_[thread_id]->tau[idx_kl], + tolerance)); + } // l + } // k + } // jH + + EXPECT_EQ(RestartReasonFromInt(jacobian["irst"]), fc.restart_reason); + } // thread_id + } +} // CheckJacobian + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, JacobianTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 2.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 2.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-13, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +class MetricTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(MetricTest, CheckMetric) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::METRIC, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/metric/" + "metric_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_metric(filename); + ASSERT_TRUE(ifs_metric.is_open()) + << "failed to open reference file: " << filename; + json metric = json::parse(ifs_metric); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + int idx_kl = ((jH - nsMinH) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(metric["gsqrt"][jH + 1][k][l], + vmec.m_[thread_id]->gsqrt[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(metric["guu"][jH + 1][k][l], + vmec.m_[thread_id]->guu[idx_kl], + tolerance)); + // Do not test r12sq, since this is not needed independently in + // VMEC++. + EXPECT_TRUE(IsCloseRelAbs(metric["gvv"][jH + 1][k][l], + vmec.m_[thread_id]->gvv[idx_kl], + tolerance)); + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs(metric["guv"][jH + 1][k][l], + vmec.m_[thread_id]->guv[idx_kl], + tolerance)); + } + } // l + } // k + } // jH + } // thread_id + } +} // CheckMetric + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, MetricTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-15}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-14, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +class VolumeTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(VolumeTest, CheckVolume) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + const HandoverStorage& h = vmec.h_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::VOLUME, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/volume/" + "volume_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_volume(filename); + ASSERT_TRUE(ifs_volume.is_open()) + << "failed to open reference file: " << filename; + json volume = json::parse(ifs_volume); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + EXPECT_TRUE(IsCloseRelAbs(volume["vp"][jH + 1], + vmec.p_[thread_id]->dVdsH[jH - nsMinH], + tolerance)); + } // jH + } // thread_id + + EXPECT_TRUE(IsCloseRelAbs(volume["voli"], h.voli, tolerance)); + } +} // CheckVolume + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, VolumeTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-16}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-16}, + DataSource{ + .identifier = "cma", .tolerance = 1.0e-15, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +class ContravariantMagneticFieldTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ContravariantMagneticFieldTest, CheckContravariantMagneticField) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::B_CONTRA, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bcontrav/" + "bcontrav_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_bcontrav(filename); + ASSERT_TRUE(ifs_bcontrav.is_open()) + << "failed to open reference file: " << filename; + json bcontrav = json::parse(ifs_bcontrav); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/add_fluxes/" + "add_fluxes_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_add_fluxes(filename); + ASSERT_TRUE(ifs_add_fluxes.is_open()) + << "failed to open reference file: " << filename; + json add_fluxes = json::parse(ifs_add_fluxes); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = ((jH - nsMinH) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(bcontrav["bsupv"][jH + 1][k][l], + vmec.m_[thread_id]->bsupv[idx_kl], + tolerance)); + } // l + } // k + + EXPECT_TRUE(IsCloseRelAbs(add_fluxes["chips"][jH], + vmec.p_[thread_id]->chipH[jH - nsMinH], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(add_fluxes["iotas"][jH], + vmec.p_[thread_id]->iotaH[jH - nsMinH], + tolerance)); + } // jH + + const int nsMinF1 = radial_partitioning.nsMinF1; + const int nsMaxF1 = radial_partitioning.nsMaxF1; + + const int nsMinFi = radial_partitioning.nsMinFi; + const int nsMaxFi = radial_partitioning.nsMaxFi; + + int jMaxIncludingBoundary = nsMaxFi; + if (nsMaxF1 == fc.ns) { + jMaxIncludingBoundary = nsMaxF1; + } + + for (int jFi = nsMinFi; jFi < jMaxIncludingBoundary; ++jFi) { + EXPECT_TRUE(IsCloseRelAbs(add_fluxes["chipf"][jFi], + vmec.p_[thread_id]->chipF[jFi - nsMinF1], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(add_fluxes["iotaf"][jFi], + vmec.p_[thread_id]->iotaF[jFi - nsMinF1], + tolerance)); + } // jF + } // thread_id + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = ((jH - nsMinH) * s.nZeta + k) * s.nThetaEff + l; + + // add_fluxes is integrated into computeBContra() in VMEC++ already, + // so we need to test the final bsupu here (the one coming out of + // add_fluxes). + EXPECT_TRUE(IsCloseRelAbs(add_fluxes["bsupu"][jH + 1][k][l], + vmec.m_[thread_id]->bsupu[idx_kl], + tolerance)); + } // l + } // k + } // jH + } // thread_id + } +} // CheckContravariantMagneticField + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, ContravariantMagneticFieldTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-16}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-16}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 6.0e-12, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class CovariantMagneticFieldTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(CovariantMagneticFieldTest, CheckCovariantMagneticField) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::B_CO, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bcov/bcov_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_bcov(filename); + ASSERT_TRUE(ifs_bcov.is_open()) + << "failed to open reference file: " << filename; + json bcov = json::parse(ifs_bcov); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + int idx_kl = ((jH - nsMinH) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(bcov["bsubuh"][jH + 1][k][l], + vmec.m_[thread_id]->bsubu[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(bcov["bsubvh"][jH + 1][k][l], + vmec.m_[thread_id]->bsubv[idx_kl], + tolerance)); + } // l + } // k + } // jH + } // thread_id + } +} // CheckCovariantMagneticField + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, CovariantMagneticFieldTest, + Values(DataSource{.identifier = "solovev", .tolerance = 2.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 2.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 6.0e-12, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class TotalPressureAndEnergiesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(TotalPressureAndEnergiesTest, CheckTotalPressureAndEnergies) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + const HandoverStorage& h = vmec.h_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::ENERGY, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bcov/bcov_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_bcov(filename); + ASSERT_TRUE(ifs_bcov.is_open()) + << "failed to open reference file: " << filename; + json bcov = json::parse(ifs_bcov); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = ((jH - nsMinH) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(bcov["bsq"][jH + 1][k][l], + vmec.m_[thread_id]->totalPressure[idx_kl], + tolerance)); + } // l + } // k + + EXPECT_TRUE(IsCloseRelAbs(bcov["pres"][jH], + vmec.p_[thread_id]->presH[jH - nsMinH], + tolerance)); + } // jH + } // thread_id + + EXPECT_TRUE(IsCloseRelAbs(bcov["wp"], h.thermalEnergy, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(bcov["wb"], h.magneticEnergy, tolerance)); + // The MHD energy is not available for testing in the bcov reference file + // from educational_VMEC. + } +} // CheckTotalPressureAndEnergies + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, TotalPressureAndEnergiesTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-16}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-16}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class RadialForceBalanceTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(RadialForceBalanceTest, CheckRadialForceBalance) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::RADIAL_FORCE_BALANCE, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/calc_fbal/" + "calc_fbal_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_calc_fbal(filename); + ASSERT_TRUE(ifs_calc_fbal.is_open()) + << "failed to open reference file: " << filename; + json calc_fbal = json::parse(ifs_calc_fbal); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["buco"][jH], + vmec.p_[thread_id]->bucoH[jH - nsMinH], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["bvco"][jH], + vmec.p_[thread_id]->bvcoH[jH - nsMinH], + tolerance)); + } // jH + + const int nsMinFi = radial_partitioning.nsMinFi; + const int nsMaxFi = radial_partitioning.nsMaxFi; + + for (int jFi = nsMinFi; jFi < nsMaxFi; ++jFi) { + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["jcurv"][jFi], + vmec.p_[thread_id]->jcurvF[jFi - nsMinFi], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["jcuru"][jFi], + vmec.p_[thread_id]->jcuruF[jFi - nsMinFi], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["presgrad"][jFi], + vmec.p_[thread_id]->presgradF[jFi - nsMinFi], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["vpphi"][jFi], + vmec.p_[thread_id]->dVdsF[jFi - nsMinFi], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(calc_fbal["equif"][jFi], + vmec.p_[thread_id]->equiF[jFi - nsMinFi], + tolerance)); + } // jFi + } // thread_id + } +} // CheckRadialForceBalance + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, RadialForceBalanceTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class HybridLambdaForceTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(HybridLambdaForceTest, CheckHybridLambdaForce) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + const HandoverStorage& h = vmec.h_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::HYBRID_LAMBDA_FORCE, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bcov_full/" + "bcov_full_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_bcov_full(filename); + ASSERT_TRUE(ifs_bcov_full.is_open()) + << "failed to open reference file: " << filename; + json bcov_full = json::parse(ifs_bcov_full); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/lulv_comb/" + "lulv_comb_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_lulv_comb(filename); + ASSERT_TRUE(ifs_lulv_comb.is_open()) + << "failed to open reference file: " << filename; + json lulv_comb = json::parse(ifs_lulv_comb); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + EXPECT_TRUE(IsCloseRelAbs(bcov_full["rbtor0"], h.rBtor0, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(bcov_full["rbtor"], h.rBtor, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(bcov_full["ctor"], h.cTor, tolerance)); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + + if (jF == 0) { + // PARVMEC does not scale the axis value of the lambda forces by + // (-lamscale). This is the behaviour desired for VMEC++, since it + // improves stability of the iterations. Hence, we need to + // back-port the axis lambda forces here for the comparison + // against educational_VMEC. + const double neg_lamscale = -1 * vmec.constants_.lamscale; + EXPECT_TRUE(IsCloseRelAbs( + lulv_comb["bsubv_e"][jF][k][l], + vmec.m_[thread_id]->blmn_e[idx_kl] * neg_lamscale, + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + lulv_comb["bsubv_o"][jF][k][l], + vmec.m_[thread_id]->blmn_o[idx_kl] * neg_lamscale, + tolerance)); + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs( + lulv_comb["bsubu_e"][jF][k][l], + vmec.m_[thread_id]->clmn_e[idx_kl] * neg_lamscale, + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + lulv_comb["bsubu_e"][jF][k][l], + vmec.m_[thread_id]->clmn_e[idx_kl] * neg_lamscale, + tolerance)); + } + } else { + EXPECT_TRUE(IsCloseRelAbs(lulv_comb["bsubv_e"][jF][k][l], + vmec.m_[thread_id]->blmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(lulv_comb["bsubv_o"][jF][k][l], + vmec.m_[thread_id]->blmn_o[idx_kl], + tolerance)); + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs(lulv_comb["bsubu_e"][jF][k][l], + vmec.m_[thread_id]->clmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(lulv_comb["bsubu_e"][jF][k][l], + vmec.m_[thread_id]->clmn_e[idx_kl], + tolerance)); + } + } + } // l + } // k + } // jF + } // thread_id + } +} // CheckHybridLambdaForce + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, HybridLambdaForceTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 2.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class UpdateRadialPreconditionerTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(UpdateRadialPreconditionerTest, CheckUpdateRadialPreconditioner) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::UPDATE_RADIAL_PRECONDITIONER, + number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/lamcal/" + "lamcal_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_preconditioner_update(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_lamcal(filename); + ASSERT_TRUE(ifs_lamcal.is_open()) + << "failed to open reference file: " << filename; + json lamcal = json::parse(ifs_lamcal); + + // only one file, since only updated every 25 iterations + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/precondn/" + "precondn_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_preconditioner_update(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_precondn(filename); + ASSERT_TRUE(ifs_precondn.is_open()) + << "failed to open reference file: " << filename; + json precondn = json::parse(ifs_precondn); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + // first check the lambda preconditioner + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(lamcal["blam"][jF], + vmec.m_[thread_id]->bLambda[jF - nsMinF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(lamcal["clam"][jF], + vmec.m_[thread_id]->cLambda[jF - nsMinF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(lamcal["dlam"][jF], + vmec.m_[thread_id]->dLambda[jF - nsMinF], + tolerance)); + } // jF + + int j_min_f = 0; + if (nsMinF == 0) { + // skip axis, as there is no lambda on the axis + j_min_f = 1; + } + + for (int jF = std::max(j_min_f, nsMinF); jF < nsMaxF; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + if (m == 0 && n == 0) { + // skip the (0,0)-component, as this is not used for lambda + continue; + } + + const int idx_mn = ((jF - nsMinF) * s.mpol + m) * (s.ntor + 1) + n; + + EXPECT_TRUE(IsCloseRelAbs( + lamcal["faclam"][jF][n][m], + vmec.m_[thread_id]->lambdaPreconditioner[idx_mn], tolerance)); + } // m + } // n + } // jF + + // now check the preconditioner for R and Z + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + EXPECT_TRUE(IsCloseRelAbs( + precondn["arm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->arm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["arm"][jH + 1][kOddParity], + vmec.m_[thread_id]->arm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["azm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->azm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["azm"][jH + 1][kOddParity], + vmec.m_[thread_id]->azm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + precondn["brm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->brm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["brm"][jH + 1][kOddParity], + vmec.m_[thread_id]->brm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["bzm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->bzm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["bzm"][jH + 1][kOddParity], + vmec.m_[thread_id]->bzm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + } // jH + + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + EXPECT_TRUE(IsCloseRelAbs( + precondn["ard"][jF][kEvenParity], + vmec.m_[thread_id]->ard[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["ard"][jF][kOddParity], + vmec.m_[thread_id]->ard[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["azd"][jF][kEvenParity], + vmec.m_[thread_id]->azd[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["azd"][jF][kOddParity], + vmec.m_[thread_id]->azd[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + precondn["brd"][jF][kEvenParity], + vmec.m_[thread_id]->brd[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["brd"][jF][kOddParity], + vmec.m_[thread_id]->brd[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["bzd"][jF][kEvenParity], + vmec.m_[thread_id]->bzd[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + precondn["bzd"][jF][kOddParity], + vmec.m_[thread_id]->bzd[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(precondn["crd"][jF], + vmec.m_[thread_id]->cxd[jF - nsMinF], + tolerance)); + } // jF + } // thread_id + } +} // CheckUpdateRadialPreconditioner + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, UpdateRadialPreconditionerTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class ForceNormsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ForceNormsTest, CheckForceNorms) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const HandoverStorage& h = vmec.h_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::UPDATE_FORCE_NORMS, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + // only one file, since only updated every 25 iterations + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/forceNorms_tcon/" + "forceNorms_tcon_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_preconditioner_update(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_forceNorms_tcon(filename); + ASSERT_TRUE(ifs_forceNorms_tcon.is_open()) + << "failed to open reference file: " << filename; + json forceNorms_tcon = json::parse(ifs_forceNorms_tcon); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + const FourierGeometry& decomposed_x = *vmec.decomposed_x_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + // test xc as well for fnorm1 + // only possible at every preconditioner update interval, + // because the xc written to the file will be outdated otherwise + if (vmec.m_[0]->shouldUpdateRadialPreconditioner(vmec.get_iter1(), + vmec.get_iter2())) { + for (int rzl = 0; rzl < 3; ++rzl) { + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE(IsCloseRelAbs( + forceNorms_tcon["xc"][rzl][idx_basis][jF][n][m], + decomposed_x.GetXcElement(rzl, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + } // rzl + } + } // thread_id + + EXPECT_TRUE(IsCloseRelAbs(forceNorms_tcon["fnorm"], h.fNormRZ, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forceNorms_tcon["fnormL"], h.fNormL, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forceNorms_tcon["fnorm1"], h.fNorm1, tolerance)); + } +} // CheckForceNorms + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, ForceNormsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 1.0e-12, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-14, + .iter2_to_test = {1, 2, 53, 54}})); + +class ConstraintForceMultiplierTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ConstraintForceMultiplierTest, CheckConstraintForceMultiplier) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::UPDATE_TCON, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + // only one file, since only updated every 25 iterations + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/forceNorms_tcon/" + "forceNorms_tcon_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_last_preconditioner_update(), + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_forceNorms_tcon(filename); + ASSERT_TRUE(ifs_forceNorms_tcon.is_open()) + << "failed to open reference file: " << filename; + json forceNorms_tcon = json::parse(ifs_forceNorms_tcon); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + // skip axis -> no constraint + const int jMin = std::max(1, nsMinF); + + for (int jF = jMin; jF < nsMaxFIncludingLcfs; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(forceNorms_tcon["tcon"][jF - 1], + vmec.m_[thread_id]->tcon[jF - nsMinF], + tolerance)); + } // jF + } // thread_id + } +} // CheckConstraintForceMultiplier + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, ConstraintForceMultiplierTest, + Values(DataSource{.identifier = "solovev", .tolerance = 2.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 2.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 1.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +// NOTE: Along the forward model evaluation, this is where Nestor +// (//vmecpp/nestor/...) is udpated. When debugging VMEC++ by going through the +// tests one by one along an iteration, run the Nestor tests here. + +class RBsqTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(RBsqTest, CheckRBsq) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::RBSQ, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + // The filename of rbsq debugging output is created based on the number of + // Nestor calls, and not the number of overall iterations. + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/rbsq/rbsq_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_rbsq(filename); + ASSERT_TRUE(ifs_rbsq.is_open()) + << "failed to open reference file: " << filename; + json rbsq = json::parse(ifs_rbsq); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + if (nsMaxFIncludingLcfs == fc.ns) { + // this thread has the LCFS in it + + for (int l = 0; l < s.nThetaEff; ++l) { + for (int k = 0; k < s.nZeta; ++k) { + const int kl = k * s.nThetaEff + l; + EXPECT_TRUE(IsCloseRelAbs(rbsq["rbsq"][k][l], + vmec.m_[thread_id]->rBSq[kl], tolerance)); + } // k + } // l + } // check for LCFS + } // thread_id + } +} // CheckRBsq + +INSTANTIATE_TEST_SUITE_P(TestIdealMHDModel, RBsqTest, + Values(DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-10, + .iter2_to_test = {53, 54}})); + +class AliasTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(AliasTest, CheckAlias) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::ALIAS, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/constraint_force/" + "constraint_force_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_constraint_force(filename); + ASSERT_TRUE(ifs_constraint_force.is_open()) + << "failed to open reference file: " << filename; + json constraint_force = json::parse(ifs_constraint_force); + + // step 1: check ingredients to input to effctiveConstraintForce() + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + // skip axis, as there is no constraint force on it + const int jMin = std::max(1, nsMinF); + + for (int jF = jMin; jF < nsMaxFIncludingLcfs; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(constraint_force["rcon"][jF][k][l], + vmec.m_[thread_id]->rCon[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(constraint_force["rcon0"][jF][k][l], + vmec.m_[thread_id]->rCon0[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(constraint_force["ru0"][jF][k][l], + vmec.m_[thread_id]->ruFull[idx_kl], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(constraint_force["zcon"][jF][k][l], + vmec.m_[thread_id]->zCon[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(constraint_force["zcon0"][jF][k][l], + vmec.m_[thread_id]->zCon0[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(constraint_force["zu0"][jF][k][l], + vmec.m_[thread_id]->zuFull[idx_kl], + tolerance)); + } // l + } // k + } // jF + } // thread_id + + // step 2: check input to and output from deAliasConstraintForce() + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + // skip axis, as there is no constraint force on it + const int jMin = std::max(1, nsMinF); + + for (int jF = jMin; jF < nsMaxFIncludingLcfs; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(constraint_force["extra1"][jF][k][l], + vmec.m_[thread_id]->gConEff[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(constraint_force["gcon"][jF][k][l], + vmec.m_[thread_id]->gCon[idx_kl], + tolerance)); + } // l + } // k + } // jF + } // thread_id + } +} // CheckAlias + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, AliasTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 2.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 2.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-13, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class RealspaceForcesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(RealspaceForcesTest, CheckRealspaceForces) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::REALSPACE_FORCES, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/forces/" + "forces_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_forces(filename.c_str()); + ASSERT_TRUE(ifs_forces.is_open()) + << "failed to open reference file: " << filename; + json forces = json::parse(ifs_forces); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + int idx_kl = ((jF - nsMinF) * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(forces["armn_e"][jF][k][l], + vmec.m_[thread_id]->armn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["armn_o"][jF][k][l], + vmec.m_[thread_id]->armn_o[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["azmn_e"][jF][k][l], + vmec.m_[thread_id]->azmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["azmn_o"][jF][k][l], + vmec.m_[thread_id]->azmn_o[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["brmn_e"][jF][k][l], + vmec.m_[thread_id]->brmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["brmn_o"][jF][k][l], + vmec.m_[thread_id]->brmn_o[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["bzmn_e"][jF][k][l], + vmec.m_[thread_id]->bzmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["bzmn_o"][jF][k][l], + vmec.m_[thread_id]->bzmn_o[idx_kl], + tolerance)); + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs(forces["crmn_e"][jF][k][l], + vmec.m_[thread_id]->crmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["crmn_o"][jF][k][l], + vmec.m_[thread_id]->crmn_o[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["czmn_e"][jF][k][l], + vmec.m_[thread_id]->czmn_e[idx_kl], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(forces["czmn_o"][jF][k][l], + vmec.m_[thread_id]->czmn_o[idx_kl], + tolerance)); + } + } // l + } // k + } // jF + } // thread_id + } +} // CheckRealspaceForces + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, RealspaceForcesTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-11}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-11}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 2.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class ForwardTransformForcesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ForwardTransformForcesTest, CheckForwardTransformForces) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::FWD_DFT_FORCES, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/tomnsps/" + "tomnsps_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_tomnsps(filename); + ASSERT_TRUE(ifs_tomnsps.is_open()) + << "failed to open reference file: " << filename; + json tomnsps = json::parse(ifs_tomnsps); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + int jMaxRZ = nsMaxF; + + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = ((jF - nsMinF) * s.mpol + m) * (s.ntor + 1) + n; + + if (jF < jMaxRZ) { + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["frcc"][jF][n][m], + vmec.physical_f_[thread_id]->frcc[idx_mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["fzsc"][jF][n][m], + vmec.physical_f_[thread_id]->fzsc[idx_mn], tolerance)); + } + EXPECT_TRUE(IsCloseRelAbs(tomnsps["flsc"][jF][n][m], + vmec.physical_f_[thread_id]->flsc[idx_mn], + tolerance)); + if (s.lthreed) { + if (jF < jMaxRZ) { + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["frss"][jF][n][m], + vmec.physical_f_[thread_id]->frss[idx_mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["fzcs"][jF][n][m], + vmec.physical_f_[thread_id]->fzcs[idx_mn], tolerance)); + } + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["flcs"][jF][n][m], + vmec.physical_f_[thread_id]->flcs[idx_mn], tolerance)); + } + if (s.lasym) { + if (jF < jMaxRZ) { + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["frsc"][jF][n][m], + vmec.physical_f_[thread_id]->frsc[idx_mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["fzcc"][jF][n][m], + vmec.physical_f_[thread_id]->fzcc[idx_mn], tolerance)); + } + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["flcc"][jF][n][m], + vmec.physical_f_[thread_id]->flcc[idx_mn], tolerance)); + if (s.lthreed) { + if (jF < jMaxRZ) { + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["frcs"][jF][n][m], + vmec.physical_f_[thread_id]->frcs[idx_mn], tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["fzss"][jF][n][m], + vmec.physical_f_[thread_id]->fzss[idx_mn], tolerance)); + } + EXPECT_TRUE(IsCloseRelAbs( + tomnsps["flss"][jF][n][m], + vmec.physical_f_[thread_id]->flss[idx_mn], tolerance)); + } + } + } // m + } // n + } // jF + } // thread_id + } +} // CheckForwardTransformForces + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, ForwardTransformForcesTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class PhysicalForcesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(PhysicalForcesTest, CheckPhysicalForces) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + static constexpr int kL = 2; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::PHYSICAL_FORCES, number_of_iterations).value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/phys_gc/" + "phys_gc_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_phys_gc(filename); + ASSERT_TRUE(ifs_phys_gc.is_open()) + << "failed to open reference file: " << filename; + json phys_gc = json::parse(ifs_phys_gc); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + EXPECT_TRUE( + IsCloseRelAbs(phys_gc["gcr"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(phys_gc["gcz"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(phys_gc["gcl"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // n + } // m + } // jF + } // idx_basis + } // thread_id + } +} // CheckPhysicalForces + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, PhysicalForcesTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class InvariantResidualsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InvariantResidualsTest, CheckInvariantResiduals) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::INVARIANT_RESIDUALS, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/fsq/fsq_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_fsq(filename); + ASSERT_TRUE(ifs_fsq.is_open()) + << "failed to open reference file: " << filename; + json fsq = json::parse(ifs_fsq); + + // copied from Vmec class for now + bool includeEdgeRZForces = (vmec.get_iter2() - vmec.get_iter1() < 50 && + fc.fsqr + fc.fsqz < 1.0e-6); + EXPECT_EQ(fsq["jedge"], (includeEdgeRZForces ? 1 : 0)); + + EXPECT_TRUE(IsCloseRelAbs(fsq["fsqr"], fc.fsqr, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(fsq["fsqz"], fc.fsqz, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(fsq["fsql"], fc.fsql, tolerance)); + } +} // CheckInvariantResiduals + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, InvariantResidualsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-16}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-16}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +class ApplyM1PreconditionerTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ApplyM1PreconditionerTest, CheckApplyM1Preconditioner) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::APPLY_M1_PRECONDITIONER, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/scale_m1/" + "scale_m1_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_scale_m1(filename); + ASSERT_TRUE(ifs_scale_m1.is_open()) + << "failed to open reference file: " << filename; + json scale_m1 = json::parse(ifs_scale_m1); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + EXPECT_TRUE( + IsCloseRelAbs(scale_m1["gcr"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(scale_m1["gcz"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + // lambda is not touched -> no need to re-test here + } // n + } // m + } // jF + } // idx_basis + } // thread_id + } +} // CheckApplyM1Preconditioner + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, ApplyM1PreconditionerTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-13}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11, + .iter2_to_test = {1, 2, 53, 54}})); + +class AssembleRZPreconditionerTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(AssembleRZPreconditionerTest, CheckAssembleRZPreconditioner) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::ASSEMBLE_RZ_PRECONDITIONER, + number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/scalfor_R/" + "scalfor_R_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_scalfor_R(filename); + ASSERT_TRUE(ifs_scalfor_R.is_open()) + << "failed to open reference file: " << filename; + json scalfor_R = json::parse(ifs_scalfor_R); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/scalfor_Z/" + "scalfor_Z_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_scalfor_Z(filename); + ASSERT_TRUE(ifs_scalfor_Z.is_open()) + << "failed to open reference file: " << filename; + json scalfor_Z = json::parse(ifs_scalfor_Z); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + const int idx_mn = ((jF - nsMinF) * s.mpol + m) * (s.ntor + 1) + n; + + EXPECT_TRUE(IsCloseRelAbs(scalfor_R["ax"][jF][n][m], + vmec.m_[thread_id]->ar[idx_mn], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(scalfor_R["dx"][jF][n][m], + vmec.m_[thread_id]->dr[idx_mn], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(scalfor_R["bx"][jF][n][m], + vmec.m_[thread_id]->br[idx_mn], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(scalfor_Z["ax"][jF][n][m], + vmec.m_[thread_id]->az[idx_mn], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(scalfor_Z["dx"][jF][n][m], + vmec.m_[thread_id]->dz[idx_mn], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(scalfor_Z["bx"][jF][n][m], + vmec.m_[thread_id]->bz[idx_mn], + tolerance)); + } // m + } // n + } // jF + } // thread_id + } +} // CheckAssembleRZPreconditioner + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, AssembleRZPreconditionerTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class ApplyPreconditionerTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ApplyPreconditionerTest, CheckApplyPreconditioner) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + static constexpr int kL = 2; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::APPLY_RADIAL_PRECONDITIONER, + number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/scalfor_out/" + "scalfor_out_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_scalfor_out(filename); + ASSERT_TRUE(ifs_scalfor_out.is_open()) + << "failed to open reference file: " << filename; + json scalfor_out = json::parse(ifs_scalfor_out); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxF = radial_partitioning.nsMaxF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + const int nsMinH = radial_partitioning.nsMinH; + const int nsMaxH = radial_partitioning.nsMaxH; + + // check preconditioner matrix elements again, just to be sure... + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["arm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->arm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["arm"][jH + 1][kOddParity], + vmec.m_[thread_id]->arm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["azm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->azm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["azm"][jH + 1][kOddParity], + vmec.m_[thread_id]->azm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["brm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->brm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["brm"][jH + 1][kOddParity], + vmec.m_[thread_id]->brm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["bzm"][jH + 1][kEvenParity], + vmec.m_[thread_id]->bzm[(jH - nsMinH) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["bzm"][jH + 1][kOddParity], + vmec.m_[thread_id]->bzm[(jH - nsMinH) * 2 + kOddParity], + tolerance)); + } // jH + + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["ard"][jF][kEvenParity], + vmec.m_[thread_id]->ard[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["ard"][jF][kOddParity], + vmec.m_[thread_id]->ard[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["azd"][jF][kEvenParity], + vmec.m_[thread_id]->azd[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["azd"][jF][kOddParity], + vmec.m_[thread_id]->azd[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["brd"][jF][kEvenParity], + vmec.m_[thread_id]->brd[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["brd"][jF][kOddParity], + vmec.m_[thread_id]->brd[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["bzd"][jF][kEvenParity], + vmec.m_[thread_id]->bzd[(jF - nsMinF) * 2 + kEvenParity], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + scalfor_out["bzd"][jF][kOddParity], + vmec.m_[thread_id]->bzd[(jF - nsMinF) * 2 + kOddParity], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(scalfor_out["crd"][jF], + vmec.m_[thread_id]->cxd[jF - nsMinF], + tolerance)); + } // jF + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxF; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + EXPECT_TRUE( + IsCloseRelAbs(scalfor_out["gcr"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(scalfor_out["gcz"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + } // n + } // m + } // jF + } // idx_basis + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + EXPECT_TRUE( + IsCloseRelAbs(scalfor_out["gcl"][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // n + } // m + } // jF + } // idx_basis + } // thread_id + } +} // CheckApplyPreconditioner + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, ApplyPreconditionerTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{ + .identifier = "cma", .tolerance = 2.0e-11, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-12, + .iter2_to_test = {1, 2, 53, 54}})); + +class PreconditionedResidualsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(PreconditionedResidualsTest, CheckPreconditionedResiduals) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::PRECONDITIONED_RESIDUALS, number_of_iterations) + .value(); + EXPECT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/fsq1/fsq1_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + std::ifstream ifs_fsq1(filename); + ASSERT_TRUE(ifs_fsq1.is_open()) + << "failed to open reference file: " << filename; + json fsq1 = json::parse(ifs_fsq1); + + EXPECT_TRUE(IsCloseRelAbs(fsq1["fnorm1"], vmec.h_.fNorm1, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(fsq1["fsqr1"], fc.fsqr1, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(fsq1["fsqz1"], fc.fsqz1, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(fsq1["fsql1"], fc.fsql1, tolerance)); + } +} // CheckPreconditionedResiduals + +INSTANTIATE_TEST_SUITE_P( + TestIdealMHDModel, PreconditionedResidualsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-16}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-16}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-16}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-16}, + DataSource{ + .identifier = "cma", .tolerance = 1.1e-14, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/output_quantities/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/output_quantities/BUILD.bazel new file mode 100644 index 000000000..5ae14c919 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/output_quantities/BUILD.bazel @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "output_quantities_test", + srcs = ["output_quantities_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/vmec/output_quantities", + "@googletest//:gtest_main", + "@nlohmann_json//:json", + "//util/file_io:file_io", + "//util/netcdf_io:netcdf_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/util:util", + "//vmecpp/vmec/vmec:vmec", + ], + size = "large", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/output_quantities/output_quantities_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/output_quantities/output_quantities_test.cc new file mode 100644 index 000000000..87cd81582 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/output_quantities/output_quantities_test.cc @@ -0,0 +1,1403 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/vmec/output_quantities/output_quantities.h" + +#include + +#include +#include +#include +#include + +#include "absl/strings/str_format.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/netcdf_io/netcdf_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/vmec/vmec.h" + +using nlohmann::json; + +using file_io::ReadFile; +using netcdf_io::NetcdfReadArray1D; +using netcdf_io::NetcdfReadArray2D; +using netcdf_io::NetcdfReadBool; +using netcdf_io::NetcdfReadChar; +using netcdf_io::NetcdfReadDouble; +using netcdf_io::NetcdfReadInt; +using netcdf_io::NetcdfReadString; +using testing::IsCloseRelAbs; + +using ::testing::ElementsAreArray; +using ::testing::TestWithParam; +using ::testing::Values; + +namespace fs = std::filesystem; + +namespace vmecpp { + +// used to specify case-specific tolerances +struct DataSource { + std::string identifier; + double tolerance = 0.0; +}; + +class GatherDataFromThreadsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(GatherDataFromThreadsTest, CheckGatherDataFromThreads) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::BCOVAR_FILEOUT).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bcovar_fileout/" + "bcovar_fileout_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_bcovar_fileout(filename); + ASSERT_TRUE(ifs_bcovar_fileout.is_open()) + << "failed to open reference file: " << filename; + json bcovar_fileout = json::parse(ifs_bcovar_fileout); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + for (int jH = 0; jH < fc.ns - 1; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jH * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs( + bcovar_fileout["lv_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsupu(idx_kl), tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + bcovar_fileout["lu_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsupv(idx_kl), tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + bcovar_fileout["bsubu_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsubu(idx_kl), tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + bcovar_fileout["bsubv_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsubv(idx_kl), tolerance)); + } // l + } // k + + EXPECT_TRUE(IsCloseRelAbs(bcovar_fileout["fpsi"][jH], + output_quantities.vmec_internal_results.bvcoH[jH], + tolerance)); + } // jH +} // CheckGatherDataFromThreads + +// Same as the test above, but we check the matrix elements in bsupu with 2D +// index access instead of linear access. This can go wrong (even if all other +// tests pass) in case output_quantities.cc mixes up the storage order of the +// Eigen matrix (ask me how I know). +TEST_P(GatherDataFromThreadsTest, CheckMatrixElementOrder) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::BCOVAR_FILEOUT).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bcovar_fileout/" + "bcovar_fileout_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_bcovar_fileout(filename); + ASSERT_TRUE(ifs_bcovar_fileout.is_open()) + << "failed to open reference file: " << filename; + json bcovar_fileout = json::parse(ifs_bcovar_fileout); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + for (int jH = 0; jH < fc.ns - 1; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int kl = k * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs( + bcovar_fileout["lv_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsupu(jH, kl), tolerance)); + } // l + } // k + } // jH +} // CheckMatrixElementOrder + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, GatherDataFromThreadsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-12}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{.identifier = "cma", .tolerance = 5.0e-11}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-11})); + +class BSSRoutineOutputsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(BSSRoutineOutputsTest, CheckBSSRoutineOutputs) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::BSS).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/bss/bss_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_bss(filename); + ASSERT_TRUE(ifs_bss.is_open()) + << "failed to open reference file: " << filename; + json bss = json::parse(ifs_bss); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + for (int jH = 0; jH < fc.ns - 1; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jH * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs( + bss["rv12"][jH + 1][k][l], + output_quantities.remaining_metric.rv12(idx_kl), tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + bss["zv12"][jH + 1][k][l], + output_quantities.remaining_metric.zv12(idx_kl), tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + bss["rs12"][jH + 1][k][l], + output_quantities.remaining_metric.rs12(idx_kl), tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + bss["zs12"][jH + 1][k][l], + output_quantities.remaining_metric.zs12(idx_kl), tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + bss["gsu"][jH + 1][k][l], + output_quantities.remaining_metric.gsu(idx_kl), tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + bss["gsv"][jH + 1][k][l], + output_quantities.remaining_metric.gsv(idx_kl), tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + bss["bsubs"][jH + 1][k][l], + output_quantities.bsubs_half.bsubs_half(idx_kl), tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(bss["br"][jH + 1][k][l], + output_quantities.b_cylindrical.b_r(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(bss["bphi"][jH + 1][k][l], + output_quantities.b_cylindrical.b_phi(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(bss["bz"][jH + 1][k][l], + output_quantities.b_cylindrical.b_z(idx_kl), + tolerance)); + } // l + } // k + } // jH +} // CheckBSSRoutineOutputs + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, BSSRoutineOutputsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-11}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-11}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-13}, + DataSource{.identifier = "cma", .tolerance = 5.0e-11}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 2.0e-11})); + +class LowpassFilterBSubsSTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(LowpassFilterBSubsSTest, CheckLowpassFilterBSubsS) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = + vmec.run(VmecCheckpoint::LOWPASS_BCOVARIANT).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/jxbforce_bsub_lowpass/" + "jxbforce_bsub_lowpass_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_jxbforce_bsub_lowpass(filename); + ASSERT_TRUE(ifs_jxbforce_bsub_lowpass.is_open()) + << "failed to open reference file: " << filename; + json jxbforce_bsub_lowpass = json::parse(ifs_jxbforce_bsub_lowpass); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + for (int jH = 0; jH < fc.ns - 1; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jH * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs( + jxbforce_bsub_lowpass["bsubu_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsubu(idx_kl), tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + jxbforce_bsub_lowpass["bsubv_e"][jH + 1][k][l], + output_quantities.vmec_internal_results.bsubv(idx_kl), tolerance)); + + EXPECT_TRUE(IsCloseRelAbs( + jxbforce_bsub_lowpass["bsubuv"][jH + 1][k][l], + output_quantities.covariant_b_derivatives.bsubuv(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + jxbforce_bsub_lowpass["bsubvu"][jH + 1][k][l], + output_quantities.covariant_b_derivatives.bsubvu(idx_kl), + tolerance)); + } // l + } // k + } // jH + + // bsubs was only available on the iterior full-grid points during + // filtering/derivative computation + for (int jF = 1; jF < fc.ns - 1; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jF * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs( + jxbforce_bsub_lowpass["bsubsu_e"][jF][k][l], + output_quantities.covariant_b_derivatives.bsubsu(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + jxbforce_bsub_lowpass["bsubsv_e"][jF][k][l], + output_quantities.covariant_b_derivatives.bsubsv(idx_kl), + tolerance)); + } // l + } // k + } // jH +} // CheckLowpassFilterBSubsS + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, LowpassFilterBSubsSTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-12}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{.identifier = "cma", .tolerance = 1.0e-10}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 2.0e-11})); + +class ExtrapolateBSubsSTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(ExtrapolateBSubsSTest, CheckExtrapolateBSubsS) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::EXTRAPOLATE_BSUBS).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/jxbout/" + "jxbout_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_jxbout(filename); + ASSERT_TRUE(ifs_jxbout.is_open()) + << "failed to open reference file: " << filename; + json jxbout = json::parse(ifs_jxbout); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + for (int jF = 1; jF < fc.ns - 1; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jF * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs( + jxbout["bsubs3"][jF][k][l], + output_quantities.bsubs_full.bsubs_full(idx_kl), tolerance)); + } // l + } // k + } // jH +} // CheckExtrapolateBSubsS + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, ExtrapolateBSubsSTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-12}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 2.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-15}, + DataSource{.identifier = "cma", .tolerance = 1.0e-11}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-12})); + +class JxBOutputContentsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(JxBOutputContentsTest, CheckJxBOutputContents) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::JXBOUT).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/jxbout/" + "jxbout_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_jxbout(filename); + ASSERT_TRUE(ifs_jxbout.is_open()) + << "failed to open reference file: " << filename; + json jxbout = json::parse(ifs_jxbout); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + for (int jF = 0; jF < fc.ns; ++jF) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jF * s.nZeta + k) * s.nThetaEff + l; + + // NOTE: catastrophic cancellation leads to a bad mismatch in itheta and + // izeta + EXPECT_TRUE(IsCloseRelAbs(jxbout["itheta"][jF][k][l], + output_quantities.jxbout.itheta(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["izeta"][jF][k][l], + output_quantities.jxbout.izeta(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["bdotk"][jF][k][l], + output_quantities.jxbout.bdotk(idx_kl), + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(jxbout["jsupu3"][jF][k][l], + output_quantities.jxbout.jsupu3(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["jsupv3"][jF][k][l], + output_quantities.jxbout.jsupv3(idx_kl), + tolerance)); + } // l + } // k + } // jF + + for (int jF = 0; jF < fc.ns; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(jxbout["amaxfor"][jF], + output_quantities.jxbout.amaxfor[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["aminfor"][jF], + output_quantities.jxbout.aminfor[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["avforce"][jF], + output_quantities.jxbout.avforce[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["pprim"][jF], + output_quantities.jxbout.pprim[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["jdotb"][jF], + output_quantities.jxbout.jdotb[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["bdotb"][jF], + output_quantities.jxbout.bdotb[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["bdotgradv"][jF], + output_quantities.jxbout.bdotgradv[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["jpar2"][jF], + output_quantities.jxbout.jpar2[jF], tolerance)); + + // catastrophic cancellation + // TODO(jons): Can we make this more accurate? + // FIXME(jons): This looks SO MUCH off that there actually could be an error + // still present... + EXPECT_TRUE(IsCloseRelAbs(jxbout["jperp2"][jF], + output_quantities.jxbout.jperp2[jF], 0.2)); + } // jF + + // The loop in jxbforce.f90:594 goes over js=2,ns1, + // which means that the last half-grid point is not touched. + for (int jH = 0; jH < fc.ns - 2; ++jH) { + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int idx_kl = (jH * s.nZeta + k) * s.nThetaEff + l; + + // catastrophic cancellation + EXPECT_TRUE(IsCloseRelAbs(jxbout["jsups3"][jH + 1][k][l], + output_quantities.jxbout.jsups3(idx_kl), + 5.0e-3)); + + EXPECT_TRUE(IsCloseRelAbs(jxbout["bsubu3"][jH + 1][k][l], + output_quantities.jxbout.bsubu3(idx_kl), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(jxbout["bsubv3"][jH + 1][k][l], + output_quantities.jxbout.bsubv3(idx_kl), + tolerance)); + } // l + } // k + } // jF +} // CheckJxBOutputContents + +// TODO(jons): Clarify below guess. +// I suspect these are so bad because J x B is close to 0 +// in case of an equilibrium with small toroidal current. +// cth_like_fixed_bdy has a large toroidal current, +// so I suspect that J x B is more well-defined in that case... +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, JxBOutputContentsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 2.0e-5}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 2.0e-5}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-5}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-5}, + DataSource{.identifier = "cma", .tolerance = 1.0e-4}, + DataSource{.identifier = "cth_like_free_bdy", .tolerance = 1.0e-5})); + +class MercierStabilityTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(MercierStabilityTest, CheckMercierStability) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::MERCIER).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/mercier/" + "mercier_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_mercier(filename); + ASSERT_TRUE(ifs_mercier.is_open()) + << "failed to open reference file: " << filename; + json mercier = json::parse(ifs_mercier); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const MercierStabilityIntermediateQuantities& mercier_intermediate = + vmec.output_quantities_.mercier_intermediate; + + EXPECT_EQ(output_quantities.vmec_internal_results.sign_of_jacobian, + mercier["sign_jac"]); + + for (int jF = 1; jF < fc.ns - 1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(mercier["phip_real"][jF], + mercier_intermediate.phip_realF[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["sj"][jF], mercier_intermediate.s[jF], + tolerance)); + } // jF + + for (int jH = 0; jH < fc.ns - 1; ++jH) { + EXPECT_TRUE(IsCloseRelAbs(mercier["vp_real"][jH], + mercier_intermediate.vp_real[jH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["torcur"][jH], + mercier_intermediate.torcur[jH], tolerance)); + } // jH + + for (int jF = 1; jF < fc.ns - 1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(mercier["shear"][jF - 1], + mercier_intermediate.shear[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["vpp"][jF - 1], + mercier_intermediate.vpp[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["presp"][jF - 1], + mercier_intermediate.d_pressure_d_s[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["ip"][jF - 1], + mercier_intermediate.d_toroidal_current_d_s[jF], + tolerance)); + } // jF + + for (int jF = 1; jF < fc.ns - 1; ++jF) { + for (int l = 0; l < s.nThetaEff; ++l) { + for (int k = 0; k < s.nZeta; ++k) { + const int index_full = (jF * s.nZeta + k) * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(mercier["gsqrt_full"][jF - 1][k][l], + mercier_intermediate.gsqrt_full(index_full), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["bdotj"][jF][k][l], + mercier_intermediate.bdotj(index_full), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["gpp"][jF - 1][k][l], + mercier_intermediate.gpp(index_full), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["b2"][jF][k][l], + mercier_intermediate.b2(index_full), + tolerance)); + } // k + } // l + } // jF + + for (int jF = 1; jF < fc.ns - 1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(mercier["tpp"][jF - 1], + mercier_intermediate.tpp[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["tbb"][jF - 1], + mercier_intermediate.tbb[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["tjb"][jF - 1], + mercier_intermediate.tjb[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["tjj"][jF - 1], + mercier_intermediate.tjj[jF], tolerance)); + } // jF + + const MercierFileContents& mercier_file_contents = + vmec.output_quantities_.mercier; + + // TODO(jons): check the first table in the Mercier output file + + // second table in Mercier output file + for (int jF = 1; jF < fc.ns - 1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(mercier["Dshear"][jF - 1], + mercier_file_contents.Dshear[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["Dcurr"][jF - 1], + mercier_file_contents.Dcurr[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["Dwell"][jF - 1], + mercier_file_contents.Dwell[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["Dgeod"][jF - 1], + mercier_file_contents.Dgeod[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(mercier["DMerc"][jF - 1], + mercier_file_contents.DMerc[jF], tolerance)); + } // jF +} // CheckMercierStability + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, MercierStabilityTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-9}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-9}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-9}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-9}, + DataSource{.identifier = "cma", .tolerance = 5.0e-9}, + DataSource{.identifier = "cth_like_free_bdy", .tolerance = 2.0e-9})); + +class Threed1FirstTableTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(Threed1FirstTableTest, CheckThreed1FirstTable) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = + vmec.run(VmecCheckpoint::THREED1_FIRST_TABLE).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/threed1_firstTable/" + "threed1_firstTable_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_threed1_firstTable(filename); + ASSERT_TRUE(ifs_threed1_firstTable.is_open()) + << "failed to open reference file: " << filename; + json threed1_firstTable = json::parse(ifs_threed1_firstTable); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const Threed1FirstTableIntermediate& threed1_first_table_intermediate = + output_quantities.threed1_first_table_intermediate; + const Threed1FirstTable& threed1_first_table = + output_quantities.threed1_first_table; + + for (int jH = 0; jH < fc.ns - 1; ++jH) { + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["beta_vol"][jH], + threed1_first_table_intermediate.beta_vol[jH], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["overr"][jH], + threed1_first_table_intermediate.overr[jH], + tolerance)); + } // jH + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["betaxis"], + threed1_first_table_intermediate.beta_axis, + tolerance)); + + for (int jF = 0; jF < fc.ns; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["presf"][jF], + threed1_first_table_intermediate.presf[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["phipf_loc"][jF], + threed1_first_table_intermediate.phipf_loc[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["phi1"][jF], + threed1_first_table_intermediate.phi1[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["chi1"][jF], + threed1_first_table_intermediate.chi1[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["chi"][jF], + threed1_first_table_intermediate.chi[jF], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["iotaf"][jF], + threed1_first_table.iota[jF], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["specw"][jF], + threed1_first_table.spectral_width[jF], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["equif"][jF], + threed1_first_table_intermediate.equif[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["equif"][jF], + threed1_first_table.radial_force[jF], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["bucof"][jF], + threed1_first_table_intermediate.bucof[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["bucof"][jF], + threed1_first_table.buco_full[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["bvcof"][jF], + threed1_first_table_intermediate.bvcof[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["bvcof"][jF], + threed1_first_table.bvco_full[jF], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["jcurv"][jF], + threed1_first_table_intermediate.jcurv[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["jcuru"][jF], + threed1_first_table_intermediate.jcuru[jF], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["presgrad"][jF], + threed1_first_table_intermediate.presgrad[jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["vpphi"][jF], + threed1_first_table_intermediate.vpphi[jF], + tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["jdotb"][jF], + threed1_first_table.j_dot_b[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_firstTable["bdotb"][jF], + threed1_first_table.b_dot_b[jF], tolerance)); + } // jF +} // CheckThreed1FirstTable + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, Threed1FirstTableTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-9}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-9}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-8}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-8}, + DataSource{.identifier = "cma", .tolerance = 1.0e-6}, + DataSource{.identifier = "cth_like_free_bdy", .tolerance = 2.0e-8})); + +class Threed1GeometricMagneticQuantitiesTest + : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(Threed1GeometricMagneticQuantitiesTest, + CheckThreed1GeometricMagneticQuantities) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::THREED1_GEOMAG).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/threed1_geomag/" + "threed1_geomag_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_threed1_geomag(filename); + ASSERT_TRUE(ifs_threed1_geomag.is_open()) + << "failed to open reference file: " << filename; + json threed1_geomag = json::parse(ifs_threed1_geomag); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const Threed1GeometricAndMagneticQuantitiesIntermediate& intermediate = + output_quantities.threed1_geometric_magnetic_intermediate; + const Threed1GeometricAndMagneticQuantities& result = + output_quantities.threed1_geometric_magnetic; + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["anorm"], intermediate.anorm, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["vnorm"], intermediate.vnorm, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["toroidal_flux"], + result.toroidal_flux, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["circum_p"], result.circum_p, tolerance)); + + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int kl = k * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["surf_area"][k][l], + intermediate.surf_area[kl], tolerance)); + } // k + } // l + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["surf_area_p"], result.surf_area_p, + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["volume_p"], result.volume_p, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["cross_area_p"], result.cross_area_p, + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["Rmajor_p"], result.Rmajor_p, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["Aminor_p"], result.Aminor_p, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["aspect"], result.aspect, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["kappa_p"], result.kappa_p, tolerance)); + + // intermediate: + // TODO(jons): rcenin (not used anywhere?) + // TODO(jons): aminr2in (not used anywhere?) + // TODO(jons): bminz2in (not used anywhere?) + // TODO(jons): bminz2 (not used anywhere?) + + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["rcen"], result.rcen, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["aminr1"], result.aminr1, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["sump"], intermediate.sump, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["pavg"], result.pavg, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["delphid_exact"], + intermediate.delphid_exact, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["musubi"], intermediate.musubi, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["rshaf1"], intermediate.rshaf1, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["rshaf2"], intermediate.rshaf2, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["rshaf"], intermediate.rshaf, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["fpsi0"], intermediate.fpsi0, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["b0"], result.b0, tolerance)); + + for (int k = 0; k < s.nZeta; ++k) { + for (int l = 0; l < s.nThetaEff; ++l) { + const int kl = k * s.nThetaEff + l; + + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["redge"][k][l], + intermediate.redge[kl], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["phat"][k][l], + intermediate.phat[kl], tolerance)); + } // k + } // l + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["rmax_surf"], result.rmax_surf, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["rmin_surf"], result.rmin_surf, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["zmax_surf"], result.zmax_surf, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["bmin_1_ns"], + result.bmin((fc.ns - 2) * s.nThetaReduced + 0), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["bmax_1_ns"], + result.bmax((fc.ns - 2) * s.nThetaReduced + 0), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + threed1_geomag["bmin_ntheta2_ns"], + result.bmin((fc.ns - 2) * s.nThetaReduced + (s.nThetaReduced - 1)), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + threed1_geomag["bmax_ntheta2_ns"], + result.bmax((fc.ns - 2) * s.nThetaReduced + (s.nThetaReduced - 1)), + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["waist"][0], result.waist[0], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["height"][0], result.height[0], tolerance)); + if (s.ntor > 1) { + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["waist"][1], result.waist[1], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["height"][1], result.height[1], + tolerance)); + } + + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["sumbtot"], intermediate.sumbtot, + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["sumbtor"], intermediate.sumbtor, + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["sumbpol"], intermediate.sumbpol, + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["sump20"], intermediate.sump20, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["sump2"], intermediate.sump2, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["betapol"], result.betapol, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["betatot"], result.betatot, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["betator"], result.betator, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["VolAvgB"], result.VolAvgB, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["IonLarmor"], result.IonLarmor, tolerance)); + + for (int jF = 1; jF < fc.ns - 1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["jPS2"][jF - 1], + intermediate.jPS2[jF], tolerance)); + } // jF + // TODO(jons): Is this catastrophic cancellation again? + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["s2"], intermediate.s2, 0.2)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["jpar_perp"], result.jpar_perp, 0.15)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["jparPS_perp"], result.jparPS_perp, 0.1)); + + for (int jF = 0; jF < fc.ns; ++jF) { + EXPECT_TRUE( + IsCloseRelAbs(threed1_geomag["psi"][jF], result.psi[jF], tolerance)); + } // jF + + for (int nplanes = 0; nplanes < 2; ++nplanes) { + for (int jF = 0; jF < fc.ns; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["ygeo"][nplanes][jF], + result.ygeo[nplanes * fc.ns + jF], tolerance)); + } + for (int jF = 1; jF < fc.ns; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["yinden"][nplanes][jF - 1], + result.yinden[nplanes * fc.ns + jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["yellip"][nplanes][jF - 1], + result.yellip[nplanes * fc.ns + jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["ytrian"][nplanes][jF - 1], + result.ytrian[nplanes * fc.ns + jF], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_geomag["yshift"][nplanes][jF - 1], + result.yshift[nplanes * fc.ns + jF], + tolerance)); + } + } // nplanes +} // CheckThreed1GeometricMagneticQuantities + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, Threed1GeometricMagneticQuantitiesTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-5}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-5}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-9}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-9}, + DataSource{.identifier = "cma", .tolerance = 1.0e-6}, + DataSource{.identifier = "cth_like_free_bdy", .tolerance = 1.0e-6})); + +class Threed1VolumetricsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(Threed1VolumetricsTest, CheckThreed1Volumetrics) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = + vmec.run(VmecCheckpoint::THREED1_VOLUMETRICS).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/threed1_volquant/" + "threed1_volquant_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_threed1_volquant(filename); + ASSERT_TRUE(ifs_threed1_volquant.is_open()) + << "failed to open reference file: " << filename; + json threed1_volquant = json::parse(ifs_threed1_volquant); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const Threed1Volumetrics& result = output_quantities.threed1_volumetrics; + + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["int_p"], result.int_p, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["avg_p"], result.avg_p, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["int_bpol"], result.int_bpol, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["avg_bpol"], result.avg_bpol, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["int_btor"], result.int_btor, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["avg_btor"], result.avg_btor, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["int_modb"], result.int_modb, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["avg_modb"], result.avg_modb, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["int_ekin"], result.int_ekin, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_volquant["avg_ekin"], result.avg_ekin, tolerance)); +} // CheckThreed1Volumetrics + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, Threed1VolumetricsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-12}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{.identifier = "cma", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-10})); + +class Threed1AxisTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(Threed1AxisTest, CheckThreed1Axis) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = vmec.run(VmecCheckpoint::THREED1_AXIS).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/threed1_axis/" + "threed1_axis_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_threed1_axis(filename); + ASSERT_TRUE(ifs_threed1_axis.is_open()) + << "failed to open reference file: " << filename; + json threed1_axis = json::parse(ifs_threed1_axis); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const Threed1AxisGeometry& axis = output_quantities.threed1_axis; + + for (int n = 0; n <= s.ntor; ++n) { + EXPECT_TRUE(IsCloseRelAbs(threed1_axis["rax_symm"][n], axis.raxis_symm[n], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_axis["zax_symm"][n], axis.zaxis_symm[n], + tolerance)); + if (s.lasym) { + EXPECT_TRUE(IsCloseRelAbs(threed1_axis["rax_asym"][n], axis.raxis_asym[n], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_axis["zax_asym"][n], axis.zaxis_asym[n], + tolerance)); + } + } // n +} // CheckThreed1Axis + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, Threed1AxisTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-12}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{.identifier = "cma", .tolerance = 1.0e-11}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 2.0e-11})); + +class Threed1BetasTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(Threed1BetasTest, CheckThreed1Betas) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::THREED1_BETAS).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/threed1_beta/" + "threed1_beta_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_threed1_beta(filename); + ASSERT_TRUE(ifs_threed1_beta.is_open()) + << "failed to open reference file: " << filename; + json threed1_beta = json::parse(ifs_threed1_beta); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const Threed1Betas& result = output_quantities.threed1_betas; + + EXPECT_TRUE( + IsCloseRelAbs(threed1_beta["betatot"], result.betatot, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_beta["betapol"], result.betapol, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_beta["betator"], result.betator, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_beta["rbtor"], result.rbtor, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_beta["betaxis"], result.betaxis, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_beta["betstr"], result.betstr, tolerance)); +} // CheckThreed1Betas + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, Threed1BetasTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-12}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-12}, + DataSource{.identifier = "cma", .tolerance = 1.0e-12}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11})); + +class Threed1ShafranovIntegralsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(Threed1ShafranovIntegralsTest, CheckThreed1ShafranovIntegrals) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = + vmec.run(VmecCheckpoint::THREED1_SHAFRANOV_INTEGRALS).value(); + ASSERT_FALSE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/threed1_shafrint/" + "threed1_shafrint_%05d_000000_01.%s.json", + data_source_.identifier, fc.ns, data_source_.identifier); + + std::ifstream ifs_threed1_shafrint(filename); + ASSERT_TRUE(ifs_threed1_shafrint.is_open()) + << "failed to open reference file: " << filename; + json threed1_shafrint = json::parse(ifs_threed1_shafrint); + + const OutputQuantities& output_quantities = vmec.output_quantities_; + + const Threed1ShafranovIntegrals& result = + output_quantities.threed1_shafranov_integrals; + + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["scaling_ratio"], + result.scaling_ratio, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["rlao"], result.r_lao, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["flao"], result.f_lao, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["fgeo"], result.f_geo, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["smaleli"], result.smaleli, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["betai"], result.betai, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["musubi"], result.musubi, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["lambda"], result.lambda, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["s11"], result.s11, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["s12"], result.s12, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["s13"], result.s13, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["s2"], result.s2, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(threed1_shafrint["s3"], result.s3, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["delta1"], result.delta1, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["delta2"], result.delta2, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(threed1_shafrint["delta3"], result.delta3, tolerance)); +} // CheckThreed1GeometricMagneticQuantities + +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, Threed1ShafranovIntegralsTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-11}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-11}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 5.0e-11}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 5.0e-11}, + DataSource{.identifier = "cma", .tolerance = 5.0e-11}, + DataSource{.identifier = "cth_like_free_bdy", .tolerance = 5.0e-5}) + // NOTE: vacuum_b_phi likely largest influence here! +); + +class CurrentDensityTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(CurrentDensityTest, CheckCurrentDensityFourierCoefficients) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + + // run until convergence + bool reached_checkpoint = vmec.run().value(); + ASSERT_FALSE(reached_checkpoint); + + const WOutFileContents& wout = vmec.output_quantities_.wout; + + // Read reference currumnc/currvmnc from Fortran wout file + std::string ref_wout_filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/wout_%s.nc", data_source_.identifier); + + int ncid = 0; + ASSERT_EQ(nc_open(ref_wout_filename.c_str(), NC_NOWRITE, &ncid), NC_NOERR) + << "Failed to open reference wout file: " << ref_wout_filename; + + // Read 2D arrays: Fortran stores as (ns, mnmax_nyq), C++ as (mnmax_nyq, ns) + const std::vector> ref_currumnc = + NetcdfReadArray2D(ncid, "currumnc").value(); + const std::vector> ref_currvmnc = + NetcdfReadArray2D(ncid, "currvmnc").value(); + nc_close(ncid); + + const int ns = static_cast(ref_currumnc.size()); + ASSERT_EQ(ns, wout.ns); + ASSERT_GT(ns, 0); + const int mnmax_nyq = static_cast(ref_currumnc[0].size()); + ASSERT_EQ(mnmax_nyq, wout.mnmax_nyq); + + for (int jF = 0; jF < ns; ++jF) { + for (int mn = 0; mn < mnmax_nyq; ++mn) { + // ref_currumnc[jF][mn] is Fortran ordering (ns, mnmax_nyq) + // wout.currumnc(mn, jF) is C++ ordering (mnmax_nyq, ns) + EXPECT_TRUE( + IsCloseRelAbs(ref_currumnc[jF][mn], wout.currumnc(mn, jF), tolerance)) + << "currumnc mismatch at jF=" << jF << " mn=" << mn + << " ref=" << ref_currumnc[jF][mn] + << " test=" << wout.currumnc(mn, jF); + EXPECT_TRUE( + IsCloseRelAbs(ref_currvmnc[jF][mn], wout.currvmnc(mn, jF), tolerance)) + << "currvmnc mismatch at jF=" << jF << " mn=" << mn + << " ref=" << ref_currvmnc[jF][mn] + << " test=" << wout.currvmnc(mn, jF); + } // mn + } // jF +} // CheckCurrentDensityFourierCoefficients + +// NOTE: Tolerances are larger than for other output quantities because +// the current density is computed via finite differences of the covariant B +// field Fourier coefficients, which amplifies the differences between the +// Fortran and C++ equilibria. +INSTANTIATE_TEST_SUITE_P( + TestOutputQuantities, CurrentDensityTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-4}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-4}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-4}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-4}, + DataSource{.identifier = "cma", .tolerance = 1.0e-4})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/radial_profiles/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/radial_profiles/BUILD.bazel new file mode 100644 index 000000000..bef9d93b1 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/radial_profiles/BUILD.bazel @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "radial_profiles_test", + srcs = ["radial_profiles_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_analytical", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_analytical", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/vmec/radial_profiles", + "//vmecpp/vmec/vmec_constants", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + "//vmecpp/common/flow_control:flow_control", + "//vmecpp/common/fourier_basis_fast_poloidal", + "//vmecpp/vmec/boundaries:boundaries", + "//vmecpp/vmec/vmec:vmec", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/radial_profiles/radial_profiles_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/radial_profiles/radial_profiles_test.cc new file mode 100644 index 000000000..6c8ab0f00 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/radial_profiles/radial_profiles_test.cc @@ -0,0 +1,284 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/vmec/radial_profiles/radial_profiles.h" + +#include +#include + +#include "vmecpp/vmec/vmec_constants/vmec_algorithm_constants.h" +#include "vmecpp/vmec/vmec_constants/vmec_constants.h" + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include "absl/strings/str_format.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/flow_control/flow_control.h" +#include "vmecpp/common/fourier_basis_fast_poloidal/fourier_basis_fast_poloidal.h" +#include "vmecpp/common/util/util.h" +#include "vmecpp/vmec/boundaries/boundaries.h" +#include "vmecpp/vmec/vmec/vmec.h" + +namespace vmecpp { + +namespace { +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using vmecpp::vmec_algorithm_constants::kEvenParity; +using vmecpp::vmec_algorithm_constants::kOddParity; + +using ::testing::TestWithParam; +using ::testing::Values; +} // namespace + +// used to specify tolerance depending on test case +struct DataSource { + std::string identifier; + double tolerance = 0.0; +}; + +TEST(TestRadialProfiles, CheckSolovevSingleThreaded) { + double tolerance = DBL_EPSILON / 2; + + absl::StatusOr indata_json = + ReadFile("vmecpp/test_data/solovev.json"); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + // force single-threaded execution + Vmec vmec(*vmec_indata, /*max_threads=*/1); + + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + const VmecConstants& vmec_consts = vmec.constants_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::RADIAL_PROFILES_EVAL, 1).value(); + ASSERT_TRUE(reached_checkpoint); + + std::string filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/solovev/profil1d/" + "profil1d_%05d_000001_%02d.solovev.json", + fc.ns, vmec.get_num_eqsolve_retries()); + std::ifstream ifs_profil1d(filename); + ASSERT_TRUE(ifs_profil1d.is_open()); + json profil1d = json::parse(ifs_profil1d); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/solovev/profil3d/" + "profil3d_%05d_000001_%02d.solovev.json", + fc.ns, vmec.get_num_eqsolve_retries()); + std::ifstream ifs_profil3d(filename); + ASSERT_TRUE(ifs_profil3d.is_open()); + json profil3d = json::parse(ifs_profil3d); + + const RadialProfiles& p = *(vmec.p_[0]); + + EXPECT_TRUE( + IsCloseRelAbs(profil1d["torflux_edge"], p.maxToroidalFlux, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(profil1d["polflux_edge"], p.maxPoloidalFlux, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["r00"], + vmec_indata->rbc(0, vmec_indata->ntor), tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["lamscale"], vmec_consts.lamscale, + tolerance)); // now in HandoverStorage! + EXPECT_TRUE(IsCloseRelAbs(profil1d["currv"], p.currv, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["Itor"], p.Itor, tolerance)); + + // half-grid profiles + for (int jH = 0; jH < fc.ns - 1; ++jH) { + EXPECT_TRUE( + IsCloseRelAbs(profil1d["shalf"][jH + 1], p.sqrtSH[jH], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(profil1d["phips"][jH + 1], p.phipH[jH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["chips"][jH], p.chipH[jH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["iotas"][jH], p.iotaH[jH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["icurv"][jH], p.currH[jH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["mass"][jH], p.massH[jH], tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(profil1d["sp"][jH + 1], p.sp[jH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["sm"][jH + 1], p.sm[jH], tolerance)); + } + + // full-grid profiles + for (int jF = 0; jF < fc.ns; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(profil1d["sqrts"][jF], p.sqrtSF[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["phipf"][jF], p.phipF[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["chipf"][jF], p.chipF[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["iotaf"][jF], p.iotaF[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(profil1d["bdamp"][jF], p.radialBlending[jF], tolerance)); + } + + // scalxc is in profil3d output in educational_VMEC, + // but is computed in RadialProfiles in VMEC++, so test it here. + for (int jF = 0; jF < fc.ns; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + if (m % 2 == 0) { // m is even + EXPECT_TRUE(IsCloseRelAbs( + profil3d["scalxc"][jF][n][m], + p.scalxc[(jF - vmec.r_[0]->nsMinF1) * 2 + kEvenParity], + tolerance)); + } else { // m is odd + EXPECT_TRUE(IsCloseRelAbs( + profil3d["scalxc"][jF][n][m], + p.scalxc[(jF - vmec.r_[0]->nsMinF1) * 2 + kOddParity], + tolerance)); + } + } // m + } // n + } +} // CheckSolovevSingleThreaded + +class RadialProfilesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(RadialProfilesTest, CheckRadialProfiles) { + const double tolerance = data_source_.tolerance; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr vmec_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + const VmecConstants& vmec_consts = vmec.constants_; + + // run to SETUP_INITIAL_STATE in order to also get scalxc computed + bool reached_checkpoint = + vmec.run(VmecCheckpoint::SETUP_INITIAL_STATE, 1).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/profil1d/" + "profil1d_%05d_000001_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_num_eqsolve_retries(), + data_source_.identifier); + + std::ifstream ifs_profil1d(filename); + ASSERT_TRUE(ifs_profil1d.is_open()); + json profil1d = json::parse(ifs_profil1d); + + // TODO(jons): load data for current ns value, once this test runs for all + // entries in ns_array + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/profil3d/" + "profil3d_%05d_000001_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_num_eqsolve_retries(), + data_source_.identifier); + std::ifstream ifs_profil3d(filename); + ASSERT_TRUE(ifs_profil3d.is_open()); + json profil3d = json::parse(ifs_profil3d); + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& r = *vmec.r_[thread_id]; + const RadialProfiles& p = *(vmec.p_[thread_id]); + + const int nsMinH = r.nsMinH; + const int nsMaxH = r.nsMaxH; + + const int nsMinF1 = r.nsMinF1; + const int nsMaxF1 = r.nsMaxF1; + + EXPECT_TRUE( + IsCloseRelAbs(profil1d["torflux_edge"], p.maxToroidalFlux, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(profil1d["polflux_edge"], p.maxPoloidalFlux, tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + profil1d["r00"], vmec_indata->rbc(0, vmec_indata->ntor), tolerance)); + // now in HandoverStorage! + EXPECT_TRUE( + IsCloseRelAbs(profil1d["lamscale"], vmec_consts.lamscale, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["currv"], p.currv, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["Itor"], p.Itor, tolerance)); + + // half-grid profiles + for (int jH = nsMinH; jH < nsMaxH; ++jH) { + EXPECT_TRUE(IsCloseRelAbs(profil1d["shalf"][jH + 1], + p.sqrtSH[jH - nsMinH], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["phips"][jH + 1], p.phipH[jH - nsMinH], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["chips"][jH], p.chipH[jH - nsMinH], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["iotas"][jH], p.iotaH[jH - nsMinH], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["icurv"][jH], p.currH[jH - nsMinH], + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(profil1d["mass"][jH], p.massH[jH - nsMinH], tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(profil1d["sp"][jH + 1], p.sp[jH - nsMinH], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(profil1d["sm"][jH + 1], p.sm[jH - nsMinH], tolerance)); + } + + // full-grid profiles + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs(profil1d["sqrts"][jF], p.sqrtSF[jF - nsMinF1], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["phipf"][jF], p.phipF[jF - nsMinF1], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["chipf"][jF], p.chipF[jF - nsMinF1], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["iotaf"][jF], p.iotaF[jF - nsMinF1], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(profil1d["bdamp"][jF], + p.radialBlending[jF - nsMinF1], tolerance)); + } + + // scalxc is in profil3d output in educational_VMEC, + // but is computed in RadialProfiles in VMEC++, so test it here. + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + if (m % 2 == 0) { + // m is even + EXPECT_TRUE(IsCloseRelAbs( + profil3d["scalxc"][jF][n][m], + p.scalxc[(jF - nsMinF1) * 2 + kEvenParity], tolerance)); + } else { + // m is odd + EXPECT_TRUE(IsCloseRelAbs(profil3d["scalxc"][jF][n][m], + p.scalxc[(jF - nsMinF1) * 2 + kOddParity], + tolerance)); + } + } // m + } // n + } + } // thread_id +} // CheckSolovevMultiThreaded + +INSTANTIATE_TEST_SUITE_P( + TestRadialProfiles, RadialProfilesTest, + Values(DataSource{.identifier = "solovev", .tolerance = DBL_EPSILON / 2}, + DataSource{.identifier = "solovev_analytical", .tolerance = 1.0e-15}, + DataSource{.identifier = "solovev_no_axis", + .tolerance = DBL_EPSILON / 2}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = DBL_EPSILON}, + DataSource{.identifier = "cma", .tolerance = DBL_EPSILON}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = DBL_EPSILON})); + +} // namespace vmecpp diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/vmec/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/vmec/BUILD.bazel new file mode 100644 index 000000000..3d0012d69 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/vmec/BUILD.bazel @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "vmec_test", + srcs = ["vmec_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:solovev_no_axis", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:solovev_no_axis", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy_nzeta_37", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "//vmecpp/vmec/vmec", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//util/testing:numerical_comparison_lib", + ], + size = "small", +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/vmec/vmec_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/vmec/vmec_test.cc new file mode 100644 index 000000000..93bdaa3a5 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec/vmec/vmec_test.cc @@ -0,0 +1,512 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include "vmecpp/vmec/vmec/vmec.h" + +#include +#include +#include + +#include "absl/log/check.h" +#include "vmecpp/common/flow_control/flow_control.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/fourier_geometry/fourier_geometry.h" +#include "vmecpp/vmec/handover_storage/handover_storage.h" +#include "vmecpp/vmec/output_quantities/output_quantities.h" +#include "vmecpp/vmec/radial_partitioning/radial_partitioning.h" + +#ifdef _OPENMP +#include +#endif // _OPENMP + +#include "absl/strings/str_format.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "nlohmann/json.hpp" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/util/util.h" + +using nlohmann::json; + +using file_io::ReadFile; +using testing::IsCloseRelAbs; + +using ::testing::DoubleNear; +using ::testing::ElementsAreArray; +using ::testing::Pointwise; +using ::testing::TestWithParam; +using ::testing::Values; + +using vmecpp::FlowControl; +using vmecpp::HandoverStorage; +using vmecpp::RadialPartitioning; +using vmecpp::Sizes; +using vmecpp::Vmec; +using vmecpp::VmecCheckpoint; +using vmecpp::VmecINDATA; + +namespace fs = std::filesystem; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class PrintoutTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(PrintoutTest, CheckPrintout) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + static constexpr int kL = 2; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + const HandoverStorage& h = vmec.h_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::PRINTOUT, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/printout/" + "printout_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_printout(filename); + ASSERT_TRUE(ifs_printout.is_open()) + << "failed to open reference file: " << filename; + json printout = json::parse(ifs_printout); + + EXPECT_TRUE(IsCloseRelAbs(printout["betav"], + h.thermalEnergy / h.magneticEnergy, tolerance)); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + if (radial_partitioning.nsMaxF1 == fc.ns) { + EXPECT_TRUE(IsCloseRelAbs(printout["delbsq"], + vmec.m_[thread_id]->get_delbsq(), tolerance)); + } + + const int nsMinF1 = radial_partitioning.nsMinF1; + const int nsMaxF1 = radial_partitioning.nsMaxF1; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE(IsCloseRelAbs( + printout["gc"][kR][idx_basis][jF][n][m], + vmec.physical_x_backup_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + printout["gc"][kZ][idx_basis][jF][n][m], + vmec.physical_x_backup_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE(IsCloseRelAbs( + printout["gc"][kL][idx_basis][jF][n][m], + vmec.physical_x_backup_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + EXPECT_TRUE(IsCloseRelAbs( + printout["specw"][jF], + vmec.p_[thread_id]->spectral_width[jF - nsMinF1], tolerance)); + } // jF + } // thread_id + + EXPECT_TRUE(IsCloseRelAbs(printout["avm"], h.VolumeAveragedSpectralWidth(), + tolerance)); + } +} // CheckPrintout + +INSTANTIATE_TEST_SUITE_P( + TestVmec, PrintoutTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 5.0e-16, + .iter2_to_test = {1}}, + DataSource{.identifier = "solovev_no_axis", + .tolerance = 5.0e-16, + .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-14, + .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-14, + .iter2_to_test = {1}}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-13, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-14, + .iter2_to_test = {1}})); + +class EvolveTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(EvolveTest, CheckEvolve) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + static constexpr int kL = 2; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + for (int number_of_iterations : data_source_.iter2_to_test) { + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + bool reached_checkpoint = + vmec.run(VmecCheckpoint::EVOLVE, number_of_iterations).value(); + ASSERT_TRUE(reached_checkpoint); + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/evolve/" + "evolve_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, number_of_iterations, + vmec.get_num_eqsolve_retries(), data_source_.identifier); + + std::ifstream ifs_evolve(filename); + ASSERT_TRUE(ifs_evolve.is_open()) + << "failed to open reference file: " << filename; + json evolve = json::parse(ifs_evolve); + + // perform testing outside of multi-threaded region to avoid overlapping + // error messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE( + IsCloseRelAbs(evolve["gc"][kR][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(evolve["gc"][kZ][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(evolve["gc"][kL][idx_basis][jF][n][m], + vmec.decomposed_f_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(evolve["xcdot_after"][kR][idx_basis][jF][n][m], + vmec.decomposed_v_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(evolve["xcdot_after"][kZ][idx_basis][jF][n][m], + vmec.decomposed_v_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(evolve["xcdot_after"][kL][idx_basis][jF][n][m], + vmec.decomposed_v_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(evolve["xc_after"][kR][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(evolve["xc_after"][kZ][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(evolve["xc_after"][kL][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + } // thread_id + } +} // CheckEvolve + +INSTANTIATE_TEST_SUITE_P( + TestVmec, EvolveTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 2.0e-14}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 2.0e-14}, + DataSource{ + .identifier = "cma", .tolerance = 5.0e-13, .iter2_to_test = {1}}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 5.0e-13, + .iter2_to_test = {1, 2, 53, 54}})); + +class MultigridResultTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(MultigridResultTest, CheckMultigridResult) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + static constexpr int kL = 2; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + // TODO(jons): need to limit for first multi-grid step for now ... + bool reached_checkpoint = vmec.run(VmecCheckpoint::NONE, INT_MAX, 1).value(); + ASSERT_FALSE(reached_checkpoint); + + // Here, we implicitly test for correct number of iterations until convergence + // by constructing the filename based on the number of iterations VMEC++ took. + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/multigrid_result/" + "multigrid_result_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, vmec.get_iter2(), vmec.get_jacob_off(), + data_source_.identifier); + + std::ifstream ifs_multigrid_result(filename); + ASSERT_TRUE(ifs_multigrid_result.is_open()) + << "failed to open reference file: " << filename; + json multigrid_result = json::parse(ifs_multigrid_result); + + // perform testing outside of multi-threaded region to avoid overlapping error + // messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE( + IsCloseRelAbs(multigrid_result["xc"][kR][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(multigrid_result["xc"][kZ][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(multigrid_result["xc"][kL][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + } // thread_id +} // CheckMultigridResult + +INSTANTIATE_TEST_SUITE_P( + TestVmec, MultigridResultTest, + Values(DataSource{.identifier = "solovev", .tolerance = 5.0e-15}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 5.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", .tolerance = 1.0e-13}, + DataSource{.identifier = "cth_like_fixed_bdy_nzeta_37", + .tolerance = 1.0e-13}, + DataSource{.identifier = "cma", .tolerance = 1.0e-11}, + DataSource{.identifier = "cth_like_free_bdy", + .tolerance = 1.0e-11})); + +class InterpTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InterpTest, CheckInterp) { + const double tolerance = data_source_.tolerance; + + static constexpr int kR = 0; + static constexpr int kZ = 1; + static constexpr int kL = 2; + + std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", data_source_.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + const absl::StatusOr vmec_indata = + VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(vmec_indata.ok()); + + Vmec vmec(*vmec_indata); + const Sizes& s = vmec.s_; + const FlowControl& fc = vmec.fc_; + + // run until convergence + bool reached_checkpoint = vmec.run(VmecCheckpoint::INTERP).value(); + ASSERT_TRUE(reached_checkpoint); + + // Here, we implicitly test for correct number of iterations until convergence + // by constructing the filename based on the number of iterations VMEC++ took. + + filename = absl::StrFormat( + "vmecpp_large_cpp_tests/test_data/%s/interp/" + "interp_%05d_%06d_%02d.%s.json", + data_source_.identifier, fc.ns, 1, 1, data_source_.identifier); + + std::ifstream ifs_interp(filename); + ASSERT_TRUE(ifs_interp.is_open()) + << "failed to open reference file: " << filename; + json interp = json::parse(ifs_interp); + + EXPECT_THAT(vmec.sj, ElementsAreArray(interp["sj"])); + EXPECT_THAT(vmec.js1, ElementsAreArray(interp["js1"])); + EXPECT_THAT(vmec.js2, ElementsAreArray(interp["js2"])); + EXPECT_THAT(vmec.s1, ElementsAreArray(interp["s1"])); + EXPECT_THAT(vmec.xint, ElementsAreArray(interp["xint"])); + + // test previous xc + std::size_t num_threads_old = vmec.old_xc_scaled_.size(); + for (std::size_t thread_id = 0; thread_id < num_threads_old; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.old_r_[thread_id]; + + const int nsMinF = radial_partitioning.nsMinF; + const int nsMaxFIncludingLcfs = radial_partitioning.nsMaxFIncludingLcfs; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF; jF < nsMaxFIncludingLcfs; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + EXPECT_TRUE( + IsCloseRelAbs(interp["xold"][kR][idx_basis][jF][n][m], + vmec.old_xc_scaled_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(interp["xold"][kZ][idx_basis][jF][n][m], + vmec.old_xc_scaled_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(interp["xold"][kL][idx_basis][jF][n][m], + vmec.old_xc_scaled_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + } // thread_id + + // perform testing outside of multi-threaded region to avoid overlapping error + // messages + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const RadialPartitioning& radial_partitioning = *vmec.r_[thread_id]; + + const int nsMinF1 = radial_partitioning.nsMinF1; + const int nsMaxF1 = radial_partitioning.nsMaxF1; + + for (int idx_basis = 0; idx_basis < s.num_basis; ++idx_basis) { + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int n = 0; n < s.ntor + 1; ++n) { + for (int m = 0; m < s.mpol; ++m) { + const int m_parity = m % 2; + const int scal_index = (jF - nsMinF1) * 2 + m_parity; + EXPECT_TRUE(IsCloseRelAbs(interp["scalxc"][kR][idx_basis][jF][n][m], + vmec.p_[thread_id]->scalxc[scal_index], + tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(interp["xnew"][kR][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kR, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(interp["xnew"][kZ][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kZ, idx_basis, jF, n, m), + tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(interp["xnew"][kL][idx_basis][jF][n][m], + vmec.decomposed_x_[thread_id]->GetXcElement( + kL, idx_basis, jF, n, m), + tolerance)); + } // m + } // n + } // jF + } // idx_basis + } // thread_id +} // CheckInterp + +INSTANTIATE_TEST_SUITE_P( + TestVmec, InterpTest, + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-14}, + DataSource{.identifier = "solovev_no_axis", .tolerance = 1.0e-14}, + DataSource{.identifier = "cma", .tolerance = 5.0e-11})); diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec_hot_restart_test/BUILD.bazel b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec_hot_restart_test/BUILD.bazel new file mode 100644 index 000000000..b3bd0a807 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec_hot_restart_test/BUILD.bazel @@ -0,0 +1,25 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +cc_test( + name = "vmec_hot_restart_test", + srcs = ["vmec_hot_restart_test.cc"], + data = [ + "//vmecpp/test_data:solovev", + "//vmecpp/test_data:cma", + "//vmecpp/test_data:cth_like_fixed_bdy", + "//vmecpp/test_data:cth_like_free_bdy", + "//vmecpp_large_cpp_tests/test_data:solovev", + "//vmecpp_large_cpp_tests/test_data:cma", + "//vmecpp_large_cpp_tests/test_data:cth_like_fixed_bdy", + "//vmecpp_large_cpp_tests/test_data:cth_like_free_bdy", + ], + deps = [ + "@abseil-cpp//absl/log:check", + "@googletest//:gtest_main", + "//util/file_io:file_io", + "//vmecpp/vmec/vmec", + "//vmecpp/vmec/output_quantities:output_quantities", + "//vmecpp/common/makegrid_lib", + ], +) diff --git a/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec_hot_restart_test/vmec_hot_restart_test.cc b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec_hot_restart_test/vmec_hot_restart_test.cc new file mode 100644 index 000000000..093fa3305 --- /dev/null +++ b/src/vmecpp/cpp/vmecpp_large_cpp_tests/vmec_hot_restart_test/vmec_hot_restart_test.cc @@ -0,0 +1,742 @@ +// SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +// +// +// SPDX-License-Identifier: MIT +#include +#include +#include + +#include "absl/log/check.h" +#include "absl/strings/str_cat.h" +#include "gmock/gmock.h" // ElementsAreArray +#include "gtest/gtest.h" +#include "util/file_io/file_io.h" +#include "util/testing/numerical_comparison_lib.h" +#include "vmecpp/common/magnetic_configuration_lib/magnetic_configuration_lib.h" +#include "vmecpp/common/makegrid_lib/makegrid_lib.h" +#include "vmecpp/common/vmec_indata/vmec_indata.h" +#include "vmecpp/vmec/output_quantities/output_quantities.h" +#include "vmecpp/vmec/vmec/vmec.h" + +using ::testing::ElementsAreArray; +using ::testing::TestWithParam; +using ::testing::Values; + +using file_io::ReadFile; +using magnetics::ImportMagneticConfigurationFromCoilsFile; +using makegrid::ImportMakegridParametersFromFile; +using testing::IsCloseRelAbs; +using vmecpp::RadialPartitioning; +using vmecpp::Sizes; +using vmecpp::Vmec; +using vmecpp::VmecCheckpoint; +using vmecpp::VmecINDATA; +namespace fs = std::filesystem; + +// used to specify case-specific tolerances +// and which iterations to test +struct DataSource { + std::string identifier; + double tolerance = 0.0; + std::vector iter2_to_test = {1, 2}; +}; + +class GeometryInitializationTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(GeometryInitializationTest, CheckGeometryInitialization) { + const double tolerance = data_source_.tolerance; + + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::SETUP_INITIAL_STATE; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*maximum_iterations=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/vmecpp::HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + + // COMPARISON WITH REFERENCES + // test fourier geometry matches what was in the wout file + const int ns = vmec.fc_.ns; + const Sizes& s = vmec.s_; + + for (int thread_id = 0; thread_id < vmec.num_threads_; ++thread_id) { + const vmecpp::FourierGeometry& g = *vmec.decomposed_x_[thread_id]; + const RadialPartitioning& rp = *vmec.r_[thread_id]; + + const int nsMinF1 = rp.nsMinF1; + const int nsMaxF1 = rp.nsMaxF1; + + // use another FourierGeometry to represent the WOutFileContents + vmecpp::FourierGeometry ref_fg(&s, &rp, ns); + ref_fg.InitFromState(vmec.t_, output_quantities.wout.rmnc, + output_quantities.wout.zmns, + output_quantities.wout.lmns_full, *vmec.p_[thread_id], + vmec.constants_, &(vmec.b_)); + + for (int jF = nsMinF1; jF < nsMaxF1; ++jF) { + for (int m = 0; m < s.mpol; ++m) { + for (int n = 0; n < s.ntor + 1; ++n) { + const int jFForThisThread = jF - g.nsMin(); + const int idx_fc = (jFForThisThread * s.mpol + m) * (s.ntor + 1) + n; + + EXPECT_TRUE( + IsCloseRelAbs(ref_fg.rmncc[idx_fc], g.rmncc[idx_fc], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(ref_fg.zmnsc[idx_fc], g.zmnsc[idx_fc], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(ref_fg.lmnsc[idx_fc], g.lmnsc[idx_fc], tolerance)); + + if (s.lthreed) { + EXPECT_TRUE(IsCloseRelAbs(ref_fg.rmnss[idx_fc], g.rmnss[idx_fc], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(ref_fg.zmncs[idx_fc], g.zmncs[idx_fc], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(ref_fg.lmncs[idx_fc], g.lmncs[idx_fc], + tolerance)); + } + } + } + } + } +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, GeometryInitializationTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-15})); + +class JacobianTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(JacobianTest, CheckJacobian) { + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL Vmec::run CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::JACOBIAN; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*maximum_iterations=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/vmecpp::HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + // expect that initial restart geometry has no bad jacobian + EXPECT_EQ(vmec.fc_.restart_reason, vmecpp::RestartReason::NO_RESTART); +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, JacobianTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-15})); + +class EnergiesTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(EnergiesTest, CheckEnergies) { + const double tolerance = data_source_.tolerance; + + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL Vmec::run CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::ENERGY; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*maximum_iterations=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/vmecpp::HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + + // expect that magnetic and thermal energies are the same as in the initial + // state + EXPECT_TRUE(IsCloseRelAbs(output_quantities.wout.wp, vmec.h_.thermalEnergy, + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(output_quantities.wout.wb, vmec.h_.magneticEnergy, + tolerance)); +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, EnergiesTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-15})); + +class InvariantForceResidualsTest : public TestWithParam { + protected: + void SetUp() override { data_source_ = GetParam(); } + DataSource data_source_; +}; + +TEST_P(InvariantForceResidualsTest, CheckInvariantForceResiduals) { + // SETUP + const std::string filename = + absl::StrCat("vmecpp/test_data/", data_source_.identifier, ".json"); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(indata.ok()); + + const std::string out_filename = absl::StrCat( + "vmecpp_large_cpp_tests/test_data/", data_source_.identifier, ".out.h5"); + const auto maybe_out = vmecpp::OutputQuantities::Load(out_filename); + ASSERT_TRUE(maybe_out.ok()); + const auto& output_quantities = *maybe_out; + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = static_cast(indata->ns_array.size()) - 1; + int last_ns = indata->ns_array[last_multigrid_step]; + double last_ftol = indata->ftol_array[last_multigrid_step]; + int last_niter = indata->niter_array[last_multigrid_step]; + indata->ns_array.resize(1); + indata->ns_array[0] = last_ns; + indata->ftol_array.resize(1); + indata->ftol_array[0] = last_ftol; + indata->niter_array.resize(1); + indata->niter_array[0] = last_niter; + + // ACTUAL Vmec::run CALL + Vmec vmec(*indata); + const auto checkpoint = VmecCheckpoint::INVARIANT_RESIDUALS; + const absl::StatusOr checkpoint_reached = + vmec.run(checkpoint, /*maximum_iterations=*/0, + /*maximum_multi_grid_step=*/500, + /*initial_state=*/vmecpp::HotRestartState(output_quantities)); + ASSERT_TRUE(checkpoint_reached.ok()); + ASSERT_TRUE(*checkpoint_reached); + + // expect that force residuals are less than tolerance + EXPECT_LE(vmec.fc_.fsqr, vmec.fc_.ftolv); + EXPECT_LE(vmec.fc_.fsqz, vmec.fc_.ftolv); + EXPECT_LE(vmec.fc_.fsql, vmec.fc_.ftolv); +} + +INSTANTIATE_TEST_SUITE_P(HotRestart, InvariantForceResidualsTest, + Values(DataSource{.identifier = "solovev", + .tolerance = 1.0e-15}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-15})); + +class HotRestartIntegration : public TestWithParam {}; + +TEST_P(HotRestartIntegration, CheckVaryingBoundary) { + // test that vmec run results are in agreement between a run from scratch in + // which we slightly perturb the fixed boundary, and a hot-restarted run with + // a corresponding boundary. + // The checks mirror those of CheckWOutFileContents in + // output_quantities_test.cc. + + // SETUP + const auto& ds = GetParam(); + + const std::string filename = + absl::StrFormat("vmecpp/test_data/%s.json", ds.identifier); + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr maybe_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(maybe_indata.ok()); + VmecINDATA& indata = maybe_indata.value(); + + // the one with the slightly perturbed boundary + VmecINDATA perturbed_indata = indata; + // perturbed_indata.rbc(0, perturbed_indata.ntor) *= 1.0 + 1.0e-8; + // perturb the (m=0, n=-ntor) coefficient + perturbed_indata.rbc(0, 0) *= 1.0 + 1.0e-8; + + // RUNS + const auto perturbed_output = vmecpp::run(perturbed_indata); + ASSERT_TRUE(perturbed_output.ok()); + + const auto original_output = vmecpp::run(indata); + ASSERT_TRUE(original_output.ok()); + + // remove intermediate multi-grid steps for input of restarted run + int last_multigrid_step = + static_cast(perturbed_indata.ns_array.size()) - 1; + int last_ns = perturbed_indata.ns_array[last_multigrid_step]; + double last_ftol = perturbed_indata.ftol_array[last_multigrid_step]; + int last_niter = perturbed_indata.niter_array[last_multigrid_step]; + perturbed_indata.ns_array.resize(1); + perturbed_indata.ns_array[0] = last_ns; + perturbed_indata.ftol_array.resize(1); + perturbed_indata.ftol_array[0] = last_ftol; + perturbed_indata.niter_array.resize(1); + perturbed_indata.niter_array[0] = last_niter; + + const auto perturbed_restarted_output = + vmecpp::run(perturbed_indata, vmecpp::HotRestartState(*original_output)); + ASSERT_TRUE(perturbed_restarted_output.ok()); + + // Check that contents of wout match + // Logic copied fromWOutFileContentsTest in output_quantities_test.cc + // (with free-boundary checks removed as well as several TODOs). + const auto& expected_wout = perturbed_output->wout; + const auto& test_wout = perturbed_restarted_output->wout; + const auto tolerance = ds.tolerance; + + EXPECT_EQ(test_wout.signgs, expected_wout.signgs); + EXPECT_EQ(test_wout.gamma, expected_wout.gamma); + EXPECT_EQ(test_wout.pcurr_type, expected_wout.pcurr_type); + EXPECT_EQ(test_wout.pmass_type, expected_wout.pmass_type); + EXPECT_EQ(test_wout.piota_type, expected_wout.piota_type); + + EXPECT_THAT(test_wout.am, ElementsAreArray(expected_wout.am)); + + if (indata.ncurr == 0) { + // constrained-iota; ignore current profile coefficients + EXPECT_THAT(test_wout.ai, ElementsAreArray(expected_wout.ai)); + } else { + // constrained-current + EXPECT_THAT(test_wout.ac, ElementsAreArray(expected_wout.ac)); + + if (test_wout.ai.size() > 0) { + // iota profile (if present) taken as initial guess for first iteration + EXPECT_THAT(test_wout.ai, ElementsAreArray(expected_wout.ai)); + } + } + + EXPECT_EQ(test_wout.nfp, expected_wout.nfp); + EXPECT_EQ(test_wout.mpol, expected_wout.mpol); + EXPECT_EQ(test_wout.ntor, expected_wout.ntor); + EXPECT_EQ(test_wout.lasym, expected_wout.lasym); + + EXPECT_EQ(test_wout.ns, expected_wout.ns); + EXPECT_EQ(test_wout.ftolv, expected_wout.ftolv); + EXPECT_LT(test_wout.niter, expected_wout.niter); + + EXPECT_EQ(test_wout.lfreeb, expected_wout.lfreeb); + EXPECT_EQ(test_wout.mgrid_mode, expected_wout.mgrid_mode); + + // ------------------- + // scalar quantities + + EXPECT_TRUE(IsCloseRelAbs(expected_wout.wb, test_wout.wb, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.wp, test_wout.wp, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.rmax_surf, test_wout.rmax_surf, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.rmin_surf, test_wout.rmin_surf, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.zmax_surf, test_wout.zmax_surf, tolerance)); + + EXPECT_EQ(test_wout.mnmax, expected_wout.mnmax); + EXPECT_EQ(test_wout.mnmax_nyq, expected_wout.mnmax_nyq); + + EXPECT_EQ(test_wout.ier_flag, expected_wout.ier_flag); + + EXPECT_TRUE(IsCloseRelAbs(expected_wout.aspect, test_wout.aspect, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.betatotal, test_wout.betatotal, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.betapol, test_wout.betapol, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.betator, test_wout.betator, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.betaxis, test_wout.betaxis, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(expected_wout.b0, test_wout.b0, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(expected_wout.rbtor0, test_wout.rbtor0, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.rbtor, test_wout.rbtor, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.IonLarmor, test_wout.IonLarmor, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.volavgB, test_wout.volavgB, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(expected_wout.ctor, test_wout.ctor, tolerance)); + + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.Aminor_p, test_wout.Aminor_p, tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.Rmajor_p, test_wout.Rmajor_p, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.volume, test_wout.volume, tolerance)); + + EXPECT_TRUE(IsCloseRelAbs(expected_wout.fsqr, test_wout.fsqr, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.fsqz, test_wout.fsqz, tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.fsql, test_wout.fsql, tolerance)); + + // ------------------- + // one-dimensional array quantities + + const int ns = static_cast(expected_wout.iotaf.size()); + for (int jF = 0; jF < ns; ++jF) { + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.iotaf[jF], test_wout.iotaf[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.q_factor[jF], + test_wout.q_factor[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.presf[jF], test_wout.presf[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.phi[jF], test_wout.phi[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.chi[jF], test_wout.chi[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.phipf[jF], test_wout.phipf[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.chipf[jF], test_wout.chipf[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.jcuru[jF], test_wout.jcuru[jF], tolerance)) + << "jF = " << jF; + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.jcurv[jF], test_wout.jcurv[jF], tolerance)) + << "jF = " << jF; + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.specw[jF], test_wout.specw[jF], tolerance)); + } // jF + + for (int jF = 0; jF < ns; ++jF) { + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.iotas[jF], test_wout.iotas[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.mass[jF], test_wout.mass[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.pres[jF], test_wout.pres[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.beta_vol[jF], + test_wout.beta_vol[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.buco[jF], test_wout.buco[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.bvco[jF], test_wout.bvco[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.vp[jF], test_wout.vp[jF], tolerance)); + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.phips[jF], test_wout.phips[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.over_r[jF], test_wout.over_r[jF], + tolerance)); + } // jF + + for (int jF = 0; jF < ns; ++jF) { + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.jdotb[jF], test_wout.jdotb[jF], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bdotgradv[jF], + test_wout.bdotgradv[jF], tolerance)); + } // jF + + for (int jF = 0; jF < ns; ++jF) { + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.DMerc[jF], test_wout.DMerc[jF], tolerance)) + << "jF = " << jF; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.DShear[jF], test_wout.DShear[jF], + tolerance)) + << "jF = " << jF; + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.DWell[jF], test_wout.DWell[jF], tolerance)) + << "jF = " << jF; + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.DCurr[jF], test_wout.DCurr[jF], tolerance)) + << "jF = " << jF; + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.DGeod[jF], test_wout.DGeod[jF], tolerance)) + << "jF = " << jF; + } // jF + + for (int jF = 0; jF < ns; ++jF) { + EXPECT_TRUE( + IsCloseRelAbs(expected_wout.equif[jF], test_wout.equif[jF], tolerance)) + << "jF = " << jF; + } + + // // ------------------- + // // mode numbers for Fourier coefficient arrays below + + for (int mn = 0; mn < test_wout.mnmax; ++mn) { + EXPECT_EQ(test_wout.xm[mn], expected_wout.xm[mn]); + EXPECT_EQ(test_wout.xn[mn], expected_wout.xn[mn]); + } // mn + + for (int mn_nyq = 0; mn_nyq < test_wout.mnmax_nyq; ++mn_nyq) { + EXPECT_EQ(test_wout.xm_nyq[mn_nyq], expected_wout.xm_nyq[mn_nyq]); + EXPECT_EQ(test_wout.xn_nyq[mn_nyq], expected_wout.xn_nyq[mn_nyq]); + } // mn_nyq + + // // ------------------- + // // stellarator-symmetric Fourier coefficients + + for (int n = 0; n <= test_wout.ntor; ++n) { + EXPECT_TRUE(IsCloseRelAbs(expected_wout.raxis_cc[n], test_wout.raxis_cc[n], + tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.zaxis_cs[n], test_wout.zaxis_cs[n], + tolerance)); + } // n + + for (int jF = 0; jF < ns; ++jF) { + for (int mn = 0; mn < test_wout.mnmax; ++mn) { + EXPECT_TRUE(IsCloseRelAbs(expected_wout.rmnc(mn, jF), + test_wout.rmnc(mn, jF), tolerance)) + << "jF = " << jF << " mn = " << mn; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.zmns(mn, jF), + test_wout.zmns(mn, jF), tolerance)) + << "jF = " << jF << " mn = " << mn; + } // mn + } // jF + + for (int jF = 0; jF < ns; ++jF) { + for (int mn = 0; mn < test_wout.mnmax; ++mn) { + EXPECT_TRUE(IsCloseRelAbs(expected_wout.lmns(mn, jF), + test_wout.lmns(mn, jF), tolerance)) + << "jF = " << jF << " mn = " << mn; + } // mn + } // jF + + for (int jF = 0; jF < ns; ++jF) { + for (int mn_nyq = 0; mn_nyq < test_wout.mnmax_nyq; ++mn_nyq) { + EXPECT_TRUE(IsCloseRelAbs(expected_wout.gmnc(mn_nyq, jF), + test_wout.gmnc(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bmnc(mn_nyq, jF), + test_wout.bmnc(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bsubumnc(mn_nyq, jF), + test_wout.bsubumnc(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bsubvmnc(mn_nyq, jF), + test_wout.bsubvmnc(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bsubsmns(mn_nyq, jF), + test_wout.bsubsmns(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bsupumnc(mn_nyq, jF), + test_wout.bsupumnc(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + EXPECT_TRUE(IsCloseRelAbs(expected_wout.bsupvmnc(mn_nyq, jF), + test_wout.bsupvmnc(mn_nyq, jF), tolerance)) + << "jF = " << jF << " mn_nyq = " << mn_nyq; + } // mn_nyq + } // jF + + // ------------------- + // non-stellarator-symmetric Fourier coefficients + + if (test_wout.lasym) { + for (int n = 0; n <= test_wout.ntor; ++n) { + EXPECT_TRUE(IsCloseRelAbs(expected_wout.raxis_cs[n], + test_wout.raxis_cs[n], tolerance)); + EXPECT_TRUE(IsCloseRelAbs(expected_wout.zaxis_cc[n], + test_wout.zaxis_cc[n], tolerance)); + } // n + } +} + +INSTANTIATE_TEST_SUITE_P( + TestHotRestart, HotRestartIntegration, + // using the same levels of tolerance as CheckWOutFileContents in + // output_quantities_test.cc + Values(DataSource{.identifier = "solovev", .tolerance = 1.0e-4}, + DataSource{.identifier = "cma", .tolerance = 1.0e-4}, + DataSource{.identifier = "cth_like_fixed_bdy", + .tolerance = 1.0e-4})); + +TEST(HotRestartIntegration, MultigridContinuation) { + // Test that a hot restart seeded at the first (coarse) grid and then + // continued through all remaining multigrid steps produces the same + // converged result as a cold full-grid run. + // + // We use cma (ns=[25, 51]) because its first grid at ns=25 is coarse enough + // to be a useful seed but large enough to converge when run standalone. + // solovev's first grid at ns=5 requires the internal 3-point bootstrap to + // obtain a valid initial Jacobian and cannot converge standalone. + const std::string filename = "vmecpp/test_data/cma.json"; + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr maybe_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(maybe_indata.ok()); + const VmecINDATA& indata = maybe_indata.value(); + + // Run only the first (coarsest) grid to produce the restart seed. + // Use conservativeResize to keep the first element when shrinking. + VmecINDATA coarse_indata = indata; + coarse_indata.ns_array.conservativeResize(1); + coarse_indata.ftol_array.conservativeResize(1); + coarse_indata.niter_array.conservativeResize(1); + const auto coarse_output = vmecpp::run(coarse_indata); + ASSERT_TRUE(coarse_output.ok()); + + // Hot-restart at the coarse grid and continue through all multigrid steps. + const auto multigrid_output = + vmecpp::run(indata, vmecpp::HotRestartState(*coarse_output)); + ASSERT_TRUE(multigrid_output.ok()); + + // Cold full-grid run for reference. + const auto cold_output = vmecpp::run(indata); + ASSERT_TRUE(cold_output.ok()); + + // Results at the finest grid should agree to high tolerance. + const double tolerance = 1.0e-4; + const bool check_equal_maximum_iterations = false; + vmecpp::CompareWOut(multigrid_output->wout, cold_output->wout, tolerance, + check_equal_maximum_iterations); +} + +TEST(HotRestartIntegration, FreeBoundary) { + // LOAD INDATA FILE + const std::string filename = "vmecpp/test_data/cth_like_free_bdy.json"; + absl::StatusOr indata_json = ReadFile(filename); + ASSERT_TRUE(indata_json.ok()); + + absl::StatusOr maybe_indata = VmecINDATA::FromJson(*indata_json); + ASSERT_TRUE(maybe_indata.ok()); + VmecINDATA& indata = maybe_indata.value(); + + // LOAD COILS FILE + const std::string coils_filename = "vmecpp/test_data/coils.cth_like"; + const auto maybe_magnetic_configuration = + ImportMagneticConfigurationFromCoilsFile(coils_filename); + ASSERT_TRUE(maybe_magnetic_configuration.ok()); + const auto& magnetic_configuration = *maybe_magnetic_configuration; + + // load makegrid params + const auto maybe_makegrid_params = ImportMakegridParametersFromFile( + "vmecpp/test_data/makegrid_parameters_cth_like.json"); + ASSERT_TRUE(maybe_makegrid_params.ok()); + const auto& makegrid_params = *maybe_makegrid_params; + + // compute magnetic field response tables + const auto maybe_magnetic_response_table = + makegrid::ComputeMagneticFieldResponseTable(makegrid_params, + magnetic_configuration); + ASSERT_TRUE(maybe_magnetic_response_table.ok()); + const auto& magnetic_response_table = *maybe_magnetic_response_table; + + // RUNS + const auto original_output = vmecpp::run(indata, magnetic_response_table); + ASSERT_TRUE(original_output.ok()); + + // MODIFY COILS + const double radial_coil_displacement = 1e-3; + makegrid::MagneticConfiguration displaced_magnetic_configuration = + magnetic_configuration; + const auto s = magnetics::MoveRadially(radial_coil_displacement, + displaced_magnetic_configuration); + CHECK_OK(s); + + // RECOMPUTE MGRID FILE + const auto maybe_displaced_magnetic_response_table = + makegrid::ComputeMagneticFieldResponseTable( + makegrid_params, displaced_magnetic_configuration); + ASSERT_TRUE(maybe_displaced_magnetic_response_table.ok()); + const auto& displaced_magnetic_response_table = + *maybe_displaced_magnetic_response_table; + + // FREE-BOUNDARY HOT RESTART RUN (SAME INDATA, RECOMPUTED MGRID FILE) + const auto displaced_hotrestarted_output = + vmecpp::run(indata, displaced_magnetic_response_table, + vmecpp::HotRestartState(*original_output)); + ASSERT_TRUE(displaced_hotrestarted_output.ok()); + + // FROM SCRATCH RUN (SAME INDATA, RECOMPUTED MGRID FILE) + const auto displaced_fromscratch_output = + vmecpp::run(indata, displaced_magnetic_response_table); + ASSERT_TRUE(displaced_fromscratch_output.ok()); + + // COMPARE RUN FROM SCRATCH AND HOT-RESTARTED RUN + // FIXME(jons): How realistic are these tolerances? + const double tolerance = 0.1; + const bool check_equal_maximum_iterations = false; + vmecpp::CompareWOut(displaced_hotrestarted_output->wout, + displaced_fromscratch_output->wout, tolerance, + check_equal_maximum_iterations); + + // TODO(eguiraud): we'd like to use these to test that the displaced output + // _is_ different, but the current CompareWOut implementation simply aborts in + // that case. vmecpp::CompareWOut(displaced_fromscratch_output->wout, + // original_output->wout, tolerance); + + // vmecpp::CompareWOut(displaced_hotrestarted_output->wout, + // original_output->wout, tolerance); +} diff --git a/src/vmecpp/simsopt_compat.py b/src/vmecpp/simsopt_compat.py index cddc26ab4..9778c8313 100644 --- a/src/vmecpp/simsopt_compat.py +++ b/src/vmecpp/simsopt_compat.py @@ -146,8 +146,9 @@ def __init__( # object, but the mpol/ntor values of either the vmec object # or the boundary surface object can be changed independently # by the user. + mpol, ntor = self._last_mpol_ntor(self.indata) mpol_for_surfacerzfourier, ntor_for_surfacerzfourier = ( - self._surface_rzfourier_resolution(self.indata.mpol, self.indata.ntor) + self._surface_rzfourier_resolution(mpol, ntor) ) self._boundary = SurfaceRZFourier.from_nphi_ntheta( nfp=self.indata.nfp, @@ -162,8 +163,8 @@ def __init__( # Transfer boundary shape data from indata to _boundary: vi = self.indata - for m in range(vi.mpol): - for n in range(2 * vi.ntor + 1): + for m in range(mpol): + for n in range(2 * ntor + 1): self._boundary.rc[m, n] = vi.rbc[m, n] self._boundary.zs[m, n] = vi.zbs[m, n] if vi.lasym: @@ -435,6 +436,18 @@ def boundary(self, boundary: SurfaceRZFourier) -> None: self.append_parent(boundary) self.need_to_run_code = True + @staticmethod + def _last_mpol_ntor(indata: vmecpp.VmecInput) -> tuple[int, int]: + """(indata.mpol, indata.ntor) as plain ints. + + VmecInput.mpol/.ntor may also be a Fourier-resolution continuation schedule (a + sequence); SIMSOPT's SurfaceRZFourier only has a single resolution, so the last + (finest, target) entry of the schedule is used. + """ + mpol = indata.mpol if isinstance(indata.mpol, int) else int(indata.mpol[-1]) + ntor = indata.ntor if isinstance(indata.ntor, int) else int(indata.ntor[-1]) + return mpol, ntor + @staticmethod def _surface_rzfourier_resolution(mpol: int, ntor: int) -> tuple[int, int]: # SurfaceRZFourier uses m up to mpol inclusive, unlike VMEC++. @@ -462,9 +475,8 @@ def set_indata(self) -> None: raise RuntimeError(msg) assert self.indata is not None vi = self.indata # Shorthand - target_mpol, target_ntor = self._surface_rzfourier_resolution( - self.indata.mpol, self.indata.ntor - ) + mpol, ntor = self._last_mpol_ntor(self.indata) + target_mpol, target_ntor = self._surface_rzfourier_resolution(mpol, ntor) boundary_RZFourier = self._resize_surface_rzfourier( self.boundary.to_RZFourier().copy(), target_mpol, @@ -483,8 +495,7 @@ def set_indata(self) -> None: zbc.fill(0.0) # Transfer boundary shape data from the surface object to VMEC: - ntor = self.indata.ntor - for m in range(self.indata.mpol): + for m in range(mpol): for n in range(2 * ntor + 1): vi.rbc[m, n] = boundary_RZFourier.get_rc(m, n - ntor) vi.zbs[m, n] = boundary_RZFourier.get_zs(m, n - ntor) diff --git a/tests/test_continuation.py b/tests/test_continuation.py new file mode 100644 index 000000000..2dbc4a3c3 --- /dev/null +++ b/tests/test_continuation.py @@ -0,0 +1,295 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +"""Tests for the Python-side resolution interpolation and continuation driver.""" + +from pathlib import Path + +import numpy as np +import pytest + +import vmecpp +from vmecpp._continuation import _state_mode_table, _step_input + +REPO_ROOT = Path(__file__).parent.parent +TEST_DATA_DIR = REPO_ROOT / "src" / "vmecpp" / "cpp" / "vmecpp" / "test_data" + + +@pytest.fixture(scope="module") +def solovev_output() -> vmecpp.VmecOutput: + vmec_input = vmecpp.VmecInput.from_file(TEST_DATA_DIR / "solovev.json") + return vmecpp.run(vmec_input, verbose=False, max_threads=1) + + +@pytest.fixture(scope="module") +def cma_input() -> vmecpp.VmecInput: + return vmecpp.VmecInput.from_file(TEST_DATA_DIR / "cma.json") + + +@pytest.fixture(scope="module") +def cma_direct(cma_input: vmecpp.VmecInput) -> vmecpp.VmecOutput: + """The reference equilibrium, solved with the built-in (C++) multi-grid.""" + return vmecpp.run(cma_input, verbose=False, max_threads=1) + + +def _final_force_residual(output: vmecpp.VmecOutput) -> float: + return float(np.asarray(output.wout.fsqt)[-1]) + + +# --- interpolation ----------------------------------------------------------- + + +def test_state_mode_table_matches_wout(solovev_output: vmecpp.VmecOutput): + """The generated state mode table must match the ordering VMEC++ writes out.""" + wout = solovev_output.wout + xm, xn = _state_mode_table(wout.mpol, wout.ntor, wout.nfp) + np.testing.assert_array_equal(xm, np.asarray(wout.xm)) + np.testing.assert_array_equal(xn, np.asarray(wout.xn)) + + +def test_interpolate_identity_is_a_noop(solovev_output: vmecpp.VmecOutput): + """Interpolating to the same resolution reproduces the source geometry.""" + same = vmecpp.interpolate_solution(solovev_output, solovev_output.input) + for field in ("rmnc", "zmns", "lmns_full"): + np.testing.assert_allclose( + np.asarray(getattr(same.wout, field)), + np.asarray(getattr(solovev_output.wout, field)), + atol=1e-10, + ) + np.testing.assert_array_equal( + np.asarray(same.wout.xm), np.asarray(solovev_output.wout.xm) + ) + + +def test_interpolate_radial_upsample(solovev_output: vmecpp.VmecOutput): + """Radial up-sampling keeps the endpoints and produces the requested shape.""" + wout = solovev_output.wout + ns_new = int(wout.ns) * 2 - 1 + target = _step_input( + solovev_output.input, ns_new, int(wout.mpol), int(wout.ntor), 1e-12, 1 + ) + guess = vmecpp.interpolate_solution(solovev_output, target) + + assert int(guess.wout.ns) == ns_new + assert np.asarray(guess.wout.rmnc).shape == (int(guess.wout.mnmax), ns_new) + # The boundary surface (s=1) is a grid point in both grids and is preserved + # exactly for every mode. + np.testing.assert_allclose( + np.asarray(guess.wout.rmnc)[:, -1], np.asarray(wout.rmnc)[:, -1], atol=1e-10 + ) + # The axis (s=0) is preserved for even-m modes; odd-m modes vanish at the axis. + even_m = np.asarray(guess.wout.xm) % 2 == 0 + np.testing.assert_allclose( + np.asarray(guess.wout.rmnc)[even_m, 0], + np.asarray(wout.rmnc)[even_m, 0], + atol=1e-10, + ) + + +def test_interpolate_fourier_pad_and_truncate(solovev_output: vmecpp.VmecOutput): + """Padding adds zero modes; truncating drops modes; shared modes are carried.""" + wout = solovev_output.wout + mpol0, ntor0, ns0 = int(wout.mpol), int(wout.ntor), int(wout.ns) + + # Pad to a higher poloidal resolution. + padded_input = _step_input(solovev_output.input, ns0, mpol0 + 2, ntor0, 1e-12, 1) + padded = vmecpp.interpolate_solution(solovev_output, padded_input) + assert int(padded.wout.mpol) == mpol0 + 2 + + src_index = { + (int(m), int(n)): i + for i, (m, n) in enumerate( + zip(np.asarray(wout.xm), np.asarray(wout.xn), strict=False) + ) + } + pad_xm, pad_xn = np.asarray(padded.wout.xm), np.asarray(padded.wout.xn) + pad_rmnc = np.asarray(padded.wout.rmnc) + src_rmnc = np.asarray(wout.rmnc) + saw_new_zero_mode = False + for i, (m, n) in enumerate(zip(pad_xm, pad_xn, strict=False)): + j = src_index.get((int(m), int(n))) + if j is not None: + np.testing.assert_allclose(pad_rmnc[i], src_rmnc[j], atol=1e-10) + else: + np.testing.assert_allclose(pad_rmnc[i], 0.0, atol=1e-12) + saw_new_zero_mode = True + assert saw_new_zero_mode + + # Truncating to a lower poloidal resolution keeps only the surviving modes. + if mpol0 > 1: + trunc_input = _step_input(solovev_output.input, ns0, mpol0 - 1, ntor0, 1e-12, 1) + trunc = vmecpp.interpolate_solution(solovev_output, trunc_input) + assert np.asarray(trunc.wout.xm).max() <= mpol0 - 2 + + +# --- continuation driver ----------------------------------------------------- + + +def test_mpol_ntor_length_one_sequence_collapses_to_scalar( + cma_input: vmecpp.VmecInput, +): + """A length-1 mpol/ntor sequence is equivalent to a scalar and is stored as a plain + int, so it takes the direct (non-continuation) code path. + + This coercion runs during validation (construction / model_validate), like all of + VmecInput's other validators; it goes through vmecpp.VmecInput.model_validate here + rather than a bare attribute assignment for that reason. + """ + data = cma_input.model_dump(mode="json") + data["mpol"] = [int(cma_input.mpol)] + data["ntor"] = [int(cma_input.ntor)] + single_step = vmecpp.VmecInput.model_validate(data) + assert isinstance(single_step.mpol, int) + assert isinstance(single_step.ntor, int) + assert single_step.mpol == cma_input.mpol + assert single_step.ntor == cma_input.ntor + + +def test_mpol_length_mismatch_raises(cma_input: vmecpp.VmecInput): + """A mpol/ntor schedule that doesn't match ns_array's length is rejected with a + clear error, rather than silently misaligning steps.""" + mismatched = cma_input.model_copy(deep=True) + mismatched.ns_array = np.asarray([15, 31], dtype=np.int64) + mismatched.ftol_array = np.asarray([1e-8, 1e-10], dtype=float) + mismatched.niter_array = np.asarray([100, 100], dtype=np.int64) + mismatched.mpol = np.asarray([3, 4, 5], dtype=np.int64) # 3 entries, ns_array has 2 + + with pytest.raises(ValueError, match="mpol"): + vmecpp.run(mismatched, verbose=False, max_threads=1) + + +def test_ns_only_continuation_reproduces_direct_multigrid( + cma_input: vmecpp.VmecInput, cma_direct: vmecpp.VmecOutput +): + """A continuation schedule with a constant (array-valued) mpol/ntor reaches the same + equilibrium as the C++ multi-grid: identical resolution, a converged force balance, + a bit-identical plasma volume, and geometry agreeing at the convergence level.""" + n_steps = len(np.asarray(cma_input.ns_array)) + continuation_input = cma_input.model_copy(deep=True) + continuation_input.mpol = np.asarray( + [int(cma_input.mpol)] * n_steps, dtype=np.int64 + ) + continuation_input.ntor = np.asarray( + [int(cma_input.ntor)] * n_steps, dtype=np.int64 + ) + + continued = vmecpp.run(continuation_input, verbose=False, max_threads=1) + + assert int(continued.wout.ns) == int(cma_direct.wout.ns) + # Converged to a force residual comparable to the direct solve. + assert _final_force_residual(continued) < 10 * _final_force_residual(cma_direct) + # The plasma volume is a robust invariant and matches to full precision. + assert continued.wout.volume == pytest.approx(cma_direct.wout.volume, rel=1e-9) + # The Fourier geometry agrees at the level the force balance is converged to. + # The residual reflects the difference between the Python continuation (sqrt(s) + # radial interpolation plus hot-restart) and the C++ multi-grid; both are valid + # force-balanced states and the agreement tightens with ftol (see + # test_continuation_agreement_tightens_with_ftol). + np.testing.assert_allclose( + np.asarray(continued.wout.rmnc), + np.asarray(cma_direct.wout.rmnc), + atol=4e-3, + rtol=1e-2, + ) + + +def test_continuation_agreement_tightens_with_ftol(cma_input: vmecpp.VmecInput): + """As the force-balance tolerance tightens, the continuation and the direct multi- + grid converge toward the same geometry -- the signature of a shared equilibrium + rather than a defect in the continuation.""" + n_steps = len(np.asarray(cma_input.ns_array)) + + def max_geometry_diff(ftol_array: list[float]) -> float: + reference = cma_input.model_copy(deep=True) + reference.ftol_array = np.asarray(ftol_array, dtype=float) + direct = vmecpp.run(reference, verbose=False, max_threads=1) + + continuation_input = cma_input.model_copy(deep=True) + continuation_input.mpol = np.asarray( + [int(cma_input.mpol)] * n_steps, dtype=np.int64 + ) + continuation_input.ntor = np.asarray( + [int(cma_input.ntor)] * n_steps, dtype=np.int64 + ) + continuation_input.ftol_array = np.asarray(ftol_array, dtype=float) + continued = vmecpp.run(continuation_input, verbose=False, max_threads=1) + + return float( + np.max( + np.abs(np.asarray(direct.wout.rmnc) - np.asarray(continued.wout.rmnc)) + ) + ) + + loose = max_geometry_diff([1e-6, 1e-6]) + tight = max_geometry_diff([1e-8, 1e-11]) + assert tight < loose + + +def test_fourier_continuation_converges( + cma_input: vmecpp.VmecInput, cma_direct: vmecpp.VmecOutput +): + """Increasing the poloidal resolution along the schedule reaches the same + equilibrium as a direct solve at full resolution.""" + ns_final = int(np.asarray(cma_input.ns_array)[-1]) + mpol_final = int(cma_input.mpol) + ntor = int(cma_input.ntor) + ftol_final = float(np.asarray(cma_input.ftol_array)[-1]) + niter_final = int(np.asarray(cma_input.niter_array)[-1]) + + continuation_input = cma_input.model_copy(deep=True) + continuation_input.ns_array = np.asarray([ns_final, ns_final], dtype=np.int64) + continuation_input.mpol = np.asarray( + [max(2, mpol_final - 2), mpol_final], dtype=np.int64 + ) + continuation_input.ntor = ntor # scalar broadcasts to every step + continuation_input.ftol_array = np.asarray([ftol_final, ftol_final], dtype=float) + continuation_input.niter_array = np.asarray( + [niter_final, niter_final], dtype=np.int64 + ) + + continued = vmecpp.run(continuation_input, verbose=False, max_threads=1) + + assert int(continued.wout.mpol) == mpol_final + assert _final_force_residual(continued) < 1e-5 + assert continued.wout.volume == pytest.approx(cma_direct.wout.volume, rel=1e-4) + # Geometry agrees at the convergence level (see + # test_continuation_agreement_tightens_with_ftol). + np.testing.assert_allclose( + np.asarray(continued.wout.rmnc), + np.asarray(cma_direct.wout.rmnc), + atol=4e-3, + rtol=1e-2, + ) + + +def test_fourier_continuation_hot_restarts_first_step_from_restart_from( + cma_input: vmecpp.VmecInput, +): + """restart_from seeds the first continuation step (interpolated to its resolution) + instead of a cold start, when input.mpol/.ntor is a sequence.""" + ns_final = int(np.asarray(cma_input.ns_array)[-1]) + mpol_final = int(cma_input.mpol) + ntor = int(cma_input.ntor) + + warm_start_input = cma_input.model_copy(deep=True) + warm_start_input.ns_array = np.asarray([ns_final], dtype=np.int64) + warm_start = vmecpp.run(warm_start_input, verbose=False, max_threads=1) + + continuation_input = cma_input.model_copy(deep=True) + continuation_input.ns_array = np.asarray([ns_final, ns_final], dtype=np.int64) + continuation_input.mpol = np.asarray( + [max(2, mpol_final - 2), mpol_final], dtype=np.int64 + ) + continuation_input.ntor = ntor + continuation_input.ftol_array = np.asarray([1e-8, 1e-10], dtype=float) + continuation_input.niter_array = np.asarray([2000, 2000], dtype=np.int64) + + continued = vmecpp.run( + continuation_input, + verbose=False, + max_threads=1, + restart_from=warm_start, + ) + + assert int(continued.wout.mpol) == mpol_final + assert _final_force_residual(continued) < 1e-5 diff --git a/tests/test_external_optimizers.py b/tests/test_external_optimizers.py new file mode 100644 index 000000000..5e20b7fa0 --- /dev/null +++ b/tests/test_external_optimizers.py @@ -0,0 +1,107 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# +# SPDX-License-Identifier: MIT +"""External optimizers reach force balance on axisymmetric and 3D cases. + +The Solov'ev equilibrium has a reproducible internal state, so the 2D test compares the +full state vector with the native solver. In 3D, the poloidal parameterization is not +unique and spectral condensation only regularizes that coordinate freedom. The 3D test +therefore compares the residual and energy instead of coordinate-dependent Fourier +coefficients. +""" + +import sys +from pathlib import Path + +import numpy as np +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "examples")) +from external_optimizers import ( # type: ignore + make_model, + reference_equilibrium, + residual, + solve_newton_hvp, + solve_newton_krylov, + solve_newton_krylov_preconditioned, + solve_preconditioned_descent, +) + +ROOT = Path(__file__).resolve().parents[1] +SOLOVEV = ROOT / "examples" / "data" / "solovev.json" +CTH_LIKE = ROOT / "examples" / "data" / "cth_like_fixed_bdy.json" +CMA = ROOT / "src" / "vmecpp" / "cpp" / "vmecpp" / "test_data" / "cma.json" + +SOLVERS = ( + solve_preconditioned_descent, + solve_newton_krylov, + solve_newton_krylov_preconditioned, + solve_newton_hvp, +) + + +def _solve_all(input_path): + return {solver.__name__: solver(input_path, ns=11) for solver in SOLVERS} + + +@pytest.fixture(scope="module") +def reference_2d(): + return reference_equilibrium(SOLOVEV, ns=11) + + +@pytest.fixture(scope="module") +def reference_3d(): + return reference_equilibrium(CTH_LIKE, ns=11) + + +@pytest.fixture(scope="module") +def solutions_2d(): + return _solve_all(SOLOVEV) + + +@pytest.fixture(scope="module") +def solutions_3d(): + return _solve_all(CTH_LIKE) + + +def test_optimizers_reach_2d_equilibrium(reference_2d, solutions_2d): + x_star, w_star = reference_2d + for name, (x, result) in solutions_2d.items(): + assert result.residual_norm < 1e-7, name + assert abs(result.energy - w_star) < 1e-8, name + assert np.linalg.norm(x - x_star) < 1e-5, name + + +def test_optimizers_reach_3d_force_balance(reference_3d, solutions_3d): + _, w_star = reference_3d + for name, (_, result) in solutions_3d.items(): + assert result.residual_norm < 1e-7, name + assert np.isclose(result.energy, w_star, rtol=1e-4, atol=0.0), name + + +def test_preconditioner_reduces_newton_krylov_force_evaluations(solutions_3d): + plain = solutions_3d[solve_newton_krylov.__name__][1] + preconditioned = solutions_3d[solve_newton_krylov_preconditioned.__name__][1] + assert preconditioned.force_evals < plain.force_evals + + +def test_hvp_newton_uses_fewer_outer_iterations_than_descent(solutions_3d): + newton = solutions_3d[solve_newton_hvp.__name__][1] + descent = solutions_3d[solve_preconditioned_descent.__name__][1] + assert newton.outer_iters < 20 + assert newton.outer_iters < descent.outer_iters + + +def test_cma_cold_start_exercises_non_axisymmetric_paths(): + model = make_model(CMA, ns=25) + x0 = np.asarray(model.get_state(), float) + f0 = residual(model)(x0) + assert np.all(np.isfinite(f0)) + assert np.linalg.norm(f0) > 0.0 + + rng = np.random.default_rng(0) + v = rng.standard_normal(x0.size) + hv = np.asarray(model.hessian_vector_product(np.ascontiguousarray(v)), float) + assert np.all(np.isfinite(hv)) + assert np.linalg.norm(hv) > 0.0 diff --git a/tests/test_hessian.py b/tests/test_hessian.py new file mode 100644 index 000000000..8034f5ace --- /dev/null +++ b/tests/test_hessian.py @@ -0,0 +1,64 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# +# SPDX-License-Identifier: MIT +"""VmecModel.hessian_vector_product gives the augmented functional's curvature. + +The Hessian-vector product is a central directional derivative of the analytic +force (the gradient of VMEC's augmented functional), computed inside VMEC++: +H v = (F(x + eps v) - F(x - eps v)) / (2 eps). It must be linear in v and agree +with an independent finite difference of the force, and it restores the state. +""" + +from pathlib import Path + +import numpy as np + +from vmecpp.cpp import _vmecpp # type: ignore + +SOLOVEV = Path(__file__).resolve().parents[1] / "examples" / "data" / "solovev.json" + + +def _model(ns: int = 11): + return _vmecpp.VmecModel.create(_vmecpp.VmecINDATA.from_file(str(SOLOVEV)), ns) + + +def _raw_force(model, x): + model.set_state(np.ascontiguousarray(x)) + model.evaluate(2, 2, False) + return np.asarray(model.get_forces(), float) + + +def test_hvp_matches_finite_difference(): + m = _model() + m.evaluate(2, 2, False) + x = np.asarray(m.get_state(), float) + rng = np.random.default_rng(0) + v = rng.standard_normal(x.size) + v /= np.linalg.norm(v) + + hv = np.asarray(m.hessian_vector_product(np.ascontiguousarray(v)), float) + + eps = 1e-6 + fd = (_raw_force(m, x + eps * v) - _raw_force(m, x - eps * v)) / (2 * eps) + assert np.linalg.norm(hv - fd) < 1e-5 * np.linalg.norm(fd) + + +def test_hvp_is_linear(): + m = _model() + m.evaluate(2, 2, False) + rng = np.random.default_rng(1) + v = rng.standard_normal(np.asarray(m.get_state()).size) + hv = np.asarray(m.hessian_vector_product(np.ascontiguousarray(v)), float) + hv2 = np.asarray(m.hessian_vector_product(np.ascontiguousarray(2.0 * v)), float) + assert np.linalg.norm(hv2 - 2.0 * hv) < 1e-9 * np.linalg.norm(hv) + + +def test_hvp_restores_state(): + m = _model() + m.evaluate(2, 2, False) + x0 = np.asarray(m.get_state(), float).copy() + rng = np.random.default_rng(2) + v = rng.standard_normal(x0.size) + m.hessian_vector_product(np.ascontiguousarray(v)) + assert np.allclose(np.asarray(m.get_state(), float), x0) diff --git a/tests/test_init.py b/tests/test_init.py index 6261207f3..10604d6a5 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -51,8 +51,7 @@ def test_run(max_threads, input_file, verbose): [ ("cma.json", RuntimeError), # Invalid netcdf ("does_not_exist", RuntimeError), - # TODO(jurasic) Enable test after switching netcdf_io to absl::Status - # ("wout_cma.nc", RuntimeError), # Valid netcdf, but invalid mgrid + ("wout_cma.nc", RuntimeError), # Valid netcdf, but invalid mgrid ], ) def test_raise_invalid_mgrid(mgrid_path: str, expected_exception): @@ -93,8 +92,7 @@ def test_run_with_hot_restart(): # base run vmec_output = vmecpp.run(vmec_input, verbose=False) - # now with hot restart - # (only a single multigrid step is supported) + # now with hot restart at a single multigrid step vmec_input.ns_array = vmec_input.ns_array[-1:] vmec_input.ftol_array = vmec_input.ftol_array[-1:] vmec_input.niter_array = vmec_input.niter_array[-1:] @@ -616,8 +614,6 @@ def test_vmec_input_validation(): # The test_file json may exclude fields that have default values, # while the parsed versions should have all fields populated. indata_dict_from_json = json.loads(vmec_input._to_cpp_vmecindata().to_json()) - # TODO(jurasic): iteration_style is not yet present in VmecInput, since there's only one option atm. - del indata_dict_from_json["iteration_style"] vmec_input_dict_from_json = json.loads(vmec_input.model_dump_json()) if not vmec_input.lasym: diff --git a/tests/test_input_data_consistency.py b/tests/test_input_data_consistency.py deleted file mode 100644 index f656e2a17..000000000 --- a/tests/test_input_data_consistency.py +++ /dev/null @@ -1,109 +0,0 @@ -# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH -# -# SPDX-License-Identifier: MIT -"""Guarantee that the public input files in the main repo (``vmecpp/test_data``) and the -instrumented copies used by the large integration tests -(``vmecpp_large_cpp_tests/test_data``) describe identical equilibria. - -The large-tests inputs carry an extra block of ``dump_*`` flags (and -``iter2_to_dump``) that make Fortran VMEC emit the per-step reference data the -large C++ tests compare against. Those flags are intentionally kept out of the -more public-facing inputs in the main repo. ``indata2json`` ignores them, so -the JSON representations must agree on every physics field. The ``mgrid_file`` -entry is an environment-specific path rather than a physics parameter and is -ignored. - -The check only runs when the ``vmecpp_large_cpp_tests`` checkout is available -(it is checked out next to the main sources in the integration CI; a checkout -elsewhere can be pointed at via ``VMECPP_LARGE_CPP_TESTS_TEST_DATA``). -""" - -import json -import os -from pathlib import Path - -import pytest - -from vmecpp import _util - -# tests/ live in the sources while the vmecpp module is installed separately, -# so locate the data via the path to this file (see tests/test_util.py). -REPO_ROOT = Path(__file__).parent.parent -MAIN_TEST_DATA = REPO_ROOT / "src" / "vmecpp" / "cpp" / "vmecpp" / "test_data" - -_LARGE_ENV = os.environ.get("VMECPP_LARGE_CPP_TESTS_TEST_DATA") -LARGE_TEST_DATA = ( - Path(_LARGE_ENV) - if _LARGE_ENV - else REPO_ROOT / "src" / "vmecpp" / "cpp" / "vmecpp_large_cpp_tests" / "test_data" -) - -# Keys that legitimately differ and carry no physics meaning. -IGNORED_KEYS = {"mgrid_file"} - - -def _overlapping_cases() -> list[str]: - if not LARGE_TEST_DATA.is_dir(): - return [] - prefix = "input." - main = {p.name[len(prefix) :] for p in MAIN_TEST_DATA.glob("input.*")} - large = {p.name[len(prefix) :] for p in LARGE_TEST_DATA.glob("input.*")} - return sorted(main & large) - - -def _indata_as_json(input_path: Path, work_dir: Path) -> dict: - """Convert a Fortran INDATA file to a JSON dict via indata2json.""" - work_dir.mkdir(parents=True, exist_ok=True) - with _util.change_working_directory_to(work_dir): - json_path = _util.indata_to_json(input_path) - with json_path.open() as json_file: - data = json.load(json_file) - for key in IGNORED_KEYS: - data.pop(key, None) - return data - - -_CASES = _overlapping_cases() -_LARGE_AVAILABLE = LARGE_TEST_DATA.is_dir() -_SKIP_REASON = ( - f"vmecpp_large_cpp_tests checkout not found at {LARGE_TEST_DATA}; set " - "VMECPP_LARGE_CPP_TESTS_TEST_DATA to its test_data directory to enable." -) - - -@pytest.mark.skipif(not _LARGE_AVAILABLE, reason=_SKIP_REASON) -def test_overlapping_cases_present(): - # Guard against silently testing nothing if the layout changes. - assert _CASES, ( - "Expected at least one input case present in both " - f"{MAIN_TEST_DATA} and {LARGE_TEST_DATA}." - ) - - -@pytest.mark.skipif(not _LARGE_AVAILABLE, reason=_SKIP_REASON) -@pytest.mark.parametrize("case", _CASES) -def test_input_files_are_consistent(case: str, tmp_path: Path): - main_json = _indata_as_json(MAIN_TEST_DATA / f"input.{case}", tmp_path / "main") - large_json = _indata_as_json(LARGE_TEST_DATA / f"input.{case}", tmp_path / "large") - assert main_json == large_json, ( - f"input.{case} differs between vmecpp/test_data and " - f"vmecpp_large_cpp_tests/test_data after indata2json conversion " - f"(ignoring {sorted(IGNORED_KEYS)}). The instrumented large-tests input " - "and the public input must describe the same equilibrium." - ) - - # The main C++ tests load the committed .json, so it must describe the - # same equilibrium as the Fortran input that the large-tests reference data - # is generated from. This closes the gap if input. and .json - # ever diverge within the main repo. - canonical_json_path = MAIN_TEST_DATA / f"{case}.json" - if canonical_json_path.is_file(): - with canonical_json_path.open() as canonical_file: - canonical_json = json.load(canonical_file) - for key in IGNORED_KEYS: - canonical_json.pop(key, None) - assert main_json == canonical_json, ( - f"{case}.json (loaded by the main C++ tests) differs from " - f"input.{case} after indata2json conversion (ignoring " - f"{sorted(IGNORED_KEYS)})." - ) diff --git a/tests/test_internal_gradient.py b/tests/test_internal_gradient.py new file mode 100644 index 000000000..16d26825e --- /dev/null +++ b/tests/test_internal_gradient.py @@ -0,0 +1,107 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# +# SPDX-License-Identifier: MIT +"""Tests for the unpreconditioned internal-basis gradient. + +VmecModel.evaluate(precondition=False) returns at the INVARIANT_RESIDUALS checkpoint, so +get_forces() yields the raw, unpreconditioned force: the gradient of VMEC's augmented +functional (MHD energy plus the spectral-condensation and lambda constraints) with +respect to the decomposed (internal-basis) state. This is the gradient an external +optimizer working in the internal basis needs. + +The preconditioned force (precondition=True) is the native solver's search direction and +points in a different direction; both vanish at the converged equilibrium. +""" + +from pathlib import Path + +import numpy as np +import pytest + +from vmecpp.cpp import _vmecpp # type: ignore + +SOLOVEV = Path(__file__).resolve().parents[1] / "examples" / "data" / "solovev.json" +CTH_LIKE = ( + Path(__file__).resolve().parents[1] + / "examples" + / "data" + / "cth_like_fixed_bdy.json" +) + + +def _model(ns: int = 11): + indata = _vmecpp.VmecINDATA.from_file(str(SOLOVEV)) + return _vmecpp.VmecModel.create(indata, ns) + + +def test_raw_force_differs_from_preconditioned(): + m = _model() + m.evaluate(2, 2, True) + f_prec = np.asarray(m.get_forces(), float) + m.evaluate(2, 2, False) + f_raw = np.asarray(m.get_forces(), float) + + assert np.all(np.isfinite(f_raw)) + assert np.linalg.norm(f_raw) > 0.0 + # The preconditioner is a non-trivial metric: the two vectors are different + # in direction, not just scale. + cos = np.dot(f_prec, f_raw) / (np.linalg.norm(f_prec) * np.linalg.norm(f_raw)) + assert abs(cos) < 0.99 + + +def test_raw_force_vanishes_at_equilibrium(): + m = _model() + m.evaluate(2, 2, False) + f_initial = np.linalg.norm(np.asarray(m.get_forces(), float)) + + m.solve() + m.evaluate(2, 2, False) + f_converged = np.linalg.norm(np.asarray(m.get_forces(), float)) + + # The augmented-functional gradient is the equilibrium residual: it drops by + # many orders of magnitude once the native solver has converged. + assert f_converged < 1e-6 * f_initial + + +def test_cold_start_is_excluded(): + # evaluate(1, 2) is the cold-start special case (forces initialised to 1.0); + # the raw-gradient path uses iter1 >= 2, where the force is well defined. + m = _model() + m.evaluate(2, 2, False) + assert np.all(np.isfinite(np.asarray(m.get_forces(), float))) + + +@pytest.fixture(scope="module") +def force_histories(): + indata = _vmecpp.VmecINDATA.from_file(str(CTH_LIKE)) + reference = _vmecpp.VmecModel.create(indata, 11) + reference.solve() + low_residual_state = np.asarray(reference.get_state(), float).copy() + + model = _vmecpp.VmecModel.create(indata, 11) + high_residual_state = np.asarray(model.get_state(), float).copy() + model.evaluate(2, 2, False) + high_after_high = np.asarray(model.get_forces(), float).copy() + + model.set_state(np.ascontiguousarray(low_residual_state)) + model.evaluate(2, 2, False) + low_after_high = np.asarray(model.get_forces(), float).copy() + model.evaluate(2, 2, False) + low_after_low = np.asarray(model.get_forces(), float).copy() + + model.set_state(np.ascontiguousarray(high_residual_state)) + model.evaluate(2, 2, False) + high_after_low = np.asarray(model.get_forces(), float).copy() + + return high_after_high, high_after_low, low_after_high, low_after_low + + +def test_raw_force_is_independent_of_high_residual_history(force_histories): + _, _, low_after_high, low_after_low = force_histories + np.testing.assert_array_equal(low_after_high, low_after_low) + + +def test_raw_force_is_independent_of_low_residual_history(force_histories): + high_after_high, high_after_low, _, _ = force_histories + np.testing.assert_array_equal(high_after_high, high_after_low) diff --git a/tests/test_iteration.py b/tests/test_iteration.py index 8932ab092..f8699daca 100644 --- a/tests/test_iteration.py +++ b/tests/test_iteration.py @@ -208,6 +208,172 @@ def test_alternative_styles_converge_cma(): assert results["parvmec"].restarts == 0 +def test_native_parvmec_matches_python_parvmec(): + """The native C++ PARVMEC control reproduces the ported Python PARVMEC control. + + Vmec::SolveEquilibriumLoop runs the PARVMEC time-step control when + indata.iteration_style == PARVMEC; it must match the Python parvmec loop on the + same forward model step for step, the analog of + test_python_iteration_matches_cpp_restart_path for the default style. + """ + cpp_indata = _single_resolution_indata("cma", 72, ftol=1.0e-16, niter=200) + cpp_indata.iteration_style = _vmecpp.IterationStyle.PARVMEC + + reference = _vmecpp.VmecModel.create(cpp_indata, 72) + reference.solve() + + model = _vmecpp.VmecModel.create(cpp_indata, 72) + result = vmecpp.solve_equilibrium(model, style="parvmec") + + assert not result.failed + np.testing.assert_array_equal( + np.asarray(result.restart_reasons), np.asarray(reference.restart_reasons) + ) + cpp_r = np.asarray(reference.force_residual_r) + py_r = np.asarray(result.force_residual_r) + # The two loops make identical control decisions (restart_reasons match + # exactly above), so the force-residual traces agree up to floating-point + # accumulation of the control arithmetic: ~1e-9 relative early, growing to + # only a few 1e-9 by the deep-convergence tail (max abs ~6e-13). + np.testing.assert_allclose(py_r[:50], cpp_r[:50], rtol=1.0e-9, atol=1e-15) + np.testing.assert_allclose(py_r, cpp_r, rtol=1.0e-8, atol=1e-12) + + +def test_run_honors_iteration_style_flag(): + """vmecpp.run() honors the iteration_style input flag through the native solver. + + The two styles take different iteration paths to the same equilibrium, so the flag + must survive the VmecInput -> C++ round-trip and reach Vmec::SolveEquilibriumLoop. + """ + base = vmecpp.VmecInput.from_file(TEST_DATA / "cma.json").model_copy( + update={ + "ns_array": np.array([51], dtype=np.int64), + "ftol_array": np.array([1.0e-12]), + "niter_array": np.array([3000], dtype=np.int64), + } + ) + outputs = {} + for style in ("vmec_8_52", "parvmec"): + inp = base.model_copy(update={"iteration_style": style}) + assert inp.iteration_style == style + assert inp._to_cpp_vmecindata().iteration_style == getattr( + _vmecpp.IterationStyle, style.upper() + ) + outputs[style] = vmecpp.run(inp, max_threads=1, verbose=False) + # Same physics regardless of the iteration scheme: the two styles take + # different paths to the same equilibrium, so global geometry, pressure, and + # magnetic-field quantities must agree, not just the volume. (Local profiles + # such as the iota profile are path-sensitive at finite ftol, so they are not + # asserted here; the exact-reference check against PARVMEC covers those.) + ref = outputs["vmec_8_52"].wout + par = outputs["parvmec"].wout + assert par.volume_p == pytest.approx(ref.volume_p, rel=1.0e-9) # geometry + assert par.aspect == pytest.approx(ref.aspect, rel=1.0e-9) # geometry + assert par.betatotal == pytest.approx(ref.betatotal, rel=1.0e-9) # beta + assert par.wp == pytest.approx(ref.wp, rel=1.0e-9) # pressure energy + assert par.wb == pytest.approx(ref.wb, rel=1.0e-5) # magnetic energy + + +@pytest.mark.parametrize("case", ["cth_like_fixed_bdy", "solovev"]) +def test_parvmec_matches_parvmec_reference(case): + """The PARVMEC iteration style reproduces the ORNL-Fusion/PARVMEC wout. + + The committed reference wouts match fresh output from the Fortran ORNL- + Fusion/PARVMEC to machine precision (volume/aspect ~1e-15, geometry and iota ~1e-7 + for cth_like, ~0 for solovev), so this pins the new iteration style to the + independent parallel implementation, not only to the vmec_8_52 control. + """ + reference = vmecpp.VmecWOut.from_wout_file(TEST_DATA / f"wout_{case}.nc") + base = vmecpp.VmecInput.from_file(TEST_DATA / f"{case}.json") + result = vmecpp.run( + base.model_copy(update={"iteration_style": "parvmec"}), + max_threads=1, + verbose=False, + ) + w = result.wout + + assert w.volume_p == pytest.approx(reference.volume_p, rel=1.0e-9) + assert w.aspect == pytest.approx(reference.aspect, rel=1.0e-9) + np.testing.assert_allclose(w.iotaf, reference.iotaf, rtol=1.0e-5, atol=1.0e-6) + np.testing.assert_allclose(w.rmnc, reference.rmnc, rtol=1.0e-5, atol=1.0e-6) + np.testing.assert_allclose(w.zmns, reference.zmns, rtol=1.0e-5, atol=1.0e-6) + np.testing.assert_allclose(w.bmnc, reference.bmnc, rtol=1.0e-5, atol=1.0e-6) + + +def test_parvmec_follows_ornl_parvmec_trace(): + """The native parvmec control follows ORNL PARVMEC's per-iteration residual trace. + + cth_like_fixed_bdy has a well-posed linear guess (no cold-start axis reguess) and + converges without a restart, so the iteration is numerically stable: the native + parvmec time-step control reproduces the committed ORNL-Fusion/PARVMEC force + residuals step-for-step. The first several steps agree to machine precision; the + difference then settles into a bounded ~1e-4 relative drift (floating-point + accumulation between two independent implementations) that does not grow, and both + reach force balance in the same number of steps. This pins the control to the + Fortran PARVMEC itself, not only to the vmec_8_52 baseline or the Python port. + + A step-for-step match is only meaningful on a non-chaotic case. Inputs that trip the + parvmec-specific restart / reguess logic have violent transients (fsqr ~ 1e4) on + which the ~1e-13 floating-point difference between any two implementations amplifies + to order unity within a couple of steps; those converge to the same equilibrium but + cannot be compared trace-for-trace. The divergence between the two styles on such a + case is covered by test_iteration_styles_diverge_on_stiff_case. + """ + ref = np.loadtxt( + TEST_DATA / "parvmec_cth_like_fixed_bdy_force_trace.csv", + delimiter=",", + skiprows=5, + ) + ref_fsqr, ref_fsqz, ref_fsql = ref[:, 1], ref[:, 2], ref[:, 3] + + cpp_indata = _single_resolution_indata("cth_like_fixed_bdy", 25, 1.0e-6, 25000) + cpp_indata.iteration_style = _vmecpp.IterationStyle.PARVMEC + model = _vmecpp.VmecModel.create(cpp_indata, 25) + model.solve() + fsqr = np.asarray(model.force_residual_r) + fsqz = np.asarray(model.force_residual_z) + fsql = np.asarray(model.force_residual_lambda) + + # Same number of steps to force balance (up to the last step at finite ftol). + assert abs(len(fsqr) - len(ref_fsqr)) <= 2 + n = min(len(fsqr), len(ref_fsqr)) + + # Bit-faithful for the first several steps. + np.testing.assert_allclose(fsqr[:6], ref_fsqr[:6], rtol=1.0e-9, atol=1.0e-14) + np.testing.assert_allclose(fsqz[:6], ref_fsqz[:6], rtol=1.0e-9, atol=1.0e-14) + np.testing.assert_allclose(fsql[:6], ref_fsql[:6], rtol=1.0e-9, atol=1.0e-14) + + # Tracks ORNL PARVMEC over the whole solve; the bounded drift never turns into a + # flow-control divergence (which would show up as a discrete jump, not a drift). + np.testing.assert_allclose(fsqr[:n], ref_fsqr[:n], rtol=3.0e-3, atol=1.0e-9) + np.testing.assert_allclose(fsqz[:n], ref_fsqz[:n], rtol=3.0e-3, atol=1.0e-9) + np.testing.assert_allclose(fsql[:n], ref_fsql[:n], rtol=3.0e-3, atol=1.0e-9) + + +def test_iteration_styles_diverge_on_stiff_case(): + """vmec_8_52 and parvmec take measurably different paths on a restart-triggering + case. + + cma at ns=72 has a cold-start axis reguess and a violent initial transient that + trips the time-step-control restart logic. The two styles' restart bookkeeping and + force-residual progressions differ -- the reason the parvmec control exists -- even + though both converge to the same equilibrium. This is the flow-control difference + that the trace test cannot pin to ORNL PARVMEC directly (the case is chaotic). + """ + traces = {} + for style in ("vmec_8_52", "parvmec"): + cpp_indata = _single_resolution_indata("cma", 72, 1.0e-11, 200) + cpp_indata.iteration_style = getattr(_vmecpp.IterationStyle, style.upper()) + model = _vmecpp.VmecModel.create(cpp_indata, 72) + model.solve() + traces[style] = np.asarray(model.force_residual_r) + + r852, rpar = traces["vmec_8_52"], traces["parvmec"] + n = min(len(r852), len(rpar)) + # The two controls share only a prefix, then take genuinely different paths. + assert not np.allclose(r852[:n], rpar[:n], rtol=1.0e-6, atol=1.0e-12) + + def test_callback_records_iteration_state(): """The per-iteration callback fires once per recorded iteration with a consistent IterationState snapshot of the convergence / flow-control state. diff --git a/tests/test_lambda_resolution.py b/tests/test_lambda_resolution.py new file mode 100644 index 000000000..9bfc404b9 --- /dev/null +++ b/tests/test_lambda_resolution.py @@ -0,0 +1,79 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# SPDX-License-Identifier: MIT +"""Tests for an independent lambda Fourier resolution. + +``mpol_geometry`` / ``ntor_geometry`` cap the geometry (R, Z) resolution below +the working ``mpol`` / ``ntor`` while lambda keeps the full resolution. The +tests drive cma with the geometry capped below its resolution and check that the +capped modes are frozen at zero, that lambda is still resolved above the cap, and +that a cap equal to the working resolution is a no-op. +""" + +from pathlib import Path + +import numpy as np + +import vmecpp + +REPO_ROOT = Path(__file__).parent.parent +TEST_DATA_DIR = REPO_ROOT / "src" / "vmecpp" / "cpp" / "vmecpp" / "test_data" + + +def _modes_first(array: np.ndarray, mnmax: int) -> np.ndarray: + """Return ``array`` with the Fourier-mode axis (length ``mnmax``) first.""" + a = np.asarray(array, dtype=float) + return a if a.shape[0] == mnmax else a.T + + +def _cma(mpol_geometry: int = -1, ntor_geometry: int = -1) -> vmecpp.VmecInput: + """Cma capped at (mpol_geometry, ntor_geometry), run for a few iterations.""" + return vmecpp.VmecInput.from_file(TEST_DATA_DIR / "cma.json").model_copy( + update={ + "mpol_geometry": mpol_geometry, + "ntor_geometry": ntor_geometry, + "ns_array": np.array([25], dtype=np.int64), + "ftol_array": np.array([1e-12]), + "niter_array": np.array([80], dtype=np.int64), + "return_outputs_even_if_not_converged": True, + } + ) + + +def test_geometry_cap_at_full_resolution_is_a_noop(): + """A geometry cap equal to the working resolution must not change the run.""" + baseline = vmecpp.run(_cma(), max_threads=1).wout # mpol_geometry unset (-1) + full = _cma() + capped = vmecpp.run( + _cma(mpol_geometry=full.mpol, ntor_geometry=full.ntor), max_threads=1 + ).wout + + for name in ("rmnc", "zmns", "lmns"): + np.testing.assert_array_equal( + np.asarray(getattr(capped, name)), np.asarray(getattr(baseline, name)) + ) + assert capped.niter == baseline.niter + + +def test_geometry_frozen_while_lambda_is_resolved(): + """Above the geometry cap, R/Z stay at zero while lambda keeps content.""" + mpol_geometry, ntor_geometry = 3, 4 + inp = _cma(mpol_geometry=mpol_geometry, ntor_geometry=ntor_geometry) + wout = vmecpp.run(inp, max_threads=1).wout + + xm = np.asarray(wout.xm) + xn = np.asarray(wout.xn) + mnmax = len(xm) + # Modes above the geometry cap: poloidal m >= cap or toroidal |n| > cap. + above_cap = (xm >= mpol_geometry) | (np.abs(xn) // inp.nfp > ntor_geometry) + assert above_cap.any() + + rmnc = _modes_first(wout.rmnc, mnmax)[above_cap] + zmns = _modes_first(wout.zmns, mnmax)[above_cap] + lmns = _modes_first(wout.lmns, mnmax)[above_cap] + + # Geometry above the cap is held at exactly zero. + assert np.max(np.abs(rmnc)) == 0.0 + assert np.max(np.abs(zmns)) == 0.0 + # Lambda above the cap is resolved and carries non-trivial content. + assert np.max(np.abs(lmns)) > 1e-10 diff --git a/tests/test_preconditioner.py b/tests/test_preconditioner.py new file mode 100644 index 000000000..7009dee8a --- /dev/null +++ b/tests/test_preconditioner.py @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: 2024-present Proxima Fusion GmbH +# +# +# SPDX-License-Identifier: MIT +"""VmecModel.apply_preconditioner exposes VMEC's preconditioner as an operator. + +The preconditioner M^-1 is VMEC's hand-built approximate inverse Hessian. The native +solver applies it to the raw force to get its search direction, so +apply_preconditioner(raw force) must equal the preconditioned force exactly. The +operator is linear and, once assembled (via evaluate(precondition=True)), does not +depend on the current state, so it can be reused as a frozen preconditioner for +Krylov/quasi-Newton solvers. +""" + +from pathlib import Path + +import numpy as np + +try: + from vmecpp.cpp import _vmecpp +except ImportError: + import _vmecpp + +SOLOVEV = Path(__file__).resolve().parents[1] / "examples" / "data" / "solovev.json" + + +def _model(ns: int = 11): + return _vmecpp.VmecModel.create(_vmecpp.VmecINDATA.from_file(str(SOLOVEV)), ns) + + +def test_preconditioner_matches_native_search_direction(): + m = _model() + m.evaluate(2, 2, True) # assemble preconditioner + preconditioned force + f_prec = np.asarray(m.get_forces(), float) + m.evaluate(2, 2, False) # raw force (does not reassemble) + f_raw = np.asarray(m.get_forces(), float) + minv_fraw = np.asarray(m.apply_preconditioner(f_raw), float) + assert np.linalg.norm(minv_fraw - f_prec) <= 1e-12 * np.linalg.norm(f_prec) + + +def test_preconditioner_is_linear_and_finite(): + m = _model() + m.evaluate(2, 2, True) + rng = np.random.default_rng(0) + v = np.ascontiguousarray(rng.standard_normal(np.asarray(m.get_state()).size)) + mv = np.asarray(m.apply_preconditioner(v), float) + m2v = np.asarray(m.apply_preconditioner(np.ascontiguousarray(2.0 * v)), float) + assert np.all(np.isfinite(mv)) + assert np.linalg.norm(m2v - 2.0 * mv) <= 1e-12 * np.linalg.norm(mv) + + +def test_preconditioner_state_invariant_after_assembly(): + m = _model() + m.evaluate(2, 2, True) + rng = np.random.default_rng(1) + x = np.asarray(m.get_state(), float) + v = np.ascontiguousarray(rng.standard_normal(x.size)) + mv0 = np.asarray(m.apply_preconditioner(v), float) + # Move to a different state and raw-evaluate (no reassembly). + m.set_state(np.ascontiguousarray(x + 0.01 * rng.standard_normal(x.size))) + m.evaluate(2, 2, False) + mv1 = np.asarray(m.apply_preconditioner(v), float) + assert np.linalg.norm(mv1 - mv0) <= 1e-12 * np.linalg.norm(mv0)